changeset 6:d879a30556f8

re-intital commit
author Henrik Ekeus <hekeus@eecs.qmul.ac.uk>
date Wed, 25 Jan 2012 16:30:07 +0000
parents ae8a02700c9b
children 38f63c4300d7
files MelodyTriangle.plist MelodyTriangle.xcodeproj/hekeus.mode1v3 MelodyTriangle.xcodeproj/hekeus.pbxuser MelodyTriangle.xcodeproj/project.pbxproj bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/GLUT bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Headers/copy.h bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Headers/extrude.h bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Headers/glsmap.h bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Headers/glsmapint.h bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Headers/glut.h bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Headers/glutbitmap.h bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Headers/glutf90.h bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Headers/glutstroke.h bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Headers/gutil.h bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Headers/intersect.h bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Headers/port.h bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Headers/rot.h bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Headers/segment.h bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Headers/tube.h bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Headers/tube_gc.h bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Headers/vvector.h bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Resources/Caution.tiff bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Resources/English.lproj/GLUT.nib/classes.nib bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Resources/English.lproj/GLUT.nib/info.nib bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Resources/English.lproj/GLUT.nib/objects.nib bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Resources/English.lproj/GLUTClipboard.nib/classes.nib bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Resources/English.lproj/GLUTClipboard.nib/info.nib bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Resources/English.lproj/GLUTClipboard.nib/objects.nib bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Resources/English.lproj/GLUTPreferences.nib/classes.nib bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Resources/English.lproj/GLUTPreferences.nib/info.nib bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Resources/English.lproj/GLUTPreferences.nib/objects.nib bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Resources/English.lproj/GLUTUI.strings bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Resources/English.lproj/InfoPlist.strings bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Resources/Info.plist bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Resources/blankCursor.tiff bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Resources/bottomCursor.tiff bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Resources/bottomleftCursor.tiff bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Resources/bottomrightCursor.tiff bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Resources/crossCursor.tiff bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Resources/cycleCursor.tiff bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Resources/destroyCursor.tiff bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Resources/fingerCursor.tiff bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Resources/helpCursor.tiff bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Resources/leftCursor.tiff bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Resources/leftRightCursor.tiff bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Resources/rightArrowCursor.tiff bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Resources/rightCursor.tiff bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Resources/sprayCursor.tiff bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Resources/topCursor.tiff bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Resources/topleftCursor.tiff bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Resources/toprightCursor.tiff bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Resources/upDownCursor.tiff bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Resources/waitCursor.tiff bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/GLUT bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Headers/copy.h bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Headers/extrude.h bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Headers/glsmap.h bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Headers/glsmapint.h bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Headers/glut.h bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Headers/glutbitmap.h bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Headers/glutf90.h bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Headers/glutstroke.h bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Headers/gutil.h bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Headers/intersect.h bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Headers/port.h bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Headers/rot.h bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Headers/segment.h bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Headers/tube.h bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Headers/tube_gc.h bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Headers/vvector.h bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Resources/Caution.tiff bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Resources/English.lproj/GLUT.nib/classes.nib bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Resources/English.lproj/GLUT.nib/info.nib bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Resources/English.lproj/GLUT.nib/objects.nib bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Resources/English.lproj/GLUTClipboard.nib/classes.nib bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Resources/English.lproj/GLUTClipboard.nib/info.nib bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Resources/English.lproj/GLUTClipboard.nib/objects.nib bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Resources/English.lproj/GLUTPreferences.nib/classes.nib bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Resources/English.lproj/GLUTPreferences.nib/info.nib bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Resources/English.lproj/GLUTPreferences.nib/objects.nib bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Resources/English.lproj/GLUTUI.strings bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Resources/English.lproj/InfoPlist.strings bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Resources/Info.plist bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Resources/blankCursor.tiff bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Resources/bottomCursor.tiff bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Resources/bottomleftCursor.tiff bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Resources/bottomrightCursor.tiff bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Resources/crossCursor.tiff bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Resources/cycleCursor.tiff bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Resources/destroyCursor.tiff bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Resources/fingerCursor.tiff bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Resources/helpCursor.tiff bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Resources/leftCursor.tiff bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Resources/leftRightCursor.tiff bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Resources/rightArrowCursor.tiff bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Resources/rightCursor.tiff bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Resources/sprayCursor.tiff bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Resources/topCursor.tiff bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Resources/topleftCursor.tiff bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Resources/toprightCursor.tiff bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Resources/upDownCursor.tiff bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Resources/waitCursor.tiff bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/GLUT bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Headers/copy.h bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Headers/extrude.h bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Headers/glsmap.h bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Headers/glsmapint.h bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Headers/glut.h bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Headers/glutbitmap.h bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Headers/glutf90.h bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Headers/glutstroke.h bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Headers/gutil.h bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Headers/intersect.h bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Headers/port.h bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Headers/rot.h bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Headers/segment.h bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Headers/tube.h bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Headers/tube_gc.h bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Headers/vvector.h bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Resources/Caution.tiff bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Resources/English.lproj/GLUT.nib/classes.nib bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Resources/English.lproj/GLUT.nib/info.nib bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Resources/English.lproj/GLUT.nib/objects.nib bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Resources/English.lproj/GLUTClipboard.nib/classes.nib bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Resources/English.lproj/GLUTClipboard.nib/info.nib bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Resources/English.lproj/GLUTClipboard.nib/objects.nib bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Resources/English.lproj/GLUTPreferences.nib/classes.nib bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Resources/English.lproj/GLUTPreferences.nib/info.nib bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Resources/English.lproj/GLUTPreferences.nib/objects.nib bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Resources/English.lproj/GLUTUI.strings bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Resources/English.lproj/InfoPlist.strings bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Resources/Info.plist bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Resources/blankCursor.tiff bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Resources/bottomCursor.tiff bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Resources/bottomleftCursor.tiff bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Resources/bottomrightCursor.tiff bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Resources/crossCursor.tiff bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Resources/cycleCursor.tiff bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Resources/destroyCursor.tiff bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Resources/fingerCursor.tiff bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Resources/helpCursor.tiff bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Resources/leftCursor.tiff bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Resources/leftRightCursor.tiff bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Resources/rightArrowCursor.tiff bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Resources/rightCursor.tiff bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Resources/sprayCursor.tiff bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Resources/topCursor.tiff bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Resources/topleftCursor.tiff bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Resources/toprightCursor.tiff bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Resources/upDownCursor.tiff bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Resources/waitCursor.tiff bin/MelodyTriangle.app/Contents/Info.plist bin/MelodyTriangle.app/Contents/MacOS/MelodyTriangle bin/MelodyTriangle.app/Contents/MacOS/libfmodex.dylib bin/MelodyTriangle.app/Contents/PkgInfo src/Voice.cpp src/Voice.h src/main.cpp src/melodyTriangle.cpp src/melodyTriangle.h
diffstat 160 files changed, 15675 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MelodyTriangle.plist	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>CFBundleDevelopmentRegion</key>
+	<string>English</string>
+	<key>CFBundleExecutable</key>
+	<string>${EXECUTABLE_NAME}</string>
+	<key>CFBundleIdentifier</key>
+	<string>com.yourcompany.openFrameworks</string>
+	<key>CFBundleInfoDictionaryVersion</key>
+	<string>6.0</string>
+	<key>CFBundlePackageType</key>
+	<string>APPL</string>
+	<key>CFBundleSignature</key>
+	<string>????</string>
+	<key>CFBundleVersion</key>
+	<string>1.0</string>
+</dict>
+</plist>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MelodyTriangle.xcodeproj/hekeus.mode1v3	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,1452 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>ActivePerspectiveName</key>
+	<string>Project</string>
+	<key>AllowedModules</key>
+	<array>
+		<dict>
+			<key>BundleLoadPath</key>
+			<string></string>
+			<key>MaxInstances</key>
+			<string>n</string>
+			<key>Module</key>
+			<string>PBXSmartGroupTreeModule</string>
+			<key>Name</key>
+			<string>Groups and Files Outline View</string>
+		</dict>
+		<dict>
+			<key>BundleLoadPath</key>
+			<string></string>
+			<key>MaxInstances</key>
+			<string>n</string>
+			<key>Module</key>
+			<string>PBXNavigatorGroup</string>
+			<key>Name</key>
+			<string>Editor</string>
+		</dict>
+		<dict>
+			<key>BundleLoadPath</key>
+			<string></string>
+			<key>MaxInstances</key>
+			<string>n</string>
+			<key>Module</key>
+			<string>XCTaskListModule</string>
+			<key>Name</key>
+			<string>Task List</string>
+		</dict>
+		<dict>
+			<key>BundleLoadPath</key>
+			<string></string>
+			<key>MaxInstances</key>
+			<string>n</string>
+			<key>Module</key>
+			<string>XCDetailModule</string>
+			<key>Name</key>
+			<string>File and Smart Group Detail Viewer</string>
+		</dict>
+		<dict>
+			<key>BundleLoadPath</key>
+			<string></string>
+			<key>MaxInstances</key>
+			<string>1</string>
+			<key>Module</key>
+			<string>PBXBuildResultsModule</string>
+			<key>Name</key>
+			<string>Detailed Build Results Viewer</string>
+		</dict>
+		<dict>
+			<key>BundleLoadPath</key>
+			<string></string>
+			<key>MaxInstances</key>
+			<string>1</string>
+			<key>Module</key>
+			<string>PBXProjectFindModule</string>
+			<key>Name</key>
+			<string>Project Batch Find Tool</string>
+		</dict>
+		<dict>
+			<key>BundleLoadPath</key>
+			<string></string>
+			<key>MaxInstances</key>
+			<string>n</string>
+			<key>Module</key>
+			<string>XCProjectFormatConflictsModule</string>
+			<key>Name</key>
+			<string>Project Format Conflicts List</string>
+		</dict>
+		<dict>
+			<key>BundleLoadPath</key>
+			<string></string>
+			<key>MaxInstances</key>
+			<string>n</string>
+			<key>Module</key>
+			<string>PBXBookmarksModule</string>
+			<key>Name</key>
+			<string>Bookmarks Tool</string>
+		</dict>
+		<dict>
+			<key>BundleLoadPath</key>
+			<string></string>
+			<key>MaxInstances</key>
+			<string>n</string>
+			<key>Module</key>
+			<string>PBXClassBrowserModule</string>
+			<key>Name</key>
+			<string>Class Browser</string>
+		</dict>
+		<dict>
+			<key>BundleLoadPath</key>
+			<string></string>
+			<key>MaxInstances</key>
+			<string>n</string>
+			<key>Module</key>
+			<string>PBXCVSModule</string>
+			<key>Name</key>
+			<string>Source Code Control Tool</string>
+		</dict>
+		<dict>
+			<key>BundleLoadPath</key>
+			<string></string>
+			<key>MaxInstances</key>
+			<string>n</string>
+			<key>Module</key>
+			<string>PBXDebugBreakpointsModule</string>
+			<key>Name</key>
+			<string>Debug Breakpoints Tool</string>
+		</dict>
+		<dict>
+			<key>BundleLoadPath</key>
+			<string></string>
+			<key>MaxInstances</key>
+			<string>n</string>
+			<key>Module</key>
+			<string>XCDockableInspector</string>
+			<key>Name</key>
+			<string>Inspector</string>
+		</dict>
+		<dict>
+			<key>BundleLoadPath</key>
+			<string></string>
+			<key>MaxInstances</key>
+			<string>n</string>
+			<key>Module</key>
+			<string>PBXOpenQuicklyModule</string>
+			<key>Name</key>
+			<string>Open Quickly Tool</string>
+		</dict>
+		<dict>
+			<key>BundleLoadPath</key>
+			<string></string>
+			<key>MaxInstances</key>
+			<string>1</string>
+			<key>Module</key>
+			<string>PBXDebugSessionModule</string>
+			<key>Name</key>
+			<string>Debugger</string>
+		</dict>
+		<dict>
+			<key>BundleLoadPath</key>
+			<string></string>
+			<key>MaxInstances</key>
+			<string>1</string>
+			<key>Module</key>
+			<string>PBXDebugCLIModule</string>
+			<key>Name</key>
+			<string>Debug Console</string>
+		</dict>
+		<dict>
+			<key>BundleLoadPath</key>
+			<string></string>
+			<key>MaxInstances</key>
+			<string>n</string>
+			<key>Module</key>
+			<string>XCSnapshotModule</string>
+			<key>Name</key>
+			<string>Snapshots Tool</string>
+		</dict>
+	</array>
+	<key>BundlePath</key>
+	<string>/Developer/Library/PrivateFrameworks/DevToolsInterface.framework/Resources</string>
+	<key>Description</key>
+	<string>DefaultDescriptionKey</string>
+	<key>DockingSystemVisible</key>
+	<false/>
+	<key>Extension</key>
+	<string>mode1v3</string>
+	<key>FavBarConfig</key>
+	<dict>
+		<key>PBXProjectModuleGUID</key>
+		<string>C859AFF9140D23E1002C5ACF</string>
+		<key>XCBarModuleItemNames</key>
+		<dict/>
+		<key>XCBarModuleItems</key>
+		<array/>
+	</dict>
+	<key>FirstTimeWindowDisplayed</key>
+	<false/>
+	<key>Identifier</key>
+	<string>com.apple.perspectives.project.mode1v3</string>
+	<key>MajorVersion</key>
+	<integer>33</integer>
+	<key>MinorVersion</key>
+	<integer>0</integer>
+	<key>Name</key>
+	<string>Default</string>
+	<key>Notifications</key>
+	<array/>
+	<key>OpenEditors</key>
+	<array>
+		<dict>
+			<key>Content</key>
+			<dict>
+				<key>PBXProjectModuleGUID</key>
+				<string>C84FFCE814CDB8BC00D92A44</string>
+				<key>PBXProjectModuleLabel</key>
+				<string>melodyTriangle.cpp</string>
+				<key>PBXSplitModuleInNavigatorKey</key>
+				<dict>
+					<key>Split0</key>
+					<dict>
+						<key>PBXProjectModuleGUID</key>
+						<string>C84FFCEE14CDB9DE00D92A44</string>
+						<key>PBXProjectModuleLabel</key>
+						<string>melodyTriangle.cpp</string>
+						<key>_historyCapacity</key>
+						<integer>0</integer>
+						<key>bookmark</key>
+						<string>C8D33D0714D0645600191D50</string>
+						<key>history</key>
+						<array>
+							<string>C858DABD14D0643D0009C9DF</string>
+						</array>
+					</dict>
+					<key>SplitCount</key>
+					<string>1</string>
+				</dict>
+				<key>StatusBarVisibility</key>
+				<true/>
+			</dict>
+			<key>Geometry</key>
+			<dict>
+				<key>Frame</key>
+				<string>{{0, 20}, {971, 633}}</string>
+				<key>PBXModuleWindowStatusBarHidden2</key>
+				<false/>
+				<key>RubberWindowFrame</key>
+				<string>293 60 971 674 0 0 1280 778 </string>
+			</dict>
+		</dict>
+	</array>
+	<key>PerspectiveWidths</key>
+	<array>
+		<integer>-1</integer>
+		<integer>-1</integer>
+	</array>
+	<key>Perspectives</key>
+	<array>
+		<dict>
+			<key>ChosenToolbarItems</key>
+			<array>
+				<string>active-combo-popup</string>
+				<string>action</string>
+				<string>NSToolbarFlexibleSpaceItem</string>
+				<string>debugger-enable-breakpoints</string>
+				<string>build-and-go</string>
+				<string>com.apple.ide.PBXToolbarStopButton</string>
+				<string>get-info</string>
+				<string>NSToolbarFlexibleSpaceItem</string>
+				<string>com.apple.pbx.toolbar.searchfield</string>
+			</array>
+			<key>ControllerClassBaseName</key>
+			<string></string>
+			<key>IconName</key>
+			<string>WindowOfProjectWithEditor</string>
+			<key>Identifier</key>
+			<string>perspective.project</string>
+			<key>IsVertical</key>
+			<false/>
+			<key>Layout</key>
+			<array>
+				<dict>
+					<key>ContentConfiguration</key>
+					<dict>
+						<key>PBXBottomSmartGroupGIDs</key>
+						<array>
+							<string>1C37FBAC04509CD000000102</string>
+							<string>1C37FAAC04509CD000000102</string>
+							<string>1C37FABC05509CD000000102</string>
+							<string>1C37FABC05539CD112110102</string>
+							<string>E2644B35053B69B200211256</string>
+							<string>1C37FABC04509CD000100104</string>
+							<string>1CC0EA4004350EF90044410B</string>
+							<string>1CC0EA4004350EF90041110B</string>
+						</array>
+						<key>PBXProjectModuleGUID</key>
+						<string>1CE0B1FE06471DED0097A5F4</string>
+						<key>PBXProjectModuleLabel</key>
+						<string>Files</string>
+						<key>PBXProjectStructureProvided</key>
+						<string>yes</string>
+						<key>PBXSmartGroupTreeModuleColumnData</key>
+						<dict>
+							<key>PBXSmartGroupTreeModuleColumnWidthsKey</key>
+							<array>
+								<real>186</real>
+							</array>
+							<key>PBXSmartGroupTreeModuleColumnsKey_v4</key>
+							<array>
+								<string>MainColumn</string>
+							</array>
+						</dict>
+						<key>PBXSmartGroupTreeModuleOutlineStateKey_v7</key>
+						<dict>
+							<key>PBXSmartGroupTreeModuleOutlineStateExpansionKey</key>
+							<array>
+								<string>E4B69B4A0A3A1720003C02F2</string>
+								<string>E4B69E1C0A3A1BDC003C02F2</string>
+								<string>1C37FBAC04509CD000000102</string>
+								<string>1C37FABC05509CD000000102</string>
+							</array>
+							<key>PBXSmartGroupTreeModuleOutlineStateSelectionKey</key>
+							<array>
+								<array>
+									<integer>9</integer>
+									<integer>3</integer>
+									<integer>0</integer>
+								</array>
+							</array>
+							<key>PBXSmartGroupTreeModuleOutlineStateVisibleRectKey</key>
+							<string>{{0, 0}, {186, 616}}</string>
+						</dict>
+						<key>PBXTopSmartGroupGIDs</key>
+						<array/>
+						<key>XCIncludePerspectivesSwitch</key>
+						<true/>
+						<key>XCSharingToken</key>
+						<string>com.apple.Xcode.GFSharingToken</string>
+					</dict>
+					<key>GeometryConfiguration</key>
+					<dict>
+						<key>Frame</key>
+						<string>{{0, 0}, {203, 634}}</string>
+						<key>GroupTreeTableConfiguration</key>
+						<array>
+							<string>MainColumn</string>
+							<real>186</real>
+						</array>
+						<key>RubberWindowFrame</key>
+						<string>39 59 1100 675 0 0 1280 778 </string>
+					</dict>
+					<key>Module</key>
+					<string>PBXSmartGroupTreeModule</string>
+					<key>Proportion</key>
+					<string>203pt</string>
+				</dict>
+				<dict>
+					<key>Dock</key>
+					<array>
+						<dict>
+							<key>BecomeActive</key>
+							<true/>
+							<key>ContentConfiguration</key>
+							<dict>
+								<key>PBXProjectModuleGUID</key>
+								<string>1CE0B20306471E060097A5F4</string>
+								<key>PBXProjectModuleLabel</key>
+								<string>melodyTriangle.cpp</string>
+								<key>PBXSplitModuleInNavigatorKey</key>
+								<dict>
+									<key>Split0</key>
+									<dict>
+										<key>PBXProjectModuleGUID</key>
+										<string>1CE0B20406471E060097A5F4</string>
+										<key>PBXProjectModuleLabel</key>
+										<string>melodyTriangle.cpp</string>
+										<key>_historyCapacity</key>
+										<integer>0</integer>
+										<key>bookmark</key>
+										<string>C8D33D0414D0645600191D50</string>
+										<key>history</key>
+										<array>
+											<string>C8E1DA3A14BF6043000A0193</string>
+											<string>C85286B614C4C91A00AE6996</string>
+											<string>C852882A14CC47A200AE6996</string>
+											<string>C852882B14CC47A200AE6996</string>
+											<string>C852882C14CC47A200AE6996</string>
+											<string>C84FFCD314CDB71400D92A44</string>
+											<string>C84FFD2414CEF9C400D92A44</string>
+											<string>C84FFD2514CEF9C400D92A44</string>
+											<string>C858DABC14D0643D0009C9DF</string>
+										</array>
+									</dict>
+									<key>SplitCount</key>
+									<string>1</string>
+								</dict>
+								<key>StatusBarVisibility</key>
+								<true/>
+							</dict>
+							<key>GeometryConfiguration</key>
+							<dict>
+								<key>Frame</key>
+								<string>{{0, 0}, {892, 585}}</string>
+								<key>RubberWindowFrame</key>
+								<string>39 59 1100 675 0 0 1280 778 </string>
+							</dict>
+							<key>Module</key>
+							<string>PBXNavigatorGroup</string>
+							<key>Proportion</key>
+							<string>585pt</string>
+						</dict>
+						<dict>
+							<key>ContentConfiguration</key>
+							<dict>
+								<key>PBXProjectModuleGUID</key>
+								<string>1CE0B20506471E060097A5F4</string>
+								<key>PBXProjectModuleLabel</key>
+								<string>Detail</string>
+							</dict>
+							<key>GeometryConfiguration</key>
+							<dict>
+								<key>Frame</key>
+								<string>{{0, 590}, {892, 44}}</string>
+								<key>RubberWindowFrame</key>
+								<string>39 59 1100 675 0 0 1280 778 </string>
+							</dict>
+							<key>Module</key>
+							<string>XCDetailModule</string>
+							<key>Proportion</key>
+							<string>44pt</string>
+						</dict>
+					</array>
+					<key>Proportion</key>
+					<string>892pt</string>
+				</dict>
+			</array>
+			<key>Name</key>
+			<string>Project</string>
+			<key>ServiceClasses</key>
+			<array>
+				<string>XCModuleDock</string>
+				<string>PBXSmartGroupTreeModule</string>
+				<string>XCModuleDock</string>
+				<string>PBXNavigatorGroup</string>
+				<string>XCDetailModule</string>
+			</array>
+			<key>TableOfContents</key>
+			<array>
+				<string>C8D33D0514D0645600191D50</string>
+				<string>1CE0B1FE06471DED0097A5F4</string>
+				<string>C8D33D0614D0645600191D50</string>
+				<string>1CE0B20306471E060097A5F4</string>
+				<string>1CE0B20506471E060097A5F4</string>
+			</array>
+			<key>ToolbarConfigUserDefaultsMinorVersion</key>
+			<string>2</string>
+			<key>ToolbarConfiguration</key>
+			<string>xcode.toolbar.config.defaultV3</string>
+		</dict>
+		<dict>
+			<key>ControllerClassBaseName</key>
+			<string></string>
+			<key>IconName</key>
+			<string>WindowOfProject</string>
+			<key>Identifier</key>
+			<string>perspective.morph</string>
+			<key>IsVertical</key>
+			<integer>0</integer>
+			<key>Layout</key>
+			<array>
+				<dict>
+					<key>BecomeActive</key>
+					<integer>1</integer>
+					<key>ContentConfiguration</key>
+					<dict>
+						<key>PBXBottomSmartGroupGIDs</key>
+						<array>
+							<string>1C37FBAC04509CD000000102</string>
+							<string>1C37FAAC04509CD000000102</string>
+							<string>1C08E77C0454961000C914BD</string>
+							<string>1C37FABC05509CD000000102</string>
+							<string>1C37FABC05539CD112110102</string>
+							<string>E2644B35053B69B200211256</string>
+							<string>1C37FABC04509CD000100104</string>
+							<string>1CC0EA4004350EF90044410B</string>
+							<string>1CC0EA4004350EF90041110B</string>
+						</array>
+						<key>PBXProjectModuleGUID</key>
+						<string>11E0B1FE06471DED0097A5F4</string>
+						<key>PBXProjectModuleLabel</key>
+						<string>Files</string>
+						<key>PBXProjectStructureProvided</key>
+						<string>yes</string>
+						<key>PBXSmartGroupTreeModuleColumnData</key>
+						<dict>
+							<key>PBXSmartGroupTreeModuleColumnWidthsKey</key>
+							<array>
+								<real>186</real>
+							</array>
+							<key>PBXSmartGroupTreeModuleColumnsKey_v4</key>
+							<array>
+								<string>MainColumn</string>
+							</array>
+						</dict>
+						<key>PBXSmartGroupTreeModuleOutlineStateKey_v7</key>
+						<dict>
+							<key>PBXSmartGroupTreeModuleOutlineStateExpansionKey</key>
+							<array>
+								<string>29B97314FDCFA39411CA2CEA</string>
+								<string>1C37FABC05509CD000000102</string>
+							</array>
+							<key>PBXSmartGroupTreeModuleOutlineStateSelectionKey</key>
+							<array>
+								<array>
+									<integer>0</integer>
+								</array>
+							</array>
+							<key>PBXSmartGroupTreeModuleOutlineStateVisibleRectKey</key>
+							<string>{{0, 0}, {186, 337}}</string>
+						</dict>
+						<key>PBXTopSmartGroupGIDs</key>
+						<array/>
+						<key>XCIncludePerspectivesSwitch</key>
+						<integer>1</integer>
+						<key>XCSharingToken</key>
+						<string>com.apple.Xcode.GFSharingToken</string>
+					</dict>
+					<key>GeometryConfiguration</key>
+					<dict>
+						<key>Frame</key>
+						<string>{{0, 0}, {203, 355}}</string>
+						<key>GroupTreeTableConfiguration</key>
+						<array>
+							<string>MainColumn</string>
+							<real>186</real>
+						</array>
+						<key>RubberWindowFrame</key>
+						<string>373 269 690 397 0 0 1440 878 </string>
+					</dict>
+					<key>Module</key>
+					<string>PBXSmartGroupTreeModule</string>
+					<key>Proportion</key>
+					<string>100%</string>
+				</dict>
+			</array>
+			<key>Name</key>
+			<string>Morph</string>
+			<key>PreferredWidth</key>
+			<integer>300</integer>
+			<key>ServiceClasses</key>
+			<array>
+				<string>XCModuleDock</string>
+				<string>PBXSmartGroupTreeModule</string>
+			</array>
+			<key>TableOfContents</key>
+			<array>
+				<string>11E0B1FE06471DED0097A5F4</string>
+			</array>
+			<key>ToolbarConfiguration</key>
+			<string>xcode.toolbar.config.default.shortV3</string>
+		</dict>
+	</array>
+	<key>PerspectivesBarVisible</key>
+	<false/>
+	<key>PinnedNavigatorIdentifier</key>
+	<string>C84FFCE814CDB8BC00D92A44</string>
+	<key>ShelfIsVisible</key>
+	<false/>
+	<key>SourceDescription</key>
+	<string>file at '/Developer/Library/PrivateFrameworks/DevToolsInterface.framework/Resources/XCPerspectivesSpecificationMode1.xcperspec'</string>
+	<key>StatusbarIsVisible</key>
+	<true/>
+	<key>TimeStamp</key>
+	<real>0.0</real>
+	<key>ToolbarConfigUserDefaultsMinorVersion</key>
+	<string>2</string>
+	<key>ToolbarDisplayMode</key>
+	<integer>1</integer>
+	<key>ToolbarIsVisible</key>
+	<true/>
+	<key>ToolbarSizeMode</key>
+	<integer>1</integer>
+	<key>Type</key>
+	<string>Perspectives</string>
+	<key>UpdateMessage</key>
+	<string>The Default Workspace in this version of Xcode now includes support to hide and show the detail view (what has been referred to as the "Metro-Morph" feature).  You must discard your current Default Workspace settings and update to the latest Default Workspace in order to gain this feature.  Do you wish to update to the latest Workspace defaults for project '%@'?</string>
+	<key>WindowJustification</key>
+	<integer>5</integer>
+	<key>WindowOrderList</key>
+	<array>
+		<string>C8D33D1014D0645600191D50</string>
+		<string>C8D33D1114D0645600191D50</string>
+		<string>C8D33D1214D0645600191D50</string>
+		<string>1C78EAAD065D492600B07095</string>
+		<string>1CD10A99069EF8BA00B06720</string>
+		<string>C859AFFA140D23E1002C5ACF</string>
+		<string>C84FFCE814CDB8BC00D92A44</string>
+		<string>/Users/hekeus/Documents/QMUL/InfoDynInstallation/melodytriangle/of_preRelease_v0062_osxSL_FAT/apps/examples/MelodyTriangle/MelodyTriangle.xcodeproj</string>
+	</array>
+	<key>WindowString</key>
+	<string>39 59 1100 675 0 0 1280 778 </string>
+	<key>WindowToolsV3</key>
+	<array>
+		<dict>
+			<key>FirstTimeWindowDisplayed</key>
+			<false/>
+			<key>Identifier</key>
+			<string>windowTool.build</string>
+			<key>IsVertical</key>
+			<true/>
+			<key>Layout</key>
+			<array>
+				<dict>
+					<key>Dock</key>
+					<array>
+						<dict>
+							<key>ContentConfiguration</key>
+							<dict>
+								<key>PBXProjectModuleGUID</key>
+								<string>1CD0528F0623707200166675</string>
+								<key>PBXProjectModuleLabel</key>
+								<string></string>
+								<key>StatusBarVisibility</key>
+								<true/>
+							</dict>
+							<key>GeometryConfiguration</key>
+							<dict>
+								<key>Frame</key>
+								<string>{{0, 0}, {500, 218}}</string>
+								<key>RubberWindowFrame</key>
+								<string>237 251 500 500 0 0 1280 778 </string>
+							</dict>
+							<key>Module</key>
+							<string>PBXNavigatorGroup</string>
+							<key>Proportion</key>
+							<string>218pt</string>
+						</dict>
+						<dict>
+							<key>ContentConfiguration</key>
+							<dict>
+								<key>PBXProjectModuleGUID</key>
+								<string>XCMainBuildResultsModuleGUID</string>
+								<key>PBXProjectModuleLabel</key>
+								<string>Build Results</string>
+								<key>XCBuildResultsTrigger_Collapse</key>
+								<integer>1021</integer>
+								<key>XCBuildResultsTrigger_Open</key>
+								<integer>1011</integer>
+							</dict>
+							<key>GeometryConfiguration</key>
+							<dict>
+								<key>Frame</key>
+								<string>{{0, 223}, {500, 236}}</string>
+								<key>RubberWindowFrame</key>
+								<string>237 251 500 500 0 0 1280 778 </string>
+							</dict>
+							<key>Module</key>
+							<string>PBXBuildResultsModule</string>
+							<key>Proportion</key>
+							<string>236pt</string>
+						</dict>
+					</array>
+					<key>Proportion</key>
+					<string>459pt</string>
+				</dict>
+			</array>
+			<key>Name</key>
+			<string>Build Results</string>
+			<key>ServiceClasses</key>
+			<array>
+				<string>PBXBuildResultsModule</string>
+			</array>
+			<key>StatusbarIsVisible</key>
+			<true/>
+			<key>TableOfContents</key>
+			<array>
+				<string>C859AFFA140D23E1002C5ACF</string>
+				<string>C8D33D0814D0645600191D50</string>
+				<string>1CD0528F0623707200166675</string>
+				<string>XCMainBuildResultsModuleGUID</string>
+			</array>
+			<key>ToolbarConfiguration</key>
+			<string>xcode.toolbar.config.buildV3</string>
+			<key>WindowContentMinSize</key>
+			<string>486 300</string>
+			<key>WindowString</key>
+			<string>237 251 500 500 0 0 1280 778 </string>
+			<key>WindowToolGUID</key>
+			<string>C859AFFA140D23E1002C5ACF</string>
+			<key>WindowToolIsVisible</key>
+			<false/>
+		</dict>
+		<dict>
+			<key>FirstTimeWindowDisplayed</key>
+			<false/>
+			<key>Identifier</key>
+			<string>windowTool.debugger</string>
+			<key>IsVertical</key>
+			<true/>
+			<key>Layout</key>
+			<array>
+				<dict>
+					<key>Dock</key>
+					<array>
+						<dict>
+							<key>ContentConfiguration</key>
+							<dict>
+								<key>Debugger</key>
+								<dict>
+									<key>HorizontalSplitView</key>
+									<dict>
+										<key>_collapsingFrameDimension</key>
+										<real>0.0</real>
+										<key>_indexOfCollapsedView</key>
+										<integer>0</integer>
+										<key>_percentageOfCollapsedView</key>
+										<real>0.0</real>
+										<key>isCollapsed</key>
+										<string>yes</string>
+										<key>sizes</key>
+										<array>
+											<string>{{0, 0}, {316, 203}}</string>
+											<string>{{316, 0}, {378, 203}}</string>
+										</array>
+									</dict>
+									<key>VerticalSplitView</key>
+									<dict>
+										<key>_collapsingFrameDimension</key>
+										<real>0.0</real>
+										<key>_indexOfCollapsedView</key>
+										<integer>0</integer>
+										<key>_percentageOfCollapsedView</key>
+										<real>0.0</real>
+										<key>isCollapsed</key>
+										<string>yes</string>
+										<key>sizes</key>
+										<array>
+											<string>{{0, 0}, {694, 203}}</string>
+											<string>{{0, 203}, {694, 178}}</string>
+										</array>
+									</dict>
+								</dict>
+								<key>LauncherConfigVersion</key>
+								<string>8</string>
+								<key>PBXProjectModuleGUID</key>
+								<string>1C162984064C10D400B95A72</string>
+								<key>PBXProjectModuleLabel</key>
+								<string>Debug - GLUTExamples (Underwater)</string>
+							</dict>
+							<key>GeometryConfiguration</key>
+							<dict>
+								<key>DebugConsoleVisible</key>
+								<string>None</string>
+								<key>DebugConsoleWindowFrame</key>
+								<string>{{200, 200}, {500, 300}}</string>
+								<key>DebugSTDIOWindowFrame</key>
+								<string>{{200, 200}, {500, 300}}</string>
+								<key>Frame</key>
+								<string>{{0, 0}, {694, 381}}</string>
+								<key>PBXDebugSessionStackFrameViewKey</key>
+								<dict>
+									<key>DebugVariablesTableConfiguration</key>
+									<array>
+										<string>Name</string>
+										<real>120</real>
+										<string>Value</string>
+										<real>85</real>
+										<string>Summary</string>
+										<real>148</real>
+									</array>
+									<key>Frame</key>
+									<string>{{316, 0}, {378, 203}}</string>
+									<key>RubberWindowFrame</key>
+									<string>360 299 694 422 0 0 1280 778 </string>
+								</dict>
+								<key>RubberWindowFrame</key>
+								<string>360 299 694 422 0 0 1280 778 </string>
+							</dict>
+							<key>Module</key>
+							<string>PBXDebugSessionModule</string>
+							<key>Proportion</key>
+							<string>381pt</string>
+						</dict>
+					</array>
+					<key>Proportion</key>
+					<string>381pt</string>
+				</dict>
+			</array>
+			<key>Name</key>
+			<string>Debugger</string>
+			<key>ServiceClasses</key>
+			<array>
+				<string>PBXDebugSessionModule</string>
+			</array>
+			<key>StatusbarIsVisible</key>
+			<true/>
+			<key>TableOfContents</key>
+			<array>
+				<string>1CD10A99069EF8BA00B06720</string>
+				<string>C8D33D0914D0645600191D50</string>
+				<string>1C162984064C10D400B95A72</string>
+				<string>C8D33D0A14D0645600191D50</string>
+				<string>C8D33D0B14D0645600191D50</string>
+				<string>C8D33D0C14D0645600191D50</string>
+				<string>C8D33D0D14D0645600191D50</string>
+				<string>C8D33D0E14D0645600191D50</string>
+			</array>
+			<key>ToolbarConfiguration</key>
+			<string>xcode.toolbar.config.debugV3</string>
+			<key>WindowString</key>
+			<string>360 299 694 422 0 0 1280 778 </string>
+			<key>WindowToolGUID</key>
+			<string>1CD10A99069EF8BA00B06720</string>
+			<key>WindowToolIsVisible</key>
+			<false/>
+		</dict>
+		<dict>
+			<key>Identifier</key>
+			<string>windowTool.find</string>
+			<key>Layout</key>
+			<array>
+				<dict>
+					<key>Dock</key>
+					<array>
+						<dict>
+							<key>Dock</key>
+							<array>
+								<dict>
+									<key>ContentConfiguration</key>
+									<dict>
+										<key>PBXProjectModuleGUID</key>
+										<string>1CDD528C0622207200134675</string>
+										<key>PBXProjectModuleLabel</key>
+										<string>&lt;No Editor&gt;</string>
+										<key>PBXSplitModuleInNavigatorKey</key>
+										<dict>
+											<key>Split0</key>
+											<dict>
+												<key>PBXProjectModuleGUID</key>
+												<string>1CD0528D0623707200166675</string>
+											</dict>
+											<key>SplitCount</key>
+											<string>1</string>
+										</dict>
+										<key>StatusBarVisibility</key>
+										<integer>1</integer>
+									</dict>
+									<key>GeometryConfiguration</key>
+									<dict>
+										<key>Frame</key>
+										<string>{{0, 0}, {781, 167}}</string>
+										<key>RubberWindowFrame</key>
+										<string>62 385 781 470 0 0 1440 878 </string>
+									</dict>
+									<key>Module</key>
+									<string>PBXNavigatorGroup</string>
+									<key>Proportion</key>
+									<string>781pt</string>
+								</dict>
+							</array>
+							<key>Proportion</key>
+							<string>50%</string>
+						</dict>
+						<dict>
+							<key>BecomeActive</key>
+							<integer>1</integer>
+							<key>ContentConfiguration</key>
+							<dict>
+								<key>PBXProjectModuleGUID</key>
+								<string>1CD0528E0623707200166675</string>
+								<key>PBXProjectModuleLabel</key>
+								<string>Project Find</string>
+							</dict>
+							<key>GeometryConfiguration</key>
+							<dict>
+								<key>Frame</key>
+								<string>{{8, 0}, {773, 254}}</string>
+								<key>RubberWindowFrame</key>
+								<string>62 385 781 470 0 0 1440 878 </string>
+							</dict>
+							<key>Module</key>
+							<string>PBXProjectFindModule</string>
+							<key>Proportion</key>
+							<string>50%</string>
+						</dict>
+					</array>
+					<key>Proportion</key>
+					<string>428pt</string>
+				</dict>
+			</array>
+			<key>Name</key>
+			<string>Project Find</string>
+			<key>ServiceClasses</key>
+			<array>
+				<string>PBXProjectFindModule</string>
+			</array>
+			<key>StatusbarIsVisible</key>
+			<integer>1</integer>
+			<key>TableOfContents</key>
+			<array>
+				<string>1C530D57069F1CE1000CFCEE</string>
+				<string>1C530D58069F1CE1000CFCEE</string>
+				<string>1C530D59069F1CE1000CFCEE</string>
+				<string>1CDD528C0622207200134675</string>
+				<string>1C530D5A069F1CE1000CFCEE</string>
+				<string>1CE0B1FE06471DED0097A5F4</string>
+				<string>1CD0528E0623707200166675</string>
+			</array>
+			<key>WindowString</key>
+			<string>62 385 781 470 0 0 1440 878 </string>
+			<key>WindowToolGUID</key>
+			<string>1C530D57069F1CE1000CFCEE</string>
+			<key>WindowToolIsVisible</key>
+			<integer>0</integer>
+		</dict>
+		<dict>
+			<key>Identifier</key>
+			<string>MENUSEPARATOR</string>
+		</dict>
+		<dict>
+			<key>FirstTimeWindowDisplayed</key>
+			<false/>
+			<key>Identifier</key>
+			<string>windowTool.debuggerConsole</string>
+			<key>IsVertical</key>
+			<true/>
+			<key>Layout</key>
+			<array>
+				<dict>
+					<key>Dock</key>
+					<array>
+						<dict>
+							<key>ContentConfiguration</key>
+							<dict>
+								<key>PBXProjectModuleGUID</key>
+								<string>1C78EAAC065D492600B07095</string>
+								<key>PBXProjectModuleLabel</key>
+								<string>Debugger Console</string>
+							</dict>
+							<key>GeometryConfiguration</key>
+							<dict>
+								<key>Frame</key>
+								<string>{{0, 0}, {342, 453}}</string>
+								<key>RubberWindowFrame</key>
+								<string>846 284 342 494 0 0 1280 778 </string>
+							</dict>
+							<key>Module</key>
+							<string>PBXDebugCLIModule</string>
+							<key>Proportion</key>
+							<string>453pt</string>
+						</dict>
+					</array>
+					<key>Proportion</key>
+					<string>453pt</string>
+				</dict>
+			</array>
+			<key>Name</key>
+			<string>Debugger Console</string>
+			<key>ServiceClasses</key>
+			<array>
+				<string>PBXDebugCLIModule</string>
+			</array>
+			<key>StatusbarIsVisible</key>
+			<true/>
+			<key>TableOfContents</key>
+			<array>
+				<string>1C78EAAD065D492600B07095</string>
+				<string>C8D33D0F14D0645600191D50</string>
+				<string>1C78EAAC065D492600B07095</string>
+			</array>
+			<key>ToolbarConfiguration</key>
+			<string>xcode.toolbar.config.consoleV3</string>
+			<key>WindowString</key>
+			<string>846 284 342 494 0 0 1280 778 </string>
+			<key>WindowToolGUID</key>
+			<string>1C78EAAD065D492600B07095</string>
+			<key>WindowToolIsVisible</key>
+			<false/>
+		</dict>
+		<dict>
+			<key>Identifier</key>
+			<string>windowTool.snapshots</string>
+			<key>Layout</key>
+			<array>
+				<dict>
+					<key>Dock</key>
+					<array>
+						<dict>
+							<key>Module</key>
+							<string>XCSnapshotModule</string>
+							<key>Proportion</key>
+							<string>100%</string>
+						</dict>
+					</array>
+					<key>Proportion</key>
+					<string>100%</string>
+				</dict>
+			</array>
+			<key>Name</key>
+			<string>Snapshots</string>
+			<key>ServiceClasses</key>
+			<array>
+				<string>XCSnapshotModule</string>
+			</array>
+			<key>StatusbarIsVisible</key>
+			<string>Yes</string>
+			<key>ToolbarConfiguration</key>
+			<string>xcode.toolbar.config.snapshots</string>
+			<key>WindowString</key>
+			<string>315 824 300 550 0 0 1440 878 </string>
+			<key>WindowToolIsVisible</key>
+			<string>Yes</string>
+		</dict>
+		<dict>
+			<key>Identifier</key>
+			<string>windowTool.scm</string>
+			<key>Layout</key>
+			<array>
+				<dict>
+					<key>Dock</key>
+					<array>
+						<dict>
+							<key>ContentConfiguration</key>
+							<dict>
+								<key>PBXProjectModuleGUID</key>
+								<string>1C78EAB2065D492600B07095</string>
+								<key>PBXProjectModuleLabel</key>
+								<string>&lt;No Editor&gt;</string>
+								<key>PBXSplitModuleInNavigatorKey</key>
+								<dict>
+									<key>Split0</key>
+									<dict>
+										<key>PBXProjectModuleGUID</key>
+										<string>1C78EAB3065D492600B07095</string>
+									</dict>
+									<key>SplitCount</key>
+									<string>1</string>
+								</dict>
+								<key>StatusBarVisibility</key>
+								<integer>1</integer>
+							</dict>
+							<key>GeometryConfiguration</key>
+							<dict>
+								<key>Frame</key>
+								<string>{{0, 0}, {452, 0}}</string>
+								<key>RubberWindowFrame</key>
+								<string>743 379 452 308 0 0 1280 1002 </string>
+							</dict>
+							<key>Module</key>
+							<string>PBXNavigatorGroup</string>
+							<key>Proportion</key>
+							<string>0pt</string>
+						</dict>
+						<dict>
+							<key>BecomeActive</key>
+							<integer>1</integer>
+							<key>ContentConfiguration</key>
+							<dict>
+								<key>PBXProjectModuleGUID</key>
+								<string>1CD052920623707200166675</string>
+								<key>PBXProjectModuleLabel</key>
+								<string>SCM</string>
+							</dict>
+							<key>GeometryConfiguration</key>
+							<dict>
+								<key>ConsoleFrame</key>
+								<string>{{0, 259}, {452, 0}}</string>
+								<key>Frame</key>
+								<string>{{0, 7}, {452, 259}}</string>
+								<key>RubberWindowFrame</key>
+								<string>743 379 452 308 0 0 1280 1002 </string>
+								<key>TableConfiguration</key>
+								<array>
+									<string>Status</string>
+									<real>30</real>
+									<string>FileName</string>
+									<real>199</real>
+									<string>Path</string>
+									<real>197.0950012207031</real>
+								</array>
+								<key>TableFrame</key>
+								<string>{{0, 0}, {452, 250}}</string>
+							</dict>
+							<key>Module</key>
+							<string>PBXCVSModule</string>
+							<key>Proportion</key>
+							<string>262pt</string>
+						</dict>
+					</array>
+					<key>Proportion</key>
+					<string>266pt</string>
+				</dict>
+			</array>
+			<key>Name</key>
+			<string>SCM</string>
+			<key>ServiceClasses</key>
+			<array>
+				<string>PBXCVSModule</string>
+			</array>
+			<key>StatusbarIsVisible</key>
+			<integer>1</integer>
+			<key>TableOfContents</key>
+			<array>
+				<string>1C78EAB4065D492600B07095</string>
+				<string>1C78EAB5065D492600B07095</string>
+				<string>1C78EAB2065D492600B07095</string>
+				<string>1CD052920623707200166675</string>
+			</array>
+			<key>ToolbarConfiguration</key>
+			<string>xcode.toolbar.config.scm</string>
+			<key>WindowString</key>
+			<string>743 379 452 308 0 0 1280 1002 </string>
+		</dict>
+		<dict>
+			<key>FirstTimeWindowDisplayed</key>
+			<false/>
+			<key>Identifier</key>
+			<string>windowTool.breakpoints</string>
+			<key>IsVertical</key>
+			<false/>
+			<key>Layout</key>
+			<array>
+				<dict>
+					<key>Dock</key>
+					<array>
+						<dict>
+							<key>ContentConfiguration</key>
+							<dict>
+								<key>PBXBottomSmartGroupGIDs</key>
+								<array>
+									<string>1C77FABC04509CD000000102</string>
+								</array>
+								<key>PBXProjectModuleGUID</key>
+								<string>1CE0B1FE06471DED0097A5F4</string>
+								<key>PBXProjectModuleLabel</key>
+								<string>Files</string>
+								<key>PBXProjectStructureProvided</key>
+								<string>no</string>
+								<key>PBXSmartGroupTreeModuleColumnData</key>
+								<dict>
+									<key>PBXSmartGroupTreeModuleColumnWidthsKey</key>
+									<array>
+										<real>168</real>
+									</array>
+									<key>PBXSmartGroupTreeModuleColumnsKey_v4</key>
+									<array>
+										<string>MainColumn</string>
+									</array>
+								</dict>
+								<key>PBXSmartGroupTreeModuleOutlineStateKey_v7</key>
+								<dict>
+									<key>PBXSmartGroupTreeModuleOutlineStateExpansionKey</key>
+									<array>
+										<string>1C77FABC04509CD000000102</string>
+									</array>
+									<key>PBXSmartGroupTreeModuleOutlineStateSelectionKey</key>
+									<array>
+										<array>
+											<integer>0</integer>
+										</array>
+									</array>
+									<key>PBXSmartGroupTreeModuleOutlineStateVisibleRectKey</key>
+									<string>{{0, 0}, {168, 350}}</string>
+								</dict>
+								<key>PBXTopSmartGroupGIDs</key>
+								<array/>
+								<key>XCIncludePerspectivesSwitch</key>
+								<false/>
+							</dict>
+							<key>GeometryConfiguration</key>
+							<dict>
+								<key>Frame</key>
+								<string>{{0, 0}, {185, 368}}</string>
+								<key>GroupTreeTableConfiguration</key>
+								<array>
+									<string>MainColumn</string>
+									<real>168</real>
+								</array>
+								<key>RubberWindowFrame</key>
+								<string>31 346 744 409 0 0 1280 778 </string>
+							</dict>
+							<key>Module</key>
+							<string>PBXSmartGroupTreeModule</string>
+							<key>Proportion</key>
+							<string>185pt</string>
+						</dict>
+						<dict>
+							<key>BecomeActive</key>
+							<true/>
+							<key>ContentConfiguration</key>
+							<dict>
+								<key>PBXProjectModuleGUID</key>
+								<string>1CA1AED706398EBD00589147</string>
+								<key>PBXProjectModuleLabel</key>
+								<string>Detail</string>
+							</dict>
+							<key>GeometryConfiguration</key>
+							<dict>
+								<key>Frame</key>
+								<string>{{190, 0}, {554, 368}}</string>
+								<key>RubberWindowFrame</key>
+								<string>31 346 744 409 0 0 1280 778 </string>
+							</dict>
+							<key>Module</key>
+							<string>XCDetailModule</string>
+							<key>Proportion</key>
+							<string>554pt</string>
+						</dict>
+					</array>
+					<key>Proportion</key>
+					<string>368pt</string>
+				</dict>
+			</array>
+			<key>MajorVersion</key>
+			<integer>3</integer>
+			<key>MinorVersion</key>
+			<integer>0</integer>
+			<key>Name</key>
+			<string>Breakpoints</string>
+			<key>ServiceClasses</key>
+			<array>
+				<string>PBXSmartGroupTreeModule</string>
+				<string>XCDetailModule</string>
+			</array>
+			<key>StatusbarIsVisible</key>
+			<true/>
+			<key>TableOfContents</key>
+			<array>
+				<string>C8B1A93D14C47C9B003CDFD0</string>
+				<string>C8B1A93E14C47C9B003CDFD0</string>
+				<string>1CE0B1FE06471DED0097A5F4</string>
+				<string>1CA1AED706398EBD00589147</string>
+			</array>
+			<key>ToolbarConfiguration</key>
+			<string>xcode.toolbar.config.breakpointsV3</string>
+			<key>WindowString</key>
+			<string>31 346 744 409 0 0 1280 778 </string>
+			<key>WindowToolGUID</key>
+			<string>C8B1A93D14C47C9B003CDFD0</string>
+			<key>WindowToolIsVisible</key>
+			<false/>
+		</dict>
+		<dict>
+			<key>Identifier</key>
+			<string>windowTool.debugAnimator</string>
+			<key>Layout</key>
+			<array>
+				<dict>
+					<key>Dock</key>
+					<array>
+						<dict>
+							<key>Module</key>
+							<string>PBXNavigatorGroup</string>
+							<key>Proportion</key>
+							<string>100%</string>
+						</dict>
+					</array>
+					<key>Proportion</key>
+					<string>100%</string>
+				</dict>
+			</array>
+			<key>Name</key>
+			<string>Debug Visualizer</string>
+			<key>ServiceClasses</key>
+			<array>
+				<string>PBXNavigatorGroup</string>
+			</array>
+			<key>StatusbarIsVisible</key>
+			<integer>1</integer>
+			<key>ToolbarConfiguration</key>
+			<string>xcode.toolbar.config.debugAnimatorV3</string>
+			<key>WindowString</key>
+			<string>100 100 700 500 0 0 1280 1002 </string>
+		</dict>
+		<dict>
+			<key>Identifier</key>
+			<string>windowTool.bookmarks</string>
+			<key>Layout</key>
+			<array>
+				<dict>
+					<key>Dock</key>
+					<array>
+						<dict>
+							<key>Module</key>
+							<string>PBXBookmarksModule</string>
+							<key>Proportion</key>
+							<string>100%</string>
+						</dict>
+					</array>
+					<key>Proportion</key>
+					<string>100%</string>
+				</dict>
+			</array>
+			<key>Name</key>
+			<string>Bookmarks</string>
+			<key>ServiceClasses</key>
+			<array>
+				<string>PBXBookmarksModule</string>
+			</array>
+			<key>StatusbarIsVisible</key>
+			<integer>0</integer>
+			<key>WindowString</key>
+			<string>538 42 401 187 0 0 1280 1002 </string>
+		</dict>
+		<dict>
+			<key>Identifier</key>
+			<string>windowTool.projectFormatConflicts</string>
+			<key>Layout</key>
+			<array>
+				<dict>
+					<key>Dock</key>
+					<array>
+						<dict>
+							<key>Module</key>
+							<string>XCProjectFormatConflictsModule</string>
+							<key>Proportion</key>
+							<string>100%</string>
+						</dict>
+					</array>
+					<key>Proportion</key>
+					<string>100%</string>
+				</dict>
+			</array>
+			<key>Name</key>
+			<string>Project Format Conflicts</string>
+			<key>ServiceClasses</key>
+			<array>
+				<string>XCProjectFormatConflictsModule</string>
+			</array>
+			<key>StatusbarIsVisible</key>
+			<integer>0</integer>
+			<key>WindowContentMinSize</key>
+			<string>450 300</string>
+			<key>WindowString</key>
+			<string>50 850 472 307 0 0 1440 877</string>
+		</dict>
+		<dict>
+			<key>Identifier</key>
+			<string>windowTool.classBrowser</string>
+			<key>Layout</key>
+			<array>
+				<dict>
+					<key>Dock</key>
+					<array>
+						<dict>
+							<key>BecomeActive</key>
+							<integer>1</integer>
+							<key>ContentConfiguration</key>
+							<dict>
+								<key>OptionsSetName</key>
+								<string>Hierarchy, all classes</string>
+								<key>PBXProjectModuleGUID</key>
+								<string>1CA6456E063B45B4001379D8</string>
+								<key>PBXProjectModuleLabel</key>
+								<string>Class Browser - NSObject</string>
+							</dict>
+							<key>GeometryConfiguration</key>
+							<dict>
+								<key>ClassesFrame</key>
+								<string>{{0, 0}, {374, 96}}</string>
+								<key>ClassesTreeTableConfiguration</key>
+								<array>
+									<string>PBXClassNameColumnIdentifier</string>
+									<real>208</real>
+									<string>PBXClassBookColumnIdentifier</string>
+									<real>22</real>
+								</array>
+								<key>Frame</key>
+								<string>{{0, 0}, {630, 331}}</string>
+								<key>MembersFrame</key>
+								<string>{{0, 105}, {374, 395}}</string>
+								<key>MembersTreeTableConfiguration</key>
+								<array>
+									<string>PBXMemberTypeIconColumnIdentifier</string>
+									<real>22</real>
+									<string>PBXMemberNameColumnIdentifier</string>
+									<real>216</real>
+									<string>PBXMemberTypeColumnIdentifier</string>
+									<real>97</real>
+									<string>PBXMemberBookColumnIdentifier</string>
+									<real>22</real>
+								</array>
+								<key>PBXModuleWindowStatusBarHidden2</key>
+								<integer>1</integer>
+								<key>RubberWindowFrame</key>
+								<string>385 179 630 352 0 0 1440 878 </string>
+							</dict>
+							<key>Module</key>
+							<string>PBXClassBrowserModule</string>
+							<key>Proportion</key>
+							<string>332pt</string>
+						</dict>
+					</array>
+					<key>Proportion</key>
+					<string>332pt</string>
+				</dict>
+			</array>
+			<key>Name</key>
+			<string>Class Browser</string>
+			<key>ServiceClasses</key>
+			<array>
+				<string>PBXClassBrowserModule</string>
+			</array>
+			<key>StatusbarIsVisible</key>
+			<integer>0</integer>
+			<key>TableOfContents</key>
+			<array>
+				<string>1C0AD2AF069F1E9B00FABCE6</string>
+				<string>1C0AD2B0069F1E9B00FABCE6</string>
+				<string>1CA6456E063B45B4001379D8</string>
+			</array>
+			<key>ToolbarConfiguration</key>
+			<string>xcode.toolbar.config.classbrowser</string>
+			<key>WindowString</key>
+			<string>385 179 630 352 0 0 1440 878 </string>
+			<key>WindowToolGUID</key>
+			<string>1C0AD2AF069F1E9B00FABCE6</string>
+			<key>WindowToolIsVisible</key>
+			<integer>0</integer>
+		</dict>
+		<dict>
+			<key>Identifier</key>
+			<string>windowTool.refactoring</string>
+			<key>IncludeInToolsMenu</key>
+			<integer>0</integer>
+			<key>Layout</key>
+			<array>
+				<dict>
+					<key>Dock</key>
+					<array>
+						<dict>
+							<key>BecomeActive</key>
+							<integer>1</integer>
+							<key>GeometryConfiguration</key>
+							<dict>
+								<key>Frame</key>
+								<string>{0, 0}, {500, 335}</string>
+								<key>RubberWindowFrame</key>
+								<string>{0, 0}, {500, 335}</string>
+							</dict>
+							<key>Module</key>
+							<string>XCRefactoringModule</string>
+							<key>Proportion</key>
+							<string>100%</string>
+						</dict>
+					</array>
+					<key>Proportion</key>
+					<string>100%</string>
+				</dict>
+			</array>
+			<key>Name</key>
+			<string>Refactoring</string>
+			<key>ServiceClasses</key>
+			<array>
+				<string>XCRefactoringModule</string>
+			</array>
+			<key>WindowString</key>
+			<string>200 200 500 356 0 0 1920 1200 </string>
+		</dict>
+	</array>
+</dict>
+</plist>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MelodyTriangle.xcodeproj/hekeus.pbxuser	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,400 @@
+// !$*UTF8*$!
+{
+	C84FFCD314CDB71400D92A44 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = C8E1DA4214BF60B7000A0193 /* Voice.cpp */;
+		name = "Voice.cpp: 38";
+		rLen = 0;
+		rLoc = 571;
+		rType = 0;
+		vrLen = 547;
+		vrLoc = 155;
+	};
+	C84FFD2414CEF9C400D92A44 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = E4B69E1D0A3A1BDC003C02F2 /* main.cpp */;
+		name = "main.cpp: 26";
+		rLen = 0;
+		rLoc = 800;
+		rType = 0;
+		vrLen = 807;
+		vrLoc = 0;
+	};
+	C84FFD2514CEF9C400D92A44 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = C8E1D9DA14BF50E0000A0193 /* melodyTriangle.h */;
+		name = "melodyTriangle.h: 15";
+		rLen = 0;
+		rLoc = 213;
+		rType = 0;
+		vrLen = 852;
+		vrLoc = 0;
+	};
+	C84FFD2C14CF998D00D92A44 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = C8E1D9D914BF50E0000A0193 /* melodyTriangle.cpp */;
+		name = "melodyTriangle.cpp: 53";
+		rLen = 0;
+		rLoc = 1425;
+		rType = 0;
+		vrLen = 1225;
+		vrLoc = 562;
+	};
+	C84FFD2D14CF998E00D92A44 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = C8E1D9D914BF50E0000A0193 /* melodyTriangle.cpp */;
+		name = "melodyTriangle.cpp: 19";
+		rLen = 0;
+		rLoc = 440;
+		rType = 0;
+		vrLen = 1327;
+		vrLoc = 56;
+	};
+	C85286B614C4C91A00AE6996 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = C85286B714C4C91A00AE6996 /* cmath */;
+		name = "cmath: 427";
+		rLen = 17;
+		rLoc = 10048;
+		rType = 0;
+		vrLen = 609;
+		vrLoc = 9760;
+	};
+	C85286B714C4C91A00AE6996 /* cmath */ = {
+		isa = PBXFileReference;
+		lastKnownFileType = sourcecode.cpp.h;
+		name = cmath;
+		path = "/usr/include/c++/4.2.1/cmath";
+		sourceTree = "<absolute>";
+	};
+	C852874414C5BF6800AE6996 /* MelodyTriangle_windowed */ = {
+		activeExec = 0;
+		executables = (
+			C852877214C5BF6800AE6996 /* MelodyTriangle_windowed */,
+		);
+	};
+	C852877214C5BF6800AE6996 /* MelodyTriangle_windowed */ = {
+		isa = PBXExecutable;
+		activeArgIndices = (
+		);
+		argumentStrings = (
+		);
+		autoAttachOnCrash = 1;
+		breakpointsEnabled = 0;
+		configStateDict = {
+		};
+		customDataFormattersEnabled = 1;
+		dataTipCustomDataFormattersEnabled = 1;
+		dataTipShowTypeColumn = 1;
+		dataTipSortType = 0;
+		debuggerPlugin = GDBDebugging;
+		disassemblyDisplayState = 0;
+		dylibVariantSuffix = "";
+		enableDebugStr = 1;
+		environmentEntries = (
+		);
+		executableSystemSymbolLevel = 0;
+		executableUserSymbolLevel = 0;
+		libgmallocEnabled = 0;
+		name = MelodyTriangle_windowed;
+		savedGlobals = {
+		};
+		showTypeColumn = 0;
+		sourceDirectories = (
+		);
+	};
+	C852882A14CC47A200AE6996 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = C8E1DA4114BF60B7000A0193 /* Voice.h */;
+		name = "Voice.h: 24";
+		rLen = 0;
+		rLoc = 393;
+		rType = 0;
+		vrLen = 401;
+		vrLoc = 0;
+	};
+	C852882B14CC47A200AE6996 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = E4B69E1E0A3A1BDC003C02F2 /* testApp.cpp */;
+		name = "testApp.cpp: 8";
+		rLen = 0;
+		rLoc = 180;
+		rType = 0;
+		vrLen = 1122;
+		vrLoc = 0;
+	};
+	C852882C14CC47A200AE6996 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = E4B69E1F0A3A1BDC003C02F2 /* testApp.h */;
+		name = "testApp.h: 22";
+		rLen = 0;
+		rLoc = 429;
+		rType = 0;
+		vrLen = 477;
+		vrLoc = 0;
+	};
+	C858DABC14D0643D0009C9DF /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = C8E1D9D914BF50E0000A0193 /* melodyTriangle.cpp */;
+		name = "melodyTriangle.cpp: 123";
+		rLen = 0;
+		rLoc = 3225;
+		rType = 0;
+		vrLen = 1413;
+		vrLoc = 2427;
+	};
+	C858DABD14D0643D0009C9DF /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = C8E1D9D914BF50E0000A0193 /* melodyTriangle.cpp */;
+		name = "melodyTriangle.cpp: 19";
+		rLen = 0;
+		rLoc = 440;
+		rType = 0;
+		vrLen = 1327;
+		vrLoc = 56;
+	};
+	C859AFF1140D23D3002C5ACF /* MelodyTriangle */ = {
+		isa = PBXExecutable;
+		activeArgIndices = (
+		);
+		argumentStrings = (
+		);
+		autoAttachOnCrash = 1;
+		breakpointsEnabled = 0;
+		configStateDict = {
+		};
+		customDataFormattersEnabled = 1;
+		dataTipCustomDataFormattersEnabled = 1;
+		dataTipShowTypeColumn = 1;
+		dataTipSortType = 0;
+		debuggerPlugin = GDBDebugging;
+		disassemblyDisplayState = 0;
+		dylibVariantSuffix = "";
+		enableDebugStr = 1;
+		environmentEntries = (
+		);
+		executableSystemSymbolLevel = 0;
+		executableUserSymbolLevel = 0;
+		libgmallocEnabled = 0;
+		name = MelodyTriangle;
+		savedGlobals = {
+		};
+		showTypeColumn = 0;
+		sourceDirectories = (
+		);
+	};
+	C859B006140D23E1002C5ACF /* Source Control */ = {
+		isa = PBXSourceControlManager;
+		fallbackIsa = XCSourceControlManager;
+		isSCMEnabled = 0;
+		scmConfiguration = {
+			repositoryNamesForRoots = {
+				"" = "";
+			};
+		};
+	};
+	C859B007140D23E1002C5ACF /* Code sense */ = {
+		isa = PBXCodeSenseManager;
+		indexTemplatePath = "";
+	};
+	C8D33D0414D0645600191D50 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = C8E1D9D914BF50E0000A0193 /* melodyTriangle.cpp */;
+		name = "melodyTriangle.cpp: 123";
+		rLen = 0;
+		rLoc = 3225;
+		rType = 0;
+		vrLen = 1287;
+		vrLoc = 2427;
+	};
+	C8D33D0714D0645600191D50 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = C8E1D9D914BF50E0000A0193 /* melodyTriangle.cpp */;
+		name = "melodyTriangle.cpp: 19";
+		rLen = 0;
+		rLoc = 440;
+		rType = 0;
+		vrLen = 1293;
+		vrLoc = 56;
+	};
+	C8E1D9D914BF50E0000A0193 /* melodyTriangle.cpp */ = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {912, 5577}}";
+			sepNavSelRange = "{440, 0}";
+			sepNavVisRange = "{56, 1293}";
+			sepNavWindowFrame = "{{293, 4}, {971, 730}}";
+		};
+	};
+	C8E1D9DA14BF50E0000A0193 /* melodyTriangle.h */ = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {831, 598}}";
+			sepNavSelRange = "{213, 0}";
+			sepNavVisRange = "{0, 852}";
+		};
+	};
+	C8E1DA3A14BF6043000A0193 /* PlistBookmark */ = {
+		isa = PlistBookmark;
+		fRef = E4B6FCAD0C3E899E008CF71C /* MelodyTriangle.plist */;
+		fallbackIsa = PBXBookmark;
+		isK = 0;
+		kPath = (
+		);
+		name = /Users/hekeus/Documents/QMUL/InfoDynInstallation/melodytriangle/of_preRelease_v0062_osxSL_FAT/apps/examples/MelodyTriangle/MelodyTriangle.plist;
+		rLen = 0;
+		rLoc = 9223372036854775808;
+	};
+	C8E1DA4114BF60B7000A0193 /* Voice.h */ = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {831, 534}}";
+			sepNavSelRange = "{393, 0}";
+			sepNavVisRange = "{0, 401}";
+		};
+	};
+	C8E1DA4214BF60B7000A0193 /* Voice.cpp */ = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {831, 663}}";
+			sepNavSelRange = "{571, 0}";
+			sepNavVisRange = "{155, 547}";
+			sepNavWindowFrame = "{{178, -17}, {971, 730}}";
+		};
+	};
+	E4B69B4C0A3A1720003C02F2 /* Project object */ = {
+		activeBuildConfigurationName = Release;
+		activeExecutable = C859AFF1140D23D3002C5ACF /* MelodyTriangle */;
+		activeTarget = E4B69B5A0A3A1756003C02F2 /* MelodyTriangle */;
+		addToTargets = (
+			E4B69B5A0A3A1756003C02F2 /* MelodyTriangle */,
+		);
+		breakpoints = (
+		);
+		codeSenseManager = C859B007140D23E1002C5ACF /* Code sense */;
+		executables = (
+			C859AFF1140D23D3002C5ACF /* MelodyTriangle */,
+			C852877214C5BF6800AE6996 /* MelodyTriangle_windowed */,
+		);
+		perUserDictionary = {
+			"PBXConfiguration.PBXBreakpointsDataSource.v1:1CA1AED706398EBD00589147" = {
+				PBXFileTableDataSourceColumnSortingDirectionKey = "-1";
+				PBXFileTableDataSourceColumnSortingKey = PBXBreakpointsDataSource_BreakpointID;
+				PBXFileTableDataSourceColumnWidthsKey = (
+					20,
+					20,
+					198,
+					20,
+					99,
+					99,
+					29,
+					20,
+				);
+				PBXFileTableDataSourceColumnsKey = (
+					PBXBreakpointsDataSource_ActionID,
+					PBXBreakpointsDataSource_TypeID,
+					PBXBreakpointsDataSource_BreakpointID,
+					PBXBreakpointsDataSource_UseID,
+					PBXBreakpointsDataSource_LocationID,
+					PBXBreakpointsDataSource_ConditionID,
+					PBXBreakpointsDataSource_IgnoreCountID,
+					PBXBreakpointsDataSource_ContinueID,
+				);
+			};
+			PBXConfiguration.PBXFileTableDataSource3.PBXFileTableDataSource = {
+				PBXFileTableDataSourceColumnSortingDirectionKey = "-1";
+				PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID;
+				PBXFileTableDataSourceColumnWidthsKey = (
+					20,
+					653,
+					20,
+					48,
+					43,
+					43,
+					20,
+				);
+				PBXFileTableDataSourceColumnsKey = (
+					PBXFileDataSource_FiletypeID,
+					PBXFileDataSource_Filename_ColumnID,
+					PBXFileDataSource_Built_ColumnID,
+					PBXFileDataSource_ObjectSize_ColumnID,
+					PBXFileDataSource_Errors_ColumnID,
+					PBXFileDataSource_Warnings_ColumnID,
+					PBXFileDataSource_Target_ColumnID,
+				);
+			};
+			PBXConfiguration.PBXTargetDataSource.PBXTargetDataSource = {
+				PBXFileTableDataSourceColumnSortingDirectionKey = "-1";
+				PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID;
+				PBXFileTableDataSourceColumnWidthsKey = (
+					20,
+					442,
+					60,
+					20,
+					48,
+					43,
+					43,
+				);
+				PBXFileTableDataSourceColumnsKey = (
+					PBXFileDataSource_FiletypeID,
+					PBXFileDataSource_Filename_ColumnID,
+					PBXTargetDataSource_PrimaryAttribute,
+					PBXFileDataSource_Built_ColumnID,
+					PBXFileDataSource_ObjectSize_ColumnID,
+					PBXFileDataSource_Errors_ColumnID,
+					PBXFileDataSource_Warnings_ColumnID,
+				);
+			};
+			PBXPerProjectTemplateStateSaveDate = 349201481;
+			PBXWorkspaceStateSaveDate = 349201481;
+		};
+		perUserProjectItems = {
+			C84FFCD314CDB71400D92A44 = C84FFCD314CDB71400D92A44 /* PBXTextBookmark */;
+			C84FFD2414CEF9C400D92A44 = C84FFD2414CEF9C400D92A44 /* PBXTextBookmark */;
+			C84FFD2514CEF9C400D92A44 = C84FFD2514CEF9C400D92A44 /* PBXTextBookmark */;
+			C84FFD2C14CF998D00D92A44 = C84FFD2C14CF998D00D92A44 /* PBXTextBookmark */;
+			C84FFD2D14CF998E00D92A44 = C84FFD2D14CF998E00D92A44 /* PBXTextBookmark */;
+			C85286B614C4C91A00AE6996 = C85286B614C4C91A00AE6996 /* PBXTextBookmark */;
+			C852882A14CC47A200AE6996 = C852882A14CC47A200AE6996 /* PBXTextBookmark */;
+			C852882B14CC47A200AE6996 = C852882B14CC47A200AE6996 /* PBXTextBookmark */;
+			C852882C14CC47A200AE6996 = C852882C14CC47A200AE6996 /* PBXTextBookmark */;
+			C858DABC14D0643D0009C9DF = C858DABC14D0643D0009C9DF /* PBXTextBookmark */;
+			C858DABD14D0643D0009C9DF = C858DABD14D0643D0009C9DF /* PBXTextBookmark */;
+			C8D33D0414D0645600191D50 /* PBXTextBookmark */ = C8D33D0414D0645600191D50 /* PBXTextBookmark */;
+			C8D33D0714D0645600191D50 /* PBXTextBookmark */ = C8D33D0714D0645600191D50 /* PBXTextBookmark */;
+			C8E1DA3A14BF6043000A0193 = C8E1DA3A14BF6043000A0193 /* PlistBookmark */;
+		};
+		sourceControlManager = C859B006140D23E1002C5ACF /* Source Control */;
+		userBuildSettings = {
+		};
+	};
+	E4B69B5A0A3A1756003C02F2 /* MelodyTriangle */ = {
+		activeExec = 0;
+		executables = (
+			C859AFF1140D23D3002C5ACF /* MelodyTriangle */,
+		);
+	};
+	E4B69E1D0A3A1BDC003C02F2 /* main.cpp */ = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {831, 555}}";
+			sepNavSelRange = "{800, 0}";
+			sepNavVisRange = "{0, 807}";
+			sepNavWindowFrame = "{{15, 43}, {971, 730}}";
+		};
+	};
+	E4B69E1E0A3A1BDC003C02F2 /* testApp.cpp */ = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {831, 1586}}";
+			sepNavSelRange = "{180, 0}";
+			sepNavVisRange = "{0, 1122}";
+		};
+	};
+	E4B69E1F0A3A1BDC003C02F2 /* testApp.h */ = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {831, 534}}";
+			sepNavSelRange = "{429, 0}";
+			sepNavVisRange = "{0, 477}";
+		};
+	};
+	E4B6FCAD0C3E899E008CF71C /* MelodyTriangle.plist */ = {
+		uiCtxt = {
+			sepNavWindowFrame = "{{234, 30}, {971, 730}}";
+		};
+	};
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MelodyTriangle.xcodeproj/project.pbxproj	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,1269 @@
+// !$*UTF8*$!
+{
+	archiveVersion = 1;
+	classes = {
+	};
+	objectVersion = 42;
+	objects = {
+
+/* Begin PBXBuildFile section */
+		C852874814C5BF6800AE6996 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4B69E1D0A3A1BDC003C02F2 /* main.cpp */; };
+		C852874914C5BF6800AE6996 /* testApp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4B69E1E0A3A1BDC003C02F2 /* testApp.cpp */; };
+		C852874A14C5BF6800AE6996 /* melodyTriangle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C8E1D9D914BF50E0000A0193 /* melodyTriangle.cpp */; };
+		C852874B14C5BF6800AE6996 /* Voice.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C8E1DA4214BF60B7000A0193 /* Voice.cpp */; };
+		C852874C14C5BF6800AE6996 /* ofxOscBundle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C8B1A91F14C47861003CDFD0 /* ofxOscBundle.cpp */; };
+		C852874D14C5BF6800AE6996 /* ofxOscMessage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C8B1A92114C47861003CDFD0 /* ofxOscMessage.cpp */; };
+		C852874E14C5BF6800AE6996 /* ofxOscReceiver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C8B1A92314C47861003CDFD0 /* ofxOscReceiver.cpp */; };
+		C852874F14C5BF6800AE6996 /* ofxOscSender.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C8B1A92514C47861003CDFD0 /* ofxOscSender.cpp */; };
+		C852875114C5BF6800AE6996 /* openFrameworksDebug.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E4C2421E10CC549C004149E2 /* openFrameworksDebug.a */; };
+		C852875214C5BF6800AE6996 /* GLee.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E45BE0A90E8CC67C009D7055 /* GLee.a */; };
+		C852875314C5BF6800AE6996 /* rtAudio.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E45BE2E30E8CC69C009D7055 /* rtAudio.a */; };
+		C852875414C5BF6800AE6996 /* AGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E45BE9710E8CC7DD009D7055 /* AGL.framework */; };
+		C852875514C5BF6800AE6996 /* ApplicationServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E45BE9720E8CC7DD009D7055 /* ApplicationServices.framework */; };
+		C852875614C5BF6800AE6996 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E45BE9730E8CC7DD009D7055 /* AudioToolbox.framework */; };
+		C852875714C5BF6800AE6996 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E45BE9740E8CC7DD009D7055 /* Carbon.framework */; };
+		C852875814C5BF6800AE6996 /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E45BE9750E8CC7DD009D7055 /* CoreAudio.framework */; };
+		C852875914C5BF6800AE6996 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E45BE9760E8CC7DD009D7055 /* CoreFoundation.framework */; };
+		C852875A14C5BF6800AE6996 /* CoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E45BE9770E8CC7DD009D7055 /* CoreServices.framework */; };
+		C852875B14C5BF6800AE6996 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E45BE9790E8CC7DD009D7055 /* OpenGL.framework */; };
+		C852875C14C5BF6800AE6996 /* QuickTime.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E45BE97A0E8CC7DD009D7055 /* QuickTime.framework */; };
+		C852875D14C5BF6800AE6996 /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E4C2424410CC5A17004149E2 /* AppKit.framework */; };
+		C852875E14C5BF6800AE6996 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E4C2424510CC5A17004149E2 /* Cocoa.framework */; };
+		C852875F14C5BF6800AE6996 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E4C2424610CC5A17004149E2 /* IOKit.framework */; };
+		C852876014C5BF6800AE6996 /* GLUT.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E4C2425F10CC5A78004149E2 /* GLUT.framework */; };
+		C852876114C5BF6800AE6996 /* CppUnit.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E4C2427A10CC5B66004149E2 /* CppUnit.a */; };
+		C852876214C5BF6800AE6996 /* PocoFoundation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E4C2427B10CC5B66004149E2 /* PocoFoundation.a */; };
+		C852876314C5BF6800AE6996 /* PocoNet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E4C2427C10CC5B66004149E2 /* PocoNet.a */; };
+		C852876414C5BF6800AE6996 /* PocoUtil.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E4C2427D10CC5B66004149E2 /* PocoUtil.a */; };
+		C852876514C5BF6800AE6996 /* PocoXML.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E4C2427E10CC5B66004149E2 /* PocoXML.a */; };
+		C852876614C5BF6800AE6996 /* freetype.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E4C2429310CC5C38004149E2 /* freetype.a */; };
+		C852876714C5BF6800AE6996 /* libfmodex.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = E4C242CC10CC650E004149E2 /* libfmodex.dylib */; };
+		C852876814C5BF6800AE6996 /* freeimage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E4C246D910CCAE22004149E2 /* freeimage.a */; };
+		C852876914C5BF6800AE6996 /* osc.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C8B1A91B14C47861003CDFD0 /* osc.a */; };
+		C852876C14C5BF6800AE6996 /* GLUT.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = E4C2425F10CC5A78004149E2 /* GLUT.framework */; };
+		C8B1A92714C47861003CDFD0 /* osc.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C8B1A91B14C47861003CDFD0 /* osc.a */; };
+		C8B1A92814C47861003CDFD0 /* ofxOscBundle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C8B1A91F14C47861003CDFD0 /* ofxOscBundle.cpp */; };
+		C8B1A92914C47861003CDFD0 /* ofxOscMessage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C8B1A92114C47861003CDFD0 /* ofxOscMessage.cpp */; };
+		C8B1A92A14C47861003CDFD0 /* ofxOscReceiver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C8B1A92314C47861003CDFD0 /* ofxOscReceiver.cpp */; };
+		C8B1A92B14C47861003CDFD0 /* ofxOscSender.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C8B1A92514C47861003CDFD0 /* ofxOscSender.cpp */; };
+		C8E1D9DB14BF50E0000A0193 /* melodyTriangle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C8E1D9D914BF50E0000A0193 /* melodyTriangle.cpp */; };
+		C8E1DA4314BF60B7000A0193 /* Voice.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C8E1DA4214BF60B7000A0193 /* Voice.cpp */; };
+		E45BE0AA0E8CC67C009D7055 /* GLee.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E45BE0A90E8CC67C009D7055 /* GLee.a */; };
+		E45BE2E40E8CC69C009D7055 /* rtAudio.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E45BE2E30E8CC69C009D7055 /* rtAudio.a */; };
+		E45BE97B0E8CC7DD009D7055 /* AGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E45BE9710E8CC7DD009D7055 /* AGL.framework */; };
+		E45BE97C0E8CC7DD009D7055 /* ApplicationServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E45BE9720E8CC7DD009D7055 /* ApplicationServices.framework */; };
+		E45BE97D0E8CC7DD009D7055 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E45BE9730E8CC7DD009D7055 /* AudioToolbox.framework */; };
+		E45BE97E0E8CC7DD009D7055 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E45BE9740E8CC7DD009D7055 /* Carbon.framework */; };
+		E45BE97F0E8CC7DD009D7055 /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E45BE9750E8CC7DD009D7055 /* CoreAudio.framework */; };
+		E45BE9800E8CC7DD009D7055 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E45BE9760E8CC7DD009D7055 /* CoreFoundation.framework */; };
+		E45BE9810E8CC7DD009D7055 /* CoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E45BE9770E8CC7DD009D7055 /* CoreServices.framework */; };
+		E45BE9830E8CC7DD009D7055 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E45BE9790E8CC7DD009D7055 /* OpenGL.framework */; };
+		E45BE9840E8CC7DD009D7055 /* QuickTime.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E45BE97A0E8CC7DD009D7055 /* QuickTime.framework */; };
+		E4B69E200A3A1BDC003C02F2 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4B69E1D0A3A1BDC003C02F2 /* main.cpp */; };
+		E4B69E210A3A1BDC003C02F2 /* testApp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4B69E1E0A3A1BDC003C02F2 /* testApp.cpp */; };
+		E4C2422B10CC554B004149E2 /* openFrameworksDebug.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E4C2421E10CC549C004149E2 /* openFrameworksDebug.a */; };
+		E4C2424710CC5A17004149E2 /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E4C2424410CC5A17004149E2 /* AppKit.framework */; };
+		E4C2424810CC5A17004149E2 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E4C2424510CC5A17004149E2 /* Cocoa.framework */; };
+		E4C2424910CC5A17004149E2 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E4C2424610CC5A17004149E2 /* IOKit.framework */; };
+		E4C2426610CC5A78004149E2 /* GLUT.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E4C2425F10CC5A78004149E2 /* GLUT.framework */; };
+		E4C2426B10CC5AA6004149E2 /* GLUT.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = E4C2425F10CC5A78004149E2 /* GLUT.framework */; };
+		E4C2427F10CC5B66004149E2 /* CppUnit.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E4C2427A10CC5B66004149E2 /* CppUnit.a */; };
+		E4C2428010CC5B66004149E2 /* PocoFoundation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E4C2427B10CC5B66004149E2 /* PocoFoundation.a */; };
+		E4C2428110CC5B66004149E2 /* PocoNet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E4C2427C10CC5B66004149E2 /* PocoNet.a */; };
+		E4C2428210CC5B66004149E2 /* PocoUtil.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E4C2427D10CC5B66004149E2 /* PocoUtil.a */; };
+		E4C2428310CC5B66004149E2 /* PocoXML.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E4C2427E10CC5B66004149E2 /* PocoXML.a */; };
+		E4C2429410CC5C38004149E2 /* freetype.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E4C2429310CC5C38004149E2 /* freetype.a */; };
+		E4C242CD10CC650E004149E2 /* libfmodex.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = E4C242CC10CC650E004149E2 /* libfmodex.dylib */; };
+		E4C246DA10CCAE22004149E2 /* freeimage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E4C246D910CCAE22004149E2 /* freeimage.a */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+		C852874614C5BF6800AE6996 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = E4C2421610CC549C004149E2 /* openFrameworksLib.xcodeproj */;
+			proxyType = 1;
+			remoteGlobalIDString = E4B27C1410CBEB8E00536013;
+			remoteInfo = openFrameworks;
+		};
+		E4C2421D10CC549C004149E2 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = E4C2421610CC549C004149E2 /* openFrameworksLib.xcodeproj */;
+			proxyType = 2;
+			remoteGlobalIDString = E4B27C1510CBEB8E00536013;
+			remoteInfo = openFrameworks;
+		};
+		E4C2422710CC54DA004149E2 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = E4C2421610CC549C004149E2 /* openFrameworksLib.xcodeproj */;
+			proxyType = 1;
+			remoteGlobalIDString = E4B27C1410CBEB8E00536013;
+			remoteInfo = openFrameworks;
+		};
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+		C852876B14C5BF6800AE6996 /* CopyFiles */ = {
+			isa = PBXCopyFilesBuildPhase;
+			buildActionMask = 2147483647;
+			dstPath = "";
+			dstSubfolderSpec = 10;
+			files = (
+				C852876C14C5BF6800AE6996 /* GLUT.framework in CopyFiles */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		E4C2427710CC5ABF004149E2 /* CopyFiles */ = {
+			isa = PBXCopyFilesBuildPhase;
+			buildActionMask = 2147483647;
+			dstPath = "";
+			dstSubfolderSpec = 10;
+			files = (
+				E4C2426B10CC5AA6004149E2 /* GLUT.framework in CopyFiles */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+		C852873414C5BF1A00AE6996 /* MelodyTriangle_Windowed-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "MelodyTriangle_Windowed-Info.plist"; sourceTree = "<group>"; };
+		C852877114C5BF6800AE6996 /* MelodyTriangle_windowed.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = MelodyTriangle_windowed.app; sourceTree = BUILT_PRODUCTS_DIR; };
+		C852877314C5BF6800AE6996 /* MelodyTriangle copy.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "MelodyTriangle copy.plist"; sourceTree = "<group>"; };
+		C8B1A90614C47861003CDFD0 /* install.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = install.xml; sourceTree = "<group>"; };
+		C8B1A90B14C47861003CDFD0 /* IpEndpointName.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IpEndpointName.h; sourceTree = "<group>"; };
+		C8B1A90C14C47861003CDFD0 /* NetworkingUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NetworkingUtils.h; sourceTree = "<group>"; };
+		C8B1A90D14C47861003CDFD0 /* PacketListener.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PacketListener.h; sourceTree = "<group>"; };
+		C8B1A90E14C47861003CDFD0 /* TimerListener.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TimerListener.h; sourceTree = "<group>"; };
+		C8B1A90F14C47861003CDFD0 /* UdpSocket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UdpSocket.h; sourceTree = "<group>"; };
+		C8B1A91114C47861003CDFD0 /* MessageMappingOscPacketListener.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MessageMappingOscPacketListener.h; sourceTree = "<group>"; };
+		C8B1A91214C47861003CDFD0 /* OscException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OscException.h; sourceTree = "<group>"; };
+		C8B1A91314C47861003CDFD0 /* OscHostEndianness.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OscHostEndianness.h; sourceTree = "<group>"; };
+		C8B1A91414C47861003CDFD0 /* OscOutboundPacketStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OscOutboundPacketStream.h; sourceTree = "<group>"; };
+		C8B1A91514C47861003CDFD0 /* OscPacketListener.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OscPacketListener.h; sourceTree = "<group>"; };
+		C8B1A91614C47861003CDFD0 /* OscPrintReceivedElements.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OscPrintReceivedElements.h; sourceTree = "<group>"; };
+		C8B1A91714C47861003CDFD0 /* OscReceivedElements.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OscReceivedElements.h; sourceTree = "<group>"; };
+		C8B1A91814C47861003CDFD0 /* OscTypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OscTypes.h; sourceTree = "<group>"; };
+		C8B1A91B14C47861003CDFD0 /* osc.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = osc.a; sourceTree = "<group>"; };
+		C8B1A91D14C47861003CDFD0 /* ofxOsc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ofxOsc.h; sourceTree = "<group>"; };
+		C8B1A91E14C47861003CDFD0 /* ofxOscArg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ofxOscArg.h; sourceTree = "<group>"; };
+		C8B1A91F14C47861003CDFD0 /* ofxOscBundle.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ofxOscBundle.cpp; sourceTree = "<group>"; };
+		C8B1A92014C47861003CDFD0 /* ofxOscBundle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ofxOscBundle.h; sourceTree = "<group>"; };
+		C8B1A92114C47861003CDFD0 /* ofxOscMessage.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ofxOscMessage.cpp; sourceTree = "<group>"; };
+		C8B1A92214C47861003CDFD0 /* ofxOscMessage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ofxOscMessage.h; sourceTree = "<group>"; };
+		C8B1A92314C47861003CDFD0 /* ofxOscReceiver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ofxOscReceiver.cpp; sourceTree = "<group>"; };
+		C8B1A92414C47861003CDFD0 /* ofxOscReceiver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ofxOscReceiver.h; sourceTree = "<group>"; };
+		C8B1A92514C47861003CDFD0 /* ofxOscSender.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ofxOscSender.cpp; sourceTree = "<group>"; };
+		C8B1A92614C47861003CDFD0 /* ofxOscSender.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ofxOscSender.h; sourceTree = "<group>"; };
+		C8E1D9D914BF50E0000A0193 /* melodyTriangle.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = melodyTriangle.cpp; sourceTree = "<group>"; };
+		C8E1D9DA14BF50E0000A0193 /* melodyTriangle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = melodyTriangle.h; sourceTree = "<group>"; };
+		C8E1DA4114BF60B7000A0193 /* Voice.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Voice.h; sourceTree = "<group>"; };
+		C8E1DA4214BF60B7000A0193 /* Voice.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Voice.cpp; sourceTree = "<group>"; };
+		E45BE0390E8CC647009D7055 /* FreeImage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FreeImage.h; path = ../../../libs/freeimage/include/FreeImage.h; sourceTree = SOURCE_ROOT; };
+		E45BE03F0E8CC650009D7055 /* fmod.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = fmod.h; path = ../../../libs/fmodex/include/fmod.h; sourceTree = SOURCE_ROOT; };
+		E45BE0400E8CC650009D7055 /* fmod.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = fmod.hpp; path = ../../../libs/fmodex/include/fmod.hpp; sourceTree = SOURCE_ROOT; };
+		E45BE0410E8CC650009D7055 /* fmod_codec.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = fmod_codec.h; path = ../../../libs/fmodex/include/fmod_codec.h; sourceTree = SOURCE_ROOT; };
+		E45BE0420E8CC650009D7055 /* fmod_dsp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = fmod_dsp.h; path = ../../../libs/fmodex/include/fmod_dsp.h; sourceTree = SOURCE_ROOT; };
+		E45BE0430E8CC650009D7055 /* fmod_errors.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = fmod_errors.h; path = ../../../libs/fmodex/include/fmod_errors.h; sourceTree = SOURCE_ROOT; };
+		E45BE0440E8CC650009D7055 /* fmod_output.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = fmod_output.h; path = ../../../libs/fmodex/include/fmod_output.h; sourceTree = SOURCE_ROOT; };
+		E45BE0A70E8CC67C009D7055 /* GLee.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GLee.h; path = ../../../libs/GLee/include/GLee.h; sourceTree = SOURCE_ROOT; };
+		E45BE0A90E8CC67C009D7055 /* GLee.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = GLee.a; path = ../../../libs/GLee/lib/osx/GLee.a; sourceTree = SOURCE_ROOT; };
+		E45BE2E00E8CC69C009D7055 /* RtAudio.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RtAudio.h; path = ../../../libs/rtAudio/include/RtAudio.h; sourceTree = SOURCE_ROOT; };
+		E45BE2E10E8CC69C009D7055 /* RtError.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RtError.h; path = ../../../libs/rtAudio/include/RtError.h; sourceTree = SOURCE_ROOT; };
+		E45BE2E30E8CC69C009D7055 /* rtAudio.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = rtAudio.a; path = ../../../libs/rtAudio/lib/osx/rtAudio.a; sourceTree = SOURCE_ROOT; };
+		E45BE9710E8CC7DD009D7055 /* AGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AGL.framework; path = /System/Library/Frameworks/AGL.framework; sourceTree = "<absolute>"; };
+		E45BE9720E8CC7DD009D7055 /* ApplicationServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ApplicationServices.framework; path = /System/Library/Frameworks/ApplicationServices.framework; sourceTree = "<absolute>"; };
+		E45BE9730E8CC7DD009D7055 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = /System/Library/Frameworks/AudioToolbox.framework; sourceTree = "<absolute>"; };
+		E45BE9740E8CC7DD009D7055 /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = /System/Library/Frameworks/Carbon.framework; sourceTree = "<absolute>"; };
+		E45BE9750E8CC7DD009D7055 /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = /System/Library/Frameworks/CoreAudio.framework; sourceTree = "<absolute>"; };
+		E45BE9760E8CC7DD009D7055 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = /System/Library/Frameworks/CoreFoundation.framework; sourceTree = "<absolute>"; };
+		E45BE9770E8CC7DD009D7055 /* CoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreServices.framework; path = /System/Library/Frameworks/CoreServices.framework; sourceTree = "<absolute>"; };
+		E45BE9790E8CC7DD009D7055 /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = /System/Library/Frameworks/OpenGL.framework; sourceTree = "<absolute>"; };
+		E45BE97A0E8CC7DD009D7055 /* QuickTime.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuickTime.framework; path = /System/Library/Frameworks/QuickTime.framework; sourceTree = "<absolute>"; };
+		E4B69B5B0A3A1756003C02F2 /* MelodyTriangle.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = MelodyTriangle.app; sourceTree = BUILT_PRODUCTS_DIR; };
+		E4B69E1D0A3A1BDC003C02F2 /* main.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = main.cpp; path = src/main.cpp; sourceTree = SOURCE_ROOT; };
+		E4B69E1E0A3A1BDC003C02F2 /* testApp.cpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.cpp; fileEncoding = 30; name = testApp.cpp; path = src/testApp.cpp; sourceTree = SOURCE_ROOT; };
+		E4B69E1F0A3A1BDC003C02F2 /* testApp.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = testApp.h; path = src/testApp.h; sourceTree = SOURCE_ROOT; };
+		E4B6FCAD0C3E899E008CF71C /* MelodyTriangle.plist */ = {isa = PBXFileReference; explicitFileType = text.plist.xml; fileEncoding = 30; path = MelodyTriangle.plist; sourceTree = "<group>"; };
+		E4C2421610CC549C004149E2 /* openFrameworksLib.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = openFrameworksLib.xcodeproj; path = ../../../libs/openFrameworksCompiled/project/osx/openFrameworksLib.xcodeproj; sourceTree = SOURCE_ROOT; };
+		E4C2424410CC5A17004149E2 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = "<absolute>"; };
+		E4C2424510CC5A17004149E2 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = "<absolute>"; };
+		E4C2424610CC5A17004149E2 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = /System/Library/Frameworks/IOKit.framework; sourceTree = "<absolute>"; };
+		E4C2425F10CC5A78004149E2 /* GLUT.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GLUT.framework; path = ../../../libs/glut/lib/osx/GLUT.framework; sourceTree = SOURCE_ROOT; };
+		E4C2427A10CC5B66004149E2 /* CppUnit.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = CppUnit.a; path = ../../../libs/poco/lib/osx/CppUnit.a; sourceTree = SOURCE_ROOT; };
+		E4C2427B10CC5B66004149E2 /* PocoFoundation.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = PocoFoundation.a; path = ../../../libs/poco/lib/osx/PocoFoundation.a; sourceTree = SOURCE_ROOT; };
+		E4C2427C10CC5B66004149E2 /* PocoNet.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = PocoNet.a; path = ../../../libs/poco/lib/osx/PocoNet.a; sourceTree = SOURCE_ROOT; };
+		E4C2427D10CC5B66004149E2 /* PocoUtil.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = PocoUtil.a; path = ../../../libs/poco/lib/osx/PocoUtil.a; sourceTree = SOURCE_ROOT; };
+		E4C2427E10CC5B66004149E2 /* PocoXML.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = PocoXML.a; path = ../../../libs/poco/lib/osx/PocoXML.a; sourceTree = SOURCE_ROOT; };
+		E4C2429310CC5C38004149E2 /* freetype.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = freetype.a; path = ../../../libs/freetype/lib/osx/freetype.a; sourceTree = SOURCE_ROOT; };
+		E4C242CC10CC650E004149E2 /* libfmodex.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libfmodex.dylib; path = ../../../libs/fmodex/lib/osx/libfmodex.dylib; sourceTree = SOURCE_ROOT; };
+		E4C246D910CCAE22004149E2 /* freeimage.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = freeimage.a; path = ../../../libs/FreeImage/lib/osx/freeimage.a; sourceTree = SOURCE_ROOT; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+		C852875014C5BF6800AE6996 /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				C852875114C5BF6800AE6996 /* openFrameworksDebug.a in Frameworks */,
+				C852875214C5BF6800AE6996 /* GLee.a in Frameworks */,
+				C852875314C5BF6800AE6996 /* rtAudio.a in Frameworks */,
+				C852875414C5BF6800AE6996 /* AGL.framework in Frameworks */,
+				C852875514C5BF6800AE6996 /* ApplicationServices.framework in Frameworks */,
+				C852875614C5BF6800AE6996 /* AudioToolbox.framework in Frameworks */,
+				C852875714C5BF6800AE6996 /* Carbon.framework in Frameworks */,
+				C852875814C5BF6800AE6996 /* CoreAudio.framework in Frameworks */,
+				C852875914C5BF6800AE6996 /* CoreFoundation.framework in Frameworks */,
+				C852875A14C5BF6800AE6996 /* CoreServices.framework in Frameworks */,
+				C852875B14C5BF6800AE6996 /* OpenGL.framework in Frameworks */,
+				C852875C14C5BF6800AE6996 /* QuickTime.framework in Frameworks */,
+				C852875D14C5BF6800AE6996 /* AppKit.framework in Frameworks */,
+				C852875E14C5BF6800AE6996 /* Cocoa.framework in Frameworks */,
+				C852875F14C5BF6800AE6996 /* IOKit.framework in Frameworks */,
+				C852876014C5BF6800AE6996 /* GLUT.framework in Frameworks */,
+				C852876114C5BF6800AE6996 /* CppUnit.a in Frameworks */,
+				C852876214C5BF6800AE6996 /* PocoFoundation.a in Frameworks */,
+				C852876314C5BF6800AE6996 /* PocoNet.a in Frameworks */,
+				C852876414C5BF6800AE6996 /* PocoUtil.a in Frameworks */,
+				C852876514C5BF6800AE6996 /* PocoXML.a in Frameworks */,
+				C852876614C5BF6800AE6996 /* freetype.a in Frameworks */,
+				C852876714C5BF6800AE6996 /* libfmodex.dylib in Frameworks */,
+				C852876814C5BF6800AE6996 /* freeimage.a in Frameworks */,
+				C852876914C5BF6800AE6996 /* osc.a in Frameworks */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		E4B69B590A3A1756003C02F2 /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				E4C2422B10CC554B004149E2 /* openFrameworksDebug.a in Frameworks */,
+				E45BE0AA0E8CC67C009D7055 /* GLee.a in Frameworks */,
+				E45BE2E40E8CC69C009D7055 /* rtAudio.a in Frameworks */,
+				E45BE97B0E8CC7DD009D7055 /* AGL.framework in Frameworks */,
+				E45BE97C0E8CC7DD009D7055 /* ApplicationServices.framework in Frameworks */,
+				E45BE97D0E8CC7DD009D7055 /* AudioToolbox.framework in Frameworks */,
+				E45BE97E0E8CC7DD009D7055 /* Carbon.framework in Frameworks */,
+				E45BE97F0E8CC7DD009D7055 /* CoreAudio.framework in Frameworks */,
+				E45BE9800E8CC7DD009D7055 /* CoreFoundation.framework in Frameworks */,
+				E45BE9810E8CC7DD009D7055 /* CoreServices.framework in Frameworks */,
+				E45BE9830E8CC7DD009D7055 /* OpenGL.framework in Frameworks */,
+				E45BE9840E8CC7DD009D7055 /* QuickTime.framework in Frameworks */,
+				E4C2424710CC5A17004149E2 /* AppKit.framework in Frameworks */,
+				E4C2424810CC5A17004149E2 /* Cocoa.framework in Frameworks */,
+				E4C2424910CC5A17004149E2 /* IOKit.framework in Frameworks */,
+				E4C2426610CC5A78004149E2 /* GLUT.framework in Frameworks */,
+				E4C2427F10CC5B66004149E2 /* CppUnit.a in Frameworks */,
+				E4C2428010CC5B66004149E2 /* PocoFoundation.a in Frameworks */,
+				E4C2428110CC5B66004149E2 /* PocoNet.a in Frameworks */,
+				E4C2428210CC5B66004149E2 /* PocoUtil.a in Frameworks */,
+				E4C2428310CC5B66004149E2 /* PocoXML.a in Frameworks */,
+				E4C2429410CC5C38004149E2 /* freetype.a in Frameworks */,
+				E4C242CD10CC650E004149E2 /* libfmodex.dylib in Frameworks */,
+				E4C246DA10CCAE22004149E2 /* freeimage.a in Frameworks */,
+				C8B1A92714C47861003CDFD0 /* osc.a in Frameworks */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+		C8B1A90514C47861003CDFD0 /* ofxOsc */ = {
+			isa = PBXGroup;
+			children = (
+				C8B1A90614C47861003CDFD0 /* install.xml */,
+				C8B1A90714C47861003CDFD0 /* libs */,
+				C8B1A91C14C47861003CDFD0 /* src */,
+			);
+			name = ofxOsc;
+			path = ../../../addons/ofxOsc;
+			sourceTree = SOURCE_ROOT;
+		};
+		C8B1A90714C47861003CDFD0 /* libs */ = {
+			isa = PBXGroup;
+			children = (
+				C8B1A90814C47861003CDFD0 /* oscpack */,
+			);
+			path = libs;
+			sourceTree = "<group>";
+		};
+		C8B1A90814C47861003CDFD0 /* oscpack */ = {
+			isa = PBXGroup;
+			children = (
+				C8B1A90914C47861003CDFD0 /* include */,
+				C8B1A91914C47861003CDFD0 /* lib */,
+			);
+			path = oscpack;
+			sourceTree = "<group>";
+		};
+		C8B1A90914C47861003CDFD0 /* include */ = {
+			isa = PBXGroup;
+			children = (
+				C8B1A90A14C47861003CDFD0 /* ip */,
+				C8B1A91014C47861003CDFD0 /* osc */,
+			);
+			path = include;
+			sourceTree = "<group>";
+		};
+		C8B1A90A14C47861003CDFD0 /* ip */ = {
+			isa = PBXGroup;
+			children = (
+				C8B1A90B14C47861003CDFD0 /* IpEndpointName.h */,
+				C8B1A90C14C47861003CDFD0 /* NetworkingUtils.h */,
+				C8B1A90D14C47861003CDFD0 /* PacketListener.h */,
+				C8B1A90E14C47861003CDFD0 /* TimerListener.h */,
+				C8B1A90F14C47861003CDFD0 /* UdpSocket.h */,
+			);
+			path = ip;
+			sourceTree = "<group>";
+		};
+		C8B1A91014C47861003CDFD0 /* osc */ = {
+			isa = PBXGroup;
+			children = (
+				C8B1A91114C47861003CDFD0 /* MessageMappingOscPacketListener.h */,
+				C8B1A91214C47861003CDFD0 /* OscException.h */,
+				C8B1A91314C47861003CDFD0 /* OscHostEndianness.h */,
+				C8B1A91414C47861003CDFD0 /* OscOutboundPacketStream.h */,
+				C8B1A91514C47861003CDFD0 /* OscPacketListener.h */,
+				C8B1A91614C47861003CDFD0 /* OscPrintReceivedElements.h */,
+				C8B1A91714C47861003CDFD0 /* OscReceivedElements.h */,
+				C8B1A91814C47861003CDFD0 /* OscTypes.h */,
+			);
+			path = osc;
+			sourceTree = "<group>";
+		};
+		C8B1A91914C47861003CDFD0 /* lib */ = {
+			isa = PBXGroup;
+			children = (
+				C8B1A91A14C47861003CDFD0 /* osx */,
+			);
+			path = lib;
+			sourceTree = "<group>";
+		};
+		C8B1A91A14C47861003CDFD0 /* osx */ = {
+			isa = PBXGroup;
+			children = (
+				C8B1A91B14C47861003CDFD0 /* osc.a */,
+			);
+			path = osx;
+			sourceTree = "<group>";
+		};
+		C8B1A91C14C47861003CDFD0 /* src */ = {
+			isa = PBXGroup;
+			children = (
+				C8B1A91D14C47861003CDFD0 /* ofxOsc.h */,
+				C8B1A91E14C47861003CDFD0 /* ofxOscArg.h */,
+				C8B1A91F14C47861003CDFD0 /* ofxOscBundle.cpp */,
+				C8B1A92014C47861003CDFD0 /* ofxOscBundle.h */,
+				C8B1A92114C47861003CDFD0 /* ofxOscMessage.cpp */,
+				C8B1A92214C47861003CDFD0 /* ofxOscMessage.h */,
+				C8B1A92314C47861003CDFD0 /* ofxOscReceiver.cpp */,
+				C8B1A92414C47861003CDFD0 /* ofxOscReceiver.h */,
+				C8B1A92514C47861003CDFD0 /* ofxOscSender.cpp */,
+				C8B1A92614C47861003CDFD0 /* ofxOscSender.h */,
+			);
+			path = src;
+			sourceTree = "<group>";
+		};
+		E45BE0360E8CC5DE009D7055 /* libs */ = {
+			isa = PBXGroup;
+			children = (
+				E45BEED60E8CCB34009D7055 /* core */,
+			);
+			name = libs;
+			sourceTree = "<group>";
+		};
+		E45BE0370E8CC647009D7055 /* freeimage */ = {
+			isa = PBXGroup;
+			children = (
+				E4C246D810CCAE22004149E2 /* osx */,
+				E45BE0380E8CC647009D7055 /* include */,
+			);
+			name = freeimage;
+			path = ../../../libs/freeimage;
+			sourceTree = SOURCE_ROOT;
+		};
+		E45BE0380E8CC647009D7055 /* include */ = {
+			isa = PBXGroup;
+			children = (
+				E45BE0390E8CC647009D7055 /* FreeImage.h */,
+			);
+			name = include;
+			path = ../../../libs/freeimage/include;
+			sourceTree = SOURCE_ROOT;
+		};
+		E45BE03D0E8CC650009D7055 /* fmodex */ = {
+			isa = PBXGroup;
+			children = (
+				E45BE03E0E8CC650009D7055 /* inc */,
+				E4C2428E10CC5C18004149E2 /* osx */,
+			);
+			name = fmodex;
+			path = ../../../libs/fmodex;
+			sourceTree = SOURCE_ROOT;
+		};
+		E45BE03E0E8CC650009D7055 /* inc */ = {
+			isa = PBXGroup;
+			children = (
+				E45BE03F0E8CC650009D7055 /* fmod.h */,
+				E45BE0400E8CC650009D7055 /* fmod.hpp */,
+				E45BE0410E8CC650009D7055 /* fmod_codec.h */,
+				E45BE0420E8CC650009D7055 /* fmod_dsp.h */,
+				E45BE0430E8CC650009D7055 /* fmod_errors.h */,
+				E45BE0440E8CC650009D7055 /* fmod_output.h */,
+			);
+			name = inc;
+			path = ../../../libs/fmodex/include;
+			sourceTree = SOURCE_ROOT;
+		};
+		E45BE0480E8CC657009D7055 /* core libraries */ = {
+			isa = PBXGroup;
+			children = (
+				E4C2425B10CC5A78004149E2 /* glut */,
+				E45BEC7B0E8CC911009D7055 /* poco */,
+				E45BE2D50E8CC69C009D7055 /* rtAudio */,
+				E45BE0A50E8CC67C009D7055 /* GLee */,
+				E45BE0490E8CC676009D7055 /* freetype */,
+				E45BE03D0E8CC650009D7055 /* fmodex */,
+				E45BE0370E8CC647009D7055 /* freeimage */,
+			);
+			name = "core libraries";
+			sourceTree = "<group>";
+		};
+		E45BE0490E8CC676009D7055 /* freetype */ = {
+			isa = PBXGroup;
+			children = (
+				E4C2429210CC5C38004149E2 /* osx */,
+			);
+			name = freetype;
+			path = ../../../libs/freetype;
+			sourceTree = SOURCE_ROOT;
+		};
+		E45BE0A50E8CC67C009D7055 /* GLee */ = {
+			isa = PBXGroup;
+			children = (
+				E45BE0A60E8CC67C009D7055 /* include */,
+				E45BE0A80E8CC67C009D7055 /* lib */,
+			);
+			name = GLee;
+			path = ../../../libs/GLee;
+			sourceTree = SOURCE_ROOT;
+		};
+		E45BE0A60E8CC67C009D7055 /* include */ = {
+			isa = PBXGroup;
+			children = (
+				E45BE0A70E8CC67C009D7055 /* GLee.h */,
+			);
+			name = include;
+			path = ../../../libs/GLee/include;
+			sourceTree = SOURCE_ROOT;
+		};
+		E45BE0A80E8CC67C009D7055 /* lib */ = {
+			isa = PBXGroup;
+			children = (
+				E45BE0A90E8CC67C009D7055 /* GLee.a */,
+			);
+			name = lib;
+			path = ../../../libs/GLee/lib/osx;
+			sourceTree = SOURCE_ROOT;
+		};
+		E45BE2D50E8CC69C009D7055 /* rtAudio */ = {
+			isa = PBXGroup;
+			children = (
+				E45BE2D60E8CC69C009D7055 /* include */,
+				E45BE2E20E8CC69C009D7055 /* lib */,
+			);
+			name = rtAudio;
+			path = ../../../libs/rtAudio;
+			sourceTree = SOURCE_ROOT;
+		};
+		E45BE2D60E8CC69C009D7055 /* include */ = {
+			isa = PBXGroup;
+			children = (
+				E45BE2D70E8CC69C009D7055 /* asio */,
+				E45BE2E00E8CC69C009D7055 /* RtAudio.h */,
+				E45BE2E10E8CC69C009D7055 /* RtError.h */,
+			);
+			name = include;
+			path = ../../../libs/rtAudio/include;
+			sourceTree = SOURCE_ROOT;
+		};
+		E45BE2D70E8CC69C009D7055 /* asio */ = {
+			isa = PBXGroup;
+			children = (
+			);
+			name = asio;
+			path = ../../../libs/rtAudio/include/asio;
+			sourceTree = SOURCE_ROOT;
+		};
+		E45BE2E20E8CC69C009D7055 /* lib */ = {
+			isa = PBXGroup;
+			children = (
+				E45BE2E30E8CC69C009D7055 /* rtAudio.a */,
+			);
+			name = lib;
+			path = ../../../libs/rtAudio/lib/osx;
+			sourceTree = SOURCE_ROOT;
+		};
+		E45BE5980E8CC70C009D7055 /* core frameworks */ = {
+			isa = PBXGroup;
+			children = (
+				E4C2424410CC5A17004149E2 /* AppKit.framework */,
+				E4C2424510CC5A17004149E2 /* Cocoa.framework */,
+				E4C2424610CC5A17004149E2 /* IOKit.framework */,
+				E45BE9710E8CC7DD009D7055 /* AGL.framework */,
+				E45BE9720E8CC7DD009D7055 /* ApplicationServices.framework */,
+				E45BE9730E8CC7DD009D7055 /* AudioToolbox.framework */,
+				E45BE9740E8CC7DD009D7055 /* Carbon.framework */,
+				E45BE9750E8CC7DD009D7055 /* CoreAudio.framework */,
+				E45BE9760E8CC7DD009D7055 /* CoreFoundation.framework */,
+				E45BE9770E8CC7DD009D7055 /* CoreServices.framework */,
+				E45BE9790E8CC7DD009D7055 /* OpenGL.framework */,
+				E45BE97A0E8CC7DD009D7055 /* QuickTime.framework */,
+			);
+			name = "core frameworks";
+			sourceTree = "<group>";
+		};
+		E45BEC7B0E8CC911009D7055 /* poco */ = {
+			isa = PBXGroup;
+			children = (
+				E4C2427910CC5B66004149E2 /* osx */,
+			);
+			name = poco;
+			path = ../../../libs/poco;
+			sourceTree = SOURCE_ROOT;
+		};
+		E45BEED60E8CCB34009D7055 /* core */ = {
+			isa = PBXGroup;
+			children = (
+				E45BE0480E8CC657009D7055 /* core libraries */,
+				E45BE5980E8CC70C009D7055 /* core frameworks */,
+			);
+			name = core;
+			sourceTree = "<group>";
+		};
+		E4B69B4A0A3A1720003C02F2 = {
+			isa = PBXGroup;
+			children = (
+				E4B69B5B0A3A1756003C02F2 /* MelodyTriangle.app */,
+				E4B6FCAD0C3E899E008CF71C /* MelodyTriangle.plist */,
+				E4B69E1C0A3A1BDC003C02F2 /* src */,
+				E4C2422310CC54B6004149E2 /* openFrameworks */,
+				E45BE0360E8CC5DE009D7055 /* libs */,
+				C852873414C5BF1A00AE6996 /* MelodyTriangle_Windowed-Info.plist */,
+				C852877114C5BF6800AE6996 /* MelodyTriangle_windowed.app */,
+				C852877314C5BF6800AE6996 /* MelodyTriangle copy.plist */,
+			);
+			sourceTree = "<group>";
+		};
+		E4B69E1C0A3A1BDC003C02F2 /* src */ = {
+			isa = PBXGroup;
+			children = (
+				C8B1A90514C47861003CDFD0 /* ofxOsc */,
+				C8E1DA4114BF60B7000A0193 /* Voice.h */,
+				C8E1DA4214BF60B7000A0193 /* Voice.cpp */,
+				E4B69E1D0A3A1BDC003C02F2 /* main.cpp */,
+				E4B69E1E0A3A1BDC003C02F2 /* testApp.cpp */,
+				C8E1D9D914BF50E0000A0193 /* melodyTriangle.cpp */,
+				C8E1D9DA14BF50E0000A0193 /* melodyTriangle.h */,
+				E4B69E1F0A3A1BDC003C02F2 /* testApp.h */,
+			);
+			path = src;
+			sourceTree = SOURCE_ROOT;
+		};
+		E4C2421710CC549C004149E2 /* Products */ = {
+			isa = PBXGroup;
+			children = (
+				E4C2421E10CC549C004149E2 /* openFrameworksDebug.a */,
+			);
+			name = Products;
+			sourceTree = "<group>";
+		};
+		E4C2422310CC54B6004149E2 /* openFrameworks */ = {
+			isa = PBXGroup;
+			children = (
+				E4C2421610CC549C004149E2 /* openFrameworksLib.xcodeproj */,
+			);
+			name = openFrameworks;
+			sourceTree = "<group>";
+		};
+		E4C2425B10CC5A78004149E2 /* glut */ = {
+			isa = PBXGroup;
+			children = (
+				E4C2425D10CC5A78004149E2 /* lib */,
+			);
+			name = glut;
+			path = ../../../libs/glut;
+			sourceTree = SOURCE_ROOT;
+		};
+		E4C2425D10CC5A78004149E2 /* lib */ = {
+			isa = PBXGroup;
+			children = (
+				E4C2425E10CC5A78004149E2 /* osx */,
+			);
+			name = lib;
+			path = ../../../libs/glut/lib;
+			sourceTree = SOURCE_ROOT;
+		};
+		E4C2425E10CC5A78004149E2 /* osx */ = {
+			isa = PBXGroup;
+			children = (
+				E4C2425F10CC5A78004149E2 /* GLUT.framework */,
+			);
+			name = osx;
+			path = ../../../libs/glut/lib/osx;
+			sourceTree = SOURCE_ROOT;
+		};
+		E4C2427910CC5B66004149E2 /* osx */ = {
+			isa = PBXGroup;
+			children = (
+				E4C2427A10CC5B66004149E2 /* CppUnit.a */,
+				E4C2427B10CC5B66004149E2 /* PocoFoundation.a */,
+				E4C2427C10CC5B66004149E2 /* PocoNet.a */,
+				E4C2427D10CC5B66004149E2 /* PocoUtil.a */,
+				E4C2427E10CC5B66004149E2 /* PocoXML.a */,
+			);
+			name = osx;
+			path = ../../../libs/poco/lib/osx;
+			sourceTree = SOURCE_ROOT;
+		};
+		E4C2428E10CC5C18004149E2 /* osx */ = {
+			isa = PBXGroup;
+			children = (
+				E4C242CC10CC650E004149E2 /* libfmodex.dylib */,
+			);
+			name = osx;
+			path = ../../../libs/fmodex/lib/osx;
+			sourceTree = SOURCE_ROOT;
+		};
+		E4C2429210CC5C38004149E2 /* osx */ = {
+			isa = PBXGroup;
+			children = (
+				E4C2429310CC5C38004149E2 /* freetype.a */,
+			);
+			name = osx;
+			path = ../../../libs/freetype/lib/osx;
+			sourceTree = SOURCE_ROOT;
+		};
+		E4C246D810CCAE22004149E2 /* osx */ = {
+			isa = PBXGroup;
+			children = (
+				E4C246D910CCAE22004149E2 /* freeimage.a */,
+			);
+			name = osx;
+			path = ../../../libs/FreeImage/lib/osx;
+			sourceTree = SOURCE_ROOT;
+		};
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+		C852874414C5BF6800AE6996 /* MelodyTriangle_windowed */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = C852876D14C5BF6800AE6996 /* Build configuration list for PBXNativeTarget "MelodyTriangle_windowed" */;
+			buildPhases = (
+				C852874714C5BF6800AE6996 /* Sources */,
+				C852875014C5BF6800AE6996 /* Frameworks */,
+				C852876A14C5BF6800AE6996 /* ShellScript */,
+				C852876B14C5BF6800AE6996 /* CopyFiles */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+				C852874514C5BF6800AE6996 /* PBXTargetDependency */,
+			);
+			name = MelodyTriangle_windowed;
+			productName = myOFApp;
+			productReference = C852877114C5BF6800AE6996 /* MelodyTriangle_windowed.app */;
+			productType = "com.apple.product-type.application";
+		};
+		E4B69B5A0A3A1756003C02F2 /* MelodyTriangle */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = E4B69B5F0A3A1757003C02F2 /* Build configuration list for PBXNativeTarget "MelodyTriangle" */;
+			buildPhases = (
+				E4B69B580A3A1756003C02F2 /* Sources */,
+				E4B69B590A3A1756003C02F2 /* Frameworks */,
+				E4B6FFFD0C3F9AB9008CF71C /* ShellScript */,
+				E4C2427710CC5ABF004149E2 /* CopyFiles */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+				E4C2422810CC54DA004149E2 /* PBXTargetDependency */,
+			);
+			name = MelodyTriangle;
+			productName = myOFApp;
+			productReference = E4B69B5B0A3A1756003C02F2 /* MelodyTriangle.app */;
+			productType = "com.apple.product-type.application";
+		};
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+		E4B69B4C0A3A1720003C02F2 /* Project object */ = {
+			isa = PBXProject;
+			buildConfigurationList = E4B69B4D0A3A1720003C02F2 /* Build configuration list for PBXProject "MelodyTriangle" */;
+			compatibilityVersion = "Xcode 2.4";
+			developmentRegion = English;
+			hasScannedForEncodings = 0;
+			knownRegions = (
+				English,
+				Japanese,
+				French,
+				German,
+			);
+			mainGroup = E4B69B4A0A3A1720003C02F2;
+			productRefGroup = E4B69B4A0A3A1720003C02F2;
+			projectDirPath = "";
+			projectReferences = (
+				{
+					ProductGroup = E4C2421710CC549C004149E2 /* Products */;
+					ProjectRef = E4C2421610CC549C004149E2 /* openFrameworksLib.xcodeproj */;
+				},
+			);
+			projectRoot = "";
+			targets = (
+				E4B69B5A0A3A1756003C02F2 /* MelodyTriangle */,
+				C852874414C5BF6800AE6996 /* MelodyTriangle_windowed */,
+			);
+		};
+/* End PBXProject section */
+
+/* Begin PBXReferenceProxy section */
+		E4C2421E10CC549C004149E2 /* openFrameworksDebug.a */ = {
+			isa = PBXReferenceProxy;
+			fileType = archive.ar;
+			path = openFrameworksDebug.a;
+			remoteRef = E4C2421D10CC549C004149E2 /* PBXContainerItemProxy */;
+			sourceTree = BUILT_PRODUCTS_DIR;
+		};
+/* End PBXReferenceProxy section */
+
+/* Begin PBXShellScriptBuildPhase section */
+		C852876A14C5BF6800AE6996 /* ShellScript */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputPaths = (
+			);
+			outputPaths = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "cp -f ../../../libs/fmodex/lib/osx/libfmodex.dylib \"$TARGET_BUILD_DIR/$PRODUCT_NAME.app/Contents/MacOS/libfmodex.dylib\"\ninstall_name_tool -change ./libfmodex.dylib @executable_path/libfmodex.dylib \"$TARGET_BUILD_DIR/$PRODUCT_NAME.app/Contents/MacOS/$PRODUCT_NAME\" ";
+		};
+		E4B6FFFD0C3F9AB9008CF71C /* ShellScript */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputPaths = (
+			);
+			outputPaths = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "cp -f ../../../libs/fmodex/lib/osx/libfmodex.dylib \"$TARGET_BUILD_DIR/$PRODUCT_NAME.app/Contents/MacOS/libfmodex.dylib\"\ninstall_name_tool -change ./libfmodex.dylib @executable_path/libfmodex.dylib \"$TARGET_BUILD_DIR/$PRODUCT_NAME.app/Contents/MacOS/$PRODUCT_NAME\" ";
+		};
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+		C852874714C5BF6800AE6996 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				C852874814C5BF6800AE6996 /* main.cpp in Sources */,
+				C852874914C5BF6800AE6996 /* testApp.cpp in Sources */,
+				C852874A14C5BF6800AE6996 /* melodyTriangle.cpp in Sources */,
+				C852874B14C5BF6800AE6996 /* Voice.cpp in Sources */,
+				C852874C14C5BF6800AE6996 /* ofxOscBundle.cpp in Sources */,
+				C852874D14C5BF6800AE6996 /* ofxOscMessage.cpp in Sources */,
+				C852874E14C5BF6800AE6996 /* ofxOscReceiver.cpp in Sources */,
+				C852874F14C5BF6800AE6996 /* ofxOscSender.cpp in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		E4B69B580A3A1756003C02F2 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				E4B69E200A3A1BDC003C02F2 /* main.cpp in Sources */,
+				E4B69E210A3A1BDC003C02F2 /* testApp.cpp in Sources */,
+				C8E1D9DB14BF50E0000A0193 /* melodyTriangle.cpp in Sources */,
+				C8E1DA4314BF60B7000A0193 /* Voice.cpp in Sources */,
+				C8B1A92814C47861003CDFD0 /* ofxOscBundle.cpp in Sources */,
+				C8B1A92914C47861003CDFD0 /* ofxOscMessage.cpp in Sources */,
+				C8B1A92A14C47861003CDFD0 /* ofxOscReceiver.cpp in Sources */,
+				C8B1A92B14C47861003CDFD0 /* ofxOscSender.cpp in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+		C852874514C5BF6800AE6996 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			name = openFrameworks;
+			targetProxy = C852874614C5BF6800AE6996 /* PBXContainerItemProxy */;
+		};
+		E4C2422810CC54DA004149E2 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			name = openFrameworks;
+			targetProxy = E4C2422710CC54DA004149E2 /* PBXContainerItemProxy */;
+		};
+/* End PBXTargetDependency section */
+
+/* Begin XCBuildConfiguration section */
+		C852876E14C5BF6800AE6996 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				COPY_PHASE_STRIP = NO;
+				FRAMEWORK_SEARCH_PATHS = (
+					"$(inherited)",
+					"$(FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1)",
+				);
+				FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(SRCROOT)/../../../libs/glut/lib/osx\"";
+				GCC_DYNAMIC_NO_PIC = NO;
+				GCC_ENABLE_FIX_AND_CONTINUE = YES;
+				GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
+				GCC_MODEL_TUNING = G4;
+				GCC_OPTIMIZATION_LEVEL = 0;
+				GCC_PRECOMPILE_PREFIX_HEADER = YES;
+				GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/Carbon.framework/Headers/Carbon.h";
+				INFOPLIST_FILE = "MelodyTriangle copy.plist";
+				INSTALL_PATH = "$(HOME)/Applications";
+				LIBRARY_SEARCH_PATHS = (
+					"$(inherited)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_1)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_3)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_4)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_5)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_6)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_7)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_8)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_9)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_10)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_11)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_12)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_13)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_14)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_15)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_1)",
+				);
+				LIBRARY_SEARCH_PATHS_QUOTED_1 = "\"$(SRCROOT)/../../../addons/ofxOsc/libs/oscpack/lib/osx\"";
+				LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(SRCROOT)/../../../libs/freeimage/lib/osx\"";
+				LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_14 = "\"$(SRCROOT)/../../../libs/fmodex/lib/osx\"";
+				LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_15 = "\"$(SRCROOT)/../../../libs/freetype/lib/osx\"";
+				LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2 = "\"$(SRCROOT)/../../../libs/FreeImage/lib/osx\"";
+				LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_4 = "\"$(SRCROOT)/../../../libs/GLee/lib/osx\"";
+				LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_5 = "\"$(SRCROOT)/../../../libs/poco/lib/osx\"";
+				LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_6 = "\"$(SRCROOT)/../../../libs/rtAudio/lib/osx\"";
+				PREBINDING = NO;
+				PRODUCT_NAME = "$(TARGET_NAME)Debug";
+				WRAPPER_EXTENSION = app;
+				ZERO_LINK = NO;
+			};
+			name = Debug;
+		};
+		C852876F14C5BF6800AE6996 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				COPY_PHASE_STRIP = YES;
+				FRAMEWORK_SEARCH_PATHS = (
+					"$(inherited)",
+					"$(FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1)",
+				);
+				FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(SRCROOT)/../../../libs/glut/lib/osx\"";
+				GCC_ENABLE_FIX_AND_CONTINUE = NO;
+				GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
+				GCC_MODEL_TUNING = G4;
+				GCC_PRECOMPILE_PREFIX_HEADER = YES;
+				GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/Carbon.framework/Headers/Carbon.h";
+				INFOPLIST_FILE = "MelodyTriangle copy.plist";
+				INSTALL_PATH = "$(HOME)/Applications";
+				LIBRARY_SEARCH_PATHS = (
+					"$(inherited)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_1)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_3)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_4)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_5)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_6)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_7)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_8)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_9)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_10)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_11)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_12)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_13)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_14)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_15)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_3)",
+				);
+				LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(SRCROOT)/../../../libs/freeimage/lib/osx\"";
+				LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_14 = "\"$(SRCROOT)/../../../libs/fmodex/lib/osx\"";
+				LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_15 = "\"$(SRCROOT)/../../../libs/freetype/lib/osx\"";
+				LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2 = "\"$(SRCROOT)/../../../libs/FreeImage/lib/osx\"";
+				LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_3 = "\"$(SRCROOT)/../../../addons/ofxOsc/libs/oscpack/lib/osx\"";
+				LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_4 = "\"$(SRCROOT)/../../../libs/GLee/lib/osx\"";
+				LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_5 = "\"$(SRCROOT)/../../../libs/poco/lib/osx\"";
+				LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_6 = "\"$(SRCROOT)/../../../libs/rtAudio/lib/osx\"";
+				PREBINDING = NO;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				WRAPPER_EXTENSION = app;
+				ZERO_LINK = NO;
+			};
+			name = Release;
+		};
+		C852877014C5BF6800AE6996 /* ReleaseUniversal */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				COPY_PHASE_STRIP = YES;
+				FRAMEWORK_SEARCH_PATHS = (
+					"$(inherited)",
+					"$(FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1)",
+				);
+				FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(SRCROOT)/../../../libs/glut/lib/osx\"";
+				GCC_ENABLE_FIX_AND_CONTINUE = NO;
+				GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
+				GCC_MODEL_TUNING = G4;
+				GCC_PRECOMPILE_PREFIX_HEADER = YES;
+				GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/Carbon.framework/Headers/Carbon.h";
+				INFOPLIST_FILE = "MelodyTriangle copy.plist";
+				INSTALL_PATH = "$(HOME)/Applications";
+				LIBRARY_SEARCH_PATHS = (
+					"$(inherited)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_1)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_3)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_4)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_5)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_6)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_7)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_8)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_9)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_10)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_11)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_12)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_13)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_14)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_15)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_1)",
+				);
+				LIBRARY_SEARCH_PATHS_QUOTED_1 = "\"$(SRCROOT)/../../../addons/ofxOsc/libs/oscpack/lib/osx\"";
+				LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(SRCROOT)/../../../libs/freeimage/lib/osx\"";
+				LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_14 = "\"$(SRCROOT)/../../../libs/fmodex/lib/osx\"";
+				LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_15 = "\"$(SRCROOT)/../../../libs/freetype/lib/osx\"";
+				LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2 = "\"$(SRCROOT)/../../../libs/FreeImage/lib/osx\"";
+				LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_4 = "\"$(SRCROOT)/../../../libs/GLee/lib/osx\"";
+				LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_5 = "\"$(SRCROOT)/../../../libs/poco/lib/osx\"";
+				LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_6 = "\"$(SRCROOT)/../../../libs/rtAudio/lib/osx\"";
+				PREBINDING = NO;
+				PRODUCT_NAME = "$(TARGET_NAME)Universal";
+				WRAPPER_EXTENSION = app;
+				ZERO_LINK = NO;
+			};
+			name = ReleaseUniversal;
+		};
+		E4B27CA010CBF8A600536013 /* ReleaseUniversal */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ARCHS = (
+					ppc,
+					i386,
+				);
+				CONFIGURATION_BUILD_DIR = "$(SRCROOT)/bin/";
+				COPY_PHASE_STRIP = YES;
+				DEAD_CODE_STRIPPING = YES;
+				GCC_AUTO_VECTORIZATION = YES;
+				GCC_ENABLE_SSE3_EXTENSIONS = YES;
+				GCC_ENABLE_SUPPLEMENTAL_SSE3_INSTRUCTIONS = YES;
+				GCC_INLINES_ARE_PRIVATE_EXTERN = NO;
+				GCC_MODEL_TUNING = G5;
+				GCC_OPTIMIZATION_LEVEL = 3;
+				GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+				GCC_UNROLL_LOOPS = YES;
+				GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO;
+				GCC_WARN_ABOUT_INVALID_OFFSETOF_MACRO = NO;
+				GCC_WARN_ALLOW_INCOMPLETE_PROTOCOL = NO;
+				GCC_WARN_UNINITIALIZED_AUTOS = NO;
+				GCC_WARN_UNUSED_VALUE = NO;
+				GCC_WARN_UNUSED_VARIABLE = NO;
+				HEADER_SEARCH_PATHS = (
+					"../../../libs/openFrameworks/**",
+					../../../libs/freetype/include/,
+					../../../libs/freetype/include/freetype2,
+					../../../libs/poco/include,
+					../../../addons/,
+				);
+				OTHER_CPLUSPLUSFLAGS = (
+					"-D__MACOSX_CORE__",
+					"-lpthread",
+				);
+				OTHER_LDFLAGS = "";
+			};
+			name = ReleaseUniversal;
+		};
+		E4B27CA110CBF8A600536013 /* ReleaseUniversal */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				COPY_PHASE_STRIP = YES;
+				FRAMEWORK_SEARCH_PATHS = (
+					"$(inherited)",
+					"$(FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1)",
+				);
+				FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(SRCROOT)/../../../libs/glut/lib/osx\"";
+				GCC_ENABLE_FIX_AND_CONTINUE = NO;
+				GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
+				GCC_MODEL_TUNING = G4;
+				GCC_PRECOMPILE_PREFIX_HEADER = YES;
+				GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/Carbon.framework/Headers/Carbon.h";
+				INFOPLIST_FILE = MelodyTriangle.plist;
+				INSTALL_PATH = "$(HOME)/Applications";
+				LIBRARY_SEARCH_PATHS = (
+					"$(inherited)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_1)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_3)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_4)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_5)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_6)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_7)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_8)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_9)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_10)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_11)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_12)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_13)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_14)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_15)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_1)",
+				);
+				LIBRARY_SEARCH_PATHS_QUOTED_1 = "\"$(SRCROOT)/../../../addons/ofxOsc/libs/oscpack/lib/osx\"";
+				LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(SRCROOT)/../../../libs/freeimage/lib/osx\"";
+				LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_14 = "\"$(SRCROOT)/../../../libs/fmodex/lib/osx\"";
+				LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_15 = "\"$(SRCROOT)/../../../libs/freetype/lib/osx\"";
+				LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2 = "\"$(SRCROOT)/../../../libs/FreeImage/lib/osx\"";
+				LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_4 = "\"$(SRCROOT)/../../../libs/GLee/lib/osx\"";
+				LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_5 = "\"$(SRCROOT)/../../../libs/poco/lib/osx\"";
+				LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_6 = "\"$(SRCROOT)/../../../libs/rtAudio/lib/osx\"";
+				PREBINDING = NO;
+				PRODUCT_NAME = "$(TARGET_NAME)Universal";
+				WRAPPER_EXTENSION = app;
+				ZERO_LINK = NO;
+			};
+			name = ReleaseUniversal;
+		};
+		E4B69B4E0A3A1720003C02F2 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ARCHS = "$(NATIVE_ARCH)";
+				CONFIGURATION_BUILD_DIR = "$(SRCROOT)/bin/";
+				COPY_PHASE_STRIP = NO;
+				DEAD_CODE_STRIPPING = YES;
+				GCC_AUTO_VECTORIZATION = YES;
+				GCC_ENABLE_SSE3_EXTENSIONS = YES;
+				GCC_ENABLE_SUPPLEMENTAL_SSE3_INSTRUCTIONS = YES;
+				GCC_INLINES_ARE_PRIVATE_EXTERN = NO;
+				GCC_MODEL_TUNING = G5;
+				GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+				GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO;
+				GCC_WARN_ABOUT_INVALID_OFFSETOF_MACRO = NO;
+				GCC_WARN_ALLOW_INCOMPLETE_PROTOCOL = NO;
+				GCC_WARN_UNINITIALIZED_AUTOS = NO;
+				GCC_WARN_UNUSED_VALUE = NO;
+				GCC_WARN_UNUSED_VARIABLE = NO;
+				HEADER_SEARCH_PATHS = (
+					"../../../libs/openFrameworks/**",
+					../../../libs/freetype/include/,
+					../../../libs/freetype/include/freetype2,
+					../../../libs/poco/include,
+					../../../addons/,
+				);
+				OTHER_CPLUSPLUSFLAGS = (
+					"-D__MACOSX_CORE__",
+					"-lpthread",
+				);
+				OTHER_LDFLAGS = "";
+			};
+			name = Debug;
+		};
+		E4B69B4F0A3A1720003C02F2 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ARCHS = "$(NATIVE_ARCH)";
+				CONFIGURATION_BUILD_DIR = "$(SRCROOT)/bin/";
+				COPY_PHASE_STRIP = YES;
+				DEAD_CODE_STRIPPING = YES;
+				GCC_AUTO_VECTORIZATION = YES;
+				GCC_ENABLE_SSE3_EXTENSIONS = YES;
+				GCC_ENABLE_SUPPLEMENTAL_SSE3_INSTRUCTIONS = YES;
+				GCC_INLINES_ARE_PRIVATE_EXTERN = NO;
+				GCC_MODEL_TUNING = G5;
+				GCC_OPTIMIZATION_LEVEL = 3;
+				GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+				GCC_UNROLL_LOOPS = YES;
+				GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO;
+				GCC_WARN_ABOUT_INVALID_OFFSETOF_MACRO = NO;
+				GCC_WARN_ALLOW_INCOMPLETE_PROTOCOL = NO;
+				GCC_WARN_UNINITIALIZED_AUTOS = NO;
+				GCC_WARN_UNUSED_VALUE = NO;
+				GCC_WARN_UNUSED_VARIABLE = NO;
+				HEADER_SEARCH_PATHS = (
+					"../../../libs/openFrameworks/**",
+					../../../libs/freetype/include/,
+					../../../libs/freetype/include/freetype2,
+					../../../libs/poco/include,
+					../../../addons/,
+				);
+				OTHER_CPLUSPLUSFLAGS = (
+					"-D__MACOSX_CORE__",
+					"-lpthread",
+				);
+				OTHER_LDFLAGS = "";
+			};
+			name = Release;
+		};
+		E4B69B600A3A1757003C02F2 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				COPY_PHASE_STRIP = NO;
+				FRAMEWORK_SEARCH_PATHS = (
+					"$(inherited)",
+					"$(FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1)",
+				);
+				FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(SRCROOT)/../../../libs/glut/lib/osx\"";
+				GCC_DYNAMIC_NO_PIC = NO;
+				GCC_ENABLE_FIX_AND_CONTINUE = YES;
+				GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
+				GCC_MODEL_TUNING = G4;
+				GCC_OPTIMIZATION_LEVEL = 0;
+				GCC_PRECOMPILE_PREFIX_HEADER = YES;
+				GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/Carbon.framework/Headers/Carbon.h";
+				INFOPLIST_FILE = MelodyTriangle.plist;
+				INSTALL_PATH = "$(HOME)/Applications";
+				LIBRARY_SEARCH_PATHS = (
+					"$(inherited)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_1)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_3)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_4)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_5)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_6)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_7)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_8)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_9)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_10)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_11)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_12)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_13)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_14)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_15)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_1)",
+				);
+				LIBRARY_SEARCH_PATHS_QUOTED_1 = "\"$(SRCROOT)/../../../addons/ofxOsc/libs/oscpack/lib/osx\"";
+				LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(SRCROOT)/../../../libs/freeimage/lib/osx\"";
+				LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_14 = "\"$(SRCROOT)/../../../libs/fmodex/lib/osx\"";
+				LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_15 = "\"$(SRCROOT)/../../../libs/freetype/lib/osx\"";
+				LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2 = "\"$(SRCROOT)/../../../libs/FreeImage/lib/osx\"";
+				LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_4 = "\"$(SRCROOT)/../../../libs/GLee/lib/osx\"";
+				LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_5 = "\"$(SRCROOT)/../../../libs/poco/lib/osx\"";
+				LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_6 = "\"$(SRCROOT)/../../../libs/rtAudio/lib/osx\"";
+				PREBINDING = NO;
+				PRODUCT_NAME = "$(TARGET_NAME)Debug";
+				WRAPPER_EXTENSION = app;
+				ZERO_LINK = NO;
+			};
+			name = Debug;
+		};
+		E4B69B610A3A1757003C02F2 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				COPY_PHASE_STRIP = YES;
+				FRAMEWORK_SEARCH_PATHS = (
+					"$(inherited)",
+					"$(FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1)",
+				);
+				FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(SRCROOT)/../../../libs/glut/lib/osx\"";
+				GCC_ENABLE_FIX_AND_CONTINUE = NO;
+				GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
+				GCC_MODEL_TUNING = G4;
+				GCC_PRECOMPILE_PREFIX_HEADER = YES;
+				GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/Carbon.framework/Headers/Carbon.h";
+				INFOPLIST_FILE = MelodyTriangle.plist;
+				INSTALL_PATH = "$(HOME)/Applications";
+				LIBRARY_SEARCH_PATHS = (
+					"$(inherited)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_1)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_3)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_4)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_5)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_6)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_7)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_8)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_9)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_10)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_11)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_12)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_13)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_14)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_15)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_3)",
+				);
+				LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(SRCROOT)/../../../libs/freeimage/lib/osx\"";
+				LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_14 = "\"$(SRCROOT)/../../../libs/fmodex/lib/osx\"";
+				LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_15 = "\"$(SRCROOT)/../../../libs/freetype/lib/osx\"";
+				LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2 = "\"$(SRCROOT)/../../../libs/FreeImage/lib/osx\"";
+				LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_3 = "\"$(SRCROOT)/../../../addons/ofxOsc/libs/oscpack/lib/osx\"";
+				LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_4 = "\"$(SRCROOT)/../../../libs/GLee/lib/osx\"";
+				LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_5 = "\"$(SRCROOT)/../../../libs/poco/lib/osx\"";
+				LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_6 = "\"$(SRCROOT)/../../../libs/rtAudio/lib/osx\"";
+				PREBINDING = NO;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				WRAPPER_EXTENSION = app;
+				ZERO_LINK = NO;
+			};
+			name = Release;
+		};
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+		C852876D14C5BF6800AE6996 /* Build configuration list for PBXNativeTarget "MelodyTriangle_windowed" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				C852876E14C5BF6800AE6996 /* Debug */,
+				C852876F14C5BF6800AE6996 /* Release */,
+				C852877014C5BF6800AE6996 /* ReleaseUniversal */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		E4B69B4D0A3A1720003C02F2 /* Build configuration list for PBXProject "MelodyTriangle" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				E4B69B4E0A3A1720003C02F2 /* Debug */,
+				E4B69B4F0A3A1720003C02F2 /* Release */,
+				E4B27CA010CBF8A600536013 /* ReleaseUniversal */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		E4B69B5F0A3A1757003C02F2 /* Build configuration list for PBXNativeTarget "MelodyTriangle" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				E4B69B600A3A1757003C02F2 /* Debug */,
+				E4B69B610A3A1757003C02F2 /* Release */,
+				E4B27CA110CBF8A600536013 /* ReleaseUniversal */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+/* End XCConfigurationList section */
+	};
+	rootObject = E4B69B4C0A3A1720003C02F2 /* Project object */;
+}
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/GLUT has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Headers/copy.h	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,18 @@
+
+/*
+ *
+ * Written By Linas Vepstas November 1991 
+ */
+
+
+#define COPY_THREE_WORDS(A,B) {						\
+	struct three_words { int a, b, c, };				\
+	*(struct three_words *) (A) = *(struct three_words *) (B);	\
+}
+
+#define COPY_FOUR_WORDS(A,B) {						\
+	struct four_words { int a, b, c, d, };				\
+	*(struct four_words *) (A) = *(struct four_words *) (B);	\
+}
+
+/* ============================================================= */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Headers/extrude.h	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,96 @@
+
+/*
+ * extrude.h
+ *
+ * FUNCTION:
+ * prototypes for privately used subroutines for the tubing library
+ *
+ * HISTORY:
+ * Linas Vepstas 1991
+ */
+ 
+#include "port.h" /* for gleDouble */
+
+#ifndef M_PI
+#define M_PI  3.14159265358979323846
+#endif
+
+/* ============================================================ */
+/* 
+ * Provides choice of calling subroutine, vs. invoking macro.
+ * Basically, inlines the source, or not.
+ * Trades performance for executable size.
+ */
+
+#define INLINE_INTERSECT
+#ifdef INLINE_INTERSECT
+#define INNERSECT(sect,p,n,v1,v2) { INTERSECT(sect,p,n,v1,v2); }
+#else
+#define INNERSECT(sect,p,n,v1,v2) intersect(sect,p,n,v1,v2)
+#endif /* INLINE_INTERSECT */
+
+/* ============================================================ */
+/* The folowing defines give a kludgy way of accessing the qmesh primitive */
+
+/*
+#define bgntmesh _emu_qmesh_bgnqmesh
+#define endtmesh _emu_qmesh_endqmesh
+#define c3f _emu_qmesh_c3f
+#define n3f _emu_qmesh_n3f
+#define v3f _emu_qmesh_v3f
+*/
+
+/* ============================================================ */
+
+extern void up_sanity_check (gleDouble up[3],      /* up vector for contour */
+                      int npoints,              /* numpoints in poly-line */
+                      gleDouble point_array[][3]);   /* polyline */
+
+
+extern void draw_raw_style_end_cap (int ncp,     /* number of contour points */
+                             gleDouble contour[][2],     /* 2D contour */
+                             gleDouble zval,             /* where to draw cap */
+                             int frontwards);    /* front or back cap */
+
+extern void draw_round_style_cap_callback (int iloop,
+                                  double cap[][3],
+                                  float face_color[3],
+                                  gleDouble cut_vector[3],
+                                  gleDouble bisect_vector[3],
+                                  double norms[][3],
+                                  int frontwards);
+
+extern void draw_angle_style_front_cap (int ncp,
+                           gleDouble bi[3],
+                           gleDouble point_array[][3]);
+
+extern void extrusion_raw_join (int ncp,        /* number of contour points */
+                         gleDouble contour[][2],    /* 2D contour */
+                         gleDouble cont_normal[][2],/* 2D contour normal vecs */
+                         gleDouble up[3],           /* up vector for contour */
+                         int npoints,           /* numpoints in poly-line */
+                         gleDouble point_array[][3],        /* polyline */
+                         float color_array[][3],        /* color of polyline */
+                         gleDouble xform_array[][2][3]);  /* 2D contour xforms */
+
+
+extern void extrusion_round_or_cut_join (int ncp, /* number of contour points */
+                         gleDouble contour[][2],    /* 2D contour */
+                         gleDouble cont_normal[][2],/* 2D contour normal vecs */
+                           gleDouble up[3],         /* up vector for contour */
+                           int npoints,         /* numpoints in poly-line */
+                           gleDouble point_array[][3],      /* polyline */
+                           float color_array[][3],      /* color of polyline */
+                           gleDouble xform_array[][2][3]);  /* 2D contour xforms */
+
+
+extern void extrusion_angle_join (int ncp,      /* number of contour points */
+                         gleDouble contour[][2],    /* 2D contour */
+                         gleDouble cont_normal[][2],/* 2D contour normal vecs */
+                           gleDouble up[3],         /* up vector for contour */
+                           int npoints,         /* numpoints in poly-line */
+                           gleDouble point_array[][3],      /* polyline */
+                           float color_array[][3],      /* color of polyline */
+                           gleDouble xform_array[][2][3]);  /* 2D contour xforms */
+
+/* -------------------------- end of file -------------------------------- */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Headers/glsmap.h	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,137 @@
+#ifndef __glsmap_h__
+#define __glsmap_h__
+
+/* Copyright (c) Mark J. Kilgard, 1998.  */
+
+/* This program is freely distributable without licensing fees
+   and is provided without guarantee or warrantee expressed or
+   implied. This program is -not- in the public domain. */
+
+#if defined(_WIN32)
+
+/* Try hard to avoid including <windows.h> to avoid name space pollution,
+   but Win32's <GL/gl.h> needs APIENTRY and WINGDIAPI defined properly. */
+# if 0
+#  define  WIN32_LEAN_AND_MEAN
+#  include <windows.h>
+# else
+   /* XXX This is from Win32's <windef.h> */
+#  ifndef APIENTRY
+#   if (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED)
+#    define APIENTRY    __stdcall
+#   else
+#    define APIENTRY
+#   endif
+#  endif
+#  ifndef CALLBACK
+    /* XXX This is from Win32's <winnt.h> */
+#   if (defined(_M_MRX000) || defined(_M_IX86) || defined(_M_ALPHA) || defined(_M_PPC)) && !defined(MIDL_PASS)
+#    define CALLBACK __stdcall
+#   else
+#    define CALLBACK
+#   endif
+#  endif
+   /* XXX This is from Win32's <wingdi.h> and <winnt.h> */
+#  ifndef WINGDIAPI
+#   define WINGDIAPI __declspec(dllimport)
+#  endif
+   /* XXX This is from Win32's <ctype.h> */
+#  ifndef _WCHAR_T_DEFINED
+typedef unsigned short wchar_t;
+#   define _WCHAR_T_DEFINED
+#  endif
+# endif
+
+#pragma warning (disable:4244)	/* Disable bogus conversion warnings. */
+#pragma warning (disable:4305)  /* VC++ 5.0 version of above warning. */
+
+#endif /* _WIN32 */
+
+#include <OpenGL/gl.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef enum {
+        SMAP_CLEAR_SMAP_TEXTURE = 0x1,
+        SMAP_GENERATE_VIEW_MIPMAPS = 0x2,
+        SMAP_GENERATE_SMAP_MIPMAPS = 0x4,
+        SMAP_GENERATE_MIPMAPS = 0x6  /* both of above */
+} SphereMapFlags;
+
+/* Cube view enumerants. */
+enum {
+	SMAP_FRONT = 0,
+	SMAP_TOP = 1,
+	SMAP_BOTTOM = 2,
+	SMAP_LEFT = 3,
+	SMAP_RIGHT = 4,
+	SMAP_BACK = 5
+};
+
+typedef struct _SphereMap SphereMap;
+
+extern SphereMap *smapCreateSphereMap(SphereMap *shareSmap);
+extern void smapDestroySphereMap(SphereMap *smap);
+
+extern void smapConfigureSphereMapMesh(SphereMap *smap, int steps, int rings, int edgeExtend);
+
+extern void smapSetSphereMapTexObj(SphereMap *smap, GLuint texobj);
+extern void smapSetViewTexObj(SphereMap *smap, GLuint texobj);
+extern void smapSetViewTexObjs(SphereMap *smap, GLuint texobjs[6]);
+extern void smapGetSphereMapTexObj(SphereMap *smap, GLuint *texobj);
+extern void smapGetViewTexObj(SphereMap *smap, GLuint *texobj);
+extern void smapGetViewTexObjs(SphereMap *smap, GLuint texobjs[6]);
+
+extern void smapSetFlags(SphereMap *smap, SphereMapFlags flags);
+extern void smapGetFlags(SphereMap *smap, SphereMapFlags *flags);
+
+extern void smapSetViewOrigin(SphereMap *smap, GLint x, GLint y);
+extern void smapSetSphereMapOrigin(SphereMap *smap, GLint x, GLint y);
+extern void smapGetViewOrigin(SphereMap *smap, GLint *x, GLint *y);
+extern void smapGetSphereMapOrigin(SphereMap *smap, GLint *x, GLint *y);
+
+extern void smapSetEye(SphereMap *smap, GLfloat eyex, GLfloat eyey,	GLfloat eyez);
+extern void smapSetEyeVector(SphereMap *smap, GLfloat *eye);
+extern void smapSetUp(SphereMap *smap, GLfloat upx, GLfloat upy, GLfloat upz);
+extern void smapSetUpVector(SphereMap *smap, GLfloat *up);
+extern void smapSetObject(SphereMap *smap, GLfloat objx, GLfloat objy, GLfloat objz);
+extern void smapSetObjectVector(SphereMap *smap, GLfloat *obj);
+extern void smapGetEye(SphereMap *smap, GLfloat *eyex, GLfloat *eyey, GLfloat *eyez);
+extern void smapGetEyeVector(SphereMap *smap, GLfloat *eye);
+extern void smapGetUp(SphereMap *smap, GLfloat *upx, GLfloat *upy, GLfloat *upz);
+extern void smapGetUpVector(SphereMap *smap, GLfloat *up);
+extern void smapGetObject(SphereMap *smap, GLfloat *objx, GLfloat *objy, GLfloat *objz);
+extern void smapGetObjectVector(SphereMap *smap, GLfloat *obj);
+
+extern void smapSetNearFar(SphereMap *smap, GLfloat viewNear, GLfloat viewFar);
+extern void smapGetNearFar(SphereMap *smap, GLfloat *viewNear, GLfloat *viewFar);
+
+extern void smapSetSphereMapTexDim(SphereMap *smap, GLsizei texdim);
+extern void smapSetViewTexDim(SphereMap *smap, GLsizei texdim);
+extern void smapGetSphereMapTexDim(SphereMap *smap, GLsizei *texdim);
+extern void smapGetViewTexDim(SphereMap *smap, GLsizei *texdim);
+
+extern void smapSetContextData(SphereMap *smap, void *context);
+extern void smapGetContextData(SphereMap *smap, void **context);
+
+extern void smapSetPositionLightsFunc(SphereMap *smap, void (*positionLights)(int view, void *context));
+extern void smapSetDrawViewFunc(SphereMap *smap, void (*drawView)(int view, void *context));
+extern void smapGetPositionLightsFunc(SphereMap *smap, void (**positionLights)(int view, void *context));
+extern void smapGetDrawViewFunc(SphereMap *smap, void (**drawView)(int view, void *context));
+
+extern void smapGenViewTex(SphereMap *smap, int view);
+extern void smapGenViewTexs(SphereMap *smap);
+extern void smapGenSphereMapFromViewTexs(SphereMap *smap);
+extern void smapGenSphereMap(SphereMap *smap);
+extern void smapGenSphereMapWithOneViewTex(SphereMap *smap);
+
+extern int smapRvecToSt(float rvec[3], float st[2]);
+extern void smapStToRvec(float *st, float *rvec);
+
+#ifdef __cplusplus
+}
+
+#endif
+#endif /* __glsmap_h__ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Headers/glsmapint.h	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,102 @@
+#ifndef __glsmapint_h__
+#define __glsmapint_h__
+
+/* Copyright (c) Mark J. Kilgard, 1998. */
+
+/* This program is freely distributable without licensing fees 
+   and is provided without guarantee or warrantee expressed or 
+   implied. This program is -not- in the public domain. */
+
+#include "glsmap.h"
+
+enum { X = 0, Y = 1, Z = 2 };
+
+#define INITFACE(mesh) \
+	int steps = mesh->steps; \
+	int sqsteps = mesh->steps * mesh->steps
+
+#define FACE(side,y,x) \
+	mesh->face[(side)*sqsteps + (y)*steps + (x)]
+
+#define FACExy(side,i,j) \
+	(&FACE(side,i,j).x)
+
+#define FACEst(side,i,j) \
+	(&FACE(side,i,j).s)
+
+#define INITBACK(mesh) \
+	int allrings = mesh->rings + mesh->edgeExtend; \
+	int ringedspokes = allrings * mesh->steps
+
+#define BACK(edge,ring,spoke) \
+	mesh->back[(edge)*ringedspokes + (ring)*mesh->steps + (spoke)]
+
+#define BACKxy(edge,ring,spoke) \
+	(&BACK(edge,ring,spoke).x)
+
+#define BACKst(edge,ring,spoke) \
+	(&BACK(edge,ring,spoke).s)
+
+typedef struct _STXY {
+	GLfloat s, t;
+	GLfloat x, y;
+} STXY;
+
+typedef struct _SphereMapMesh {
+
+	int refcnt;
+
+	int steps;
+	int rings;
+	int edgeExtend;
+
+	STXY *face;
+	STXY *back;
+
+} SphereMapMesh;
+
+struct _SphereMap {
+
+	/* Shared sphere map mesh vertex data. */
+	SphereMapMesh *mesh;
+
+	/* Texture object ids. */
+	GLuint smapTexObj;
+	GLuint viewTexObjs[6];
+	GLuint viewTexObj;
+
+        /* Flags */
+        SphereMapFlags flags;
+
+	/* Texture dimensions must be a power of two. */
+	int viewTexDim;  /* view texture dimension */
+	int smapTexDim;  /* sphere map texture dimension */
+
+	/* Viewport origins for view and sphere map rendering. */
+	int viewOrigin[2];
+	int smapOrigin[2];
+
+	/* Viewing vectors. */
+	GLfloat eye[3];
+	GLfloat up[3];
+	GLfloat obj[3];
+
+	/* Projection parameters. */
+	GLfloat viewNear;
+	GLfloat viewFar;
+
+	/* Rendering callbacks. */
+	void (*positionLights)(int view, void *context);
+	void (*drawView)(int view, void *context);
+
+	/* Application specified callback data. */
+	void *context;
+
+};
+
+/* Library internal routines. */
+extern void __smapDrawSphereMapMeshSide(SphereMapMesh *mesh, int side);
+extern void __smapDrawSphereMapMeshBack(SphereMapMesh *mesh);
+extern void __smapValidateSphereMapMesh(SphereMapMesh *mesh);
+
+#endif /* __glsmapint_h__ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Headers/glut.h	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,644 @@
+#ifndef __glut_h__
+#define __glut_h__
+
+/* Copyright (c) Mark J. Kilgard, 1994, 1995, 1996, 1998. */
+
+/* This program is freely distributable without licensing fees  and is
+   provided without guarantee or warrantee expressed or  implied. This
+   program is -not- in the public domain. */
+
+#if defined(_WIN32)
+
+/* GLUT 3.7 now tries to avoid including <windows.h>
+   to avoid name space pollution, but Win32's <GL/gl.h> 
+   needs APIENTRY and WINGDIAPI defined properly. */
+# if 0
+#  define  WIN32_LEAN_AND_MEAN
+#  include <windows.h>
+# else
+   /* XXX This is from Win32's <windef.h> */
+#  ifndef APIENTRY
+#   define GLUT_APIENTRY_DEFINED
+#   if (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED)
+#    define APIENTRY    __stdcall
+#   else
+#    define APIENTRY
+#   endif
+#  endif
+   /* XXX This is from Win32's <winnt.h> */
+#  ifndef CALLBACK
+#   if (defined(_M_MRX000) || defined(_M_IX86) || defined(_M_ALPHA) || defined(_M_PPC)) && !defined(MIDL_PASS)
+#    define CALLBACK __stdcall
+#   else
+#    define CALLBACK
+#   endif
+#  endif
+   /* XXX This is from Win32's <wingdi.h> and <winnt.h> */
+#  ifndef WINGDIAPI
+#   define GLUT_WINGDIAPI_DEFINED
+#   define WINGDIAPI __declspec(dllimport)
+#  endif
+   /* XXX This is from Win32's <ctype.h> */
+#  ifndef _WCHAR_T_DEFINED
+typedef unsigned short wchar_t;
+#   define _WCHAR_T_DEFINED
+#  endif
+# endif
+
+#pragma comment (lib, "winmm.lib")     /* link with Windows MultiMedia lib */
+#pragma comment (lib, "opengl32.lib")  /* link with Microsoft OpenGL lib */
+#pragma comment (lib, "glu32.lib")     /* link with OpenGL Utility lib */
+#pragma comment (lib, "glut32.lib")    /* link with Win32 GLUT lib */
+
+#pragma warning (disable:4244)	/* Disable bogus conversion warnings. */
+#pragma warning (disable:4305)  /* VC++ 5.0 version of above warning. */
+
+#endif
+
+#if defined(__APPLE__) || defined(MACOSX)
+#include <AvailabilityMacros.h>
+#include <OpenGL/gl.h>
+#include <OpenGL/glu.h>
+#else
+#include <GL/gl.h>
+#include <GL/glu.h>
+#endif
+
+/* define APIENTRY and CALLBACK to null string if we aren't on Win32 */
+#if !defined(_WIN32)
+#define APIENTRY
+#define GLUT_APIENTRY_DEFINED
+#define CALLBACK
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ GLUT API revision history:
+ 
+ GLUT_API_VERSION is updated to reflect incompatible GLUT
+ API changes (interface changes, semantic changes, deletions,
+ or additions).
+ 
+ GLUT_API_VERSION=1  First public release of GLUT.  11/29/94
+
+ GLUT_API_VERSION=2  Added support for OpenGL/GLX multisampling,
+ extension.  Supports new input devices like tablet, dial and button
+ box, and Spaceball.  Easy to query OpenGL extensions.
+
+ GLUT_API_VERSION=3  glutMenuStatus added.
+
+ GLUT_API_VERSION=4  glutInitDisplayString, glutWarpPointer,
+ glutBitmapLength, glutStrokeLength, glutWindowStatusFunc, dynamic
+ video resize subAPI, glutPostWindowRedisplay, glutKeyboardUpFunc,
+ glutSpecialUpFunc, glutIgnoreKeyRepeat, glutSetKeyRepeat,
+ glutJoystickFunc, glutForceJoystickFunc (NOT FINALIZED!).
+
+ GLUT_API_VERSION=5  glutGetProcAddress (added by BrianP)
+**/
+#ifndef GLUT_API_VERSION  /* allow this to be overriden */
+#define GLUT_API_VERSION		5
+#endif
+
+/**
+ GLUT implementation revision history:
+ 
+ GLUT_XLIB_IMPLEMENTATION is updated to reflect both GLUT
+ API revisions and implementation revisions (ie, bug fixes).
+
+ GLUT_XLIB_IMPLEMENTATION=1  mjk's first public release of
+ GLUT Xlib-based implementation.  11/29/94
+
+ GLUT_XLIB_IMPLEMENTATION=2  mjk's second public release of
+ GLUT Xlib-based implementation providing GLUT version 2 
+ interfaces.
+
+ GLUT_XLIB_IMPLEMENTATION=3  mjk's GLUT 2.2 images. 4/17/95
+
+ GLUT_XLIB_IMPLEMENTATION=4  mjk's GLUT 2.3 images. 6/?/95
+
+ GLUT_XLIB_IMPLEMENTATION=5  mjk's GLUT 3.0 images. 10/?/95
+
+ GLUT_XLIB_IMPLEMENTATION=7  mjk's GLUT 3.1+ with glutWarpPoitner.  7/24/96
+
+ GLUT_XLIB_IMPLEMENTATION=8  mjk's GLUT 3.1+ with glutWarpPoitner
+ and video resize.  1/3/97
+
+ GLUT_XLIB_IMPLEMENTATION=9 mjk's GLUT 3.4 release with early GLUT 4 routines.
+
+ GLUT_XLIB_IMPLEMENTATION=11 Mesa 2.5's GLUT 3.6 release.
+
+ GLUT_XLIB_IMPLEMENTATION=12 mjk's GLUT 3.6 release with early GLUT 4 routines + signal handling.
+
+ GLUT_XLIB_IMPLEMENTATION=13 mjk's GLUT 3.7 beta with GameGLUT support.
+
+ GLUT_XLIB_IMPLEMENTATION=14 mjk's GLUT 3.7 beta with f90gl friend interface.
+
+ GLUT_XLIB_IMPLEMENTATION=15 mjk's GLUT 3.7 beta sync'ed with Mesa <GL/glut.h>
+**/
+#ifndef GLUT_XLIB_IMPLEMENTATION  /* Allow this to be overriden. */
+#define GLUT_XLIB_IMPLEMENTATION	15
+#endif
+
+/**
+ MacOS X GLUT implementation revision history:
+ 
+ GLUT_MACOSX_IMPLEMENTATION is updated to reflect MacOS X
+ specific GLUT API revisions and implementation revisions
+ (ie, bug fixes).
+
+ GLUT_MACOSX_IMPLEMENTATION=1  glutSurfaceTexture.
+
+ GLUT_MACOSX_IMPLEMENTATION=2  glutWMCloseFunc, glutCheckLoop.
+  
+**/
+#ifndef GLUT_MACOSX_IMPLEMENTATION  /* Allow this to be overriden. */
+#define GLUT_MACOSX_IMPLEMENTATION	2
+#endif
+
+/* Display mode bit masks. */
+#define GLUT_RGB			0
+#define GLUT_RGBA			GLUT_RGB
+#define GLUT_INDEX			1
+#define GLUT_SINGLE			0
+#define GLUT_DOUBLE			2
+#define GLUT_ACCUM			4
+#define GLUT_ALPHA			8
+#define GLUT_DEPTH			16
+#define GLUT_STENCIL			32
+#if (GLUT_API_VERSION >= 2)
+#define GLUT_MULTISAMPLE		128
+#define GLUT_STEREO			256
+#endif
+#if (GLUT_API_VERSION >= 3)
+#define GLUT_LUMINANCE			512
+#endif
+#define GLUT_NO_RECOVERY    1024
+
+/* Mouse buttons. */
+#define GLUT_LEFT_BUTTON		0
+#define GLUT_MIDDLE_BUTTON		1
+#define GLUT_RIGHT_BUTTON		2
+
+/* Mouse button  state. */
+#define GLUT_DOWN			0
+#define GLUT_UP				1
+
+#if (GLUT_API_VERSION >= 2)
+/* function keys */
+#define GLUT_KEY_F1			1
+#define GLUT_KEY_F2			2
+#define GLUT_KEY_F3			3
+#define GLUT_KEY_F4			4
+#define GLUT_KEY_F5			5
+#define GLUT_KEY_F6			6
+#define GLUT_KEY_F7			7
+#define GLUT_KEY_F8			8
+#define GLUT_KEY_F9			9
+#define GLUT_KEY_F10			10
+#define GLUT_KEY_F11			11
+#define GLUT_KEY_F12			12
+/* directional keys */
+#define GLUT_KEY_LEFT			100
+#define GLUT_KEY_UP			101
+#define GLUT_KEY_RIGHT			102
+#define GLUT_KEY_DOWN			103
+#define GLUT_KEY_PAGE_UP		104
+#define GLUT_KEY_PAGE_DOWN		105
+#define GLUT_KEY_HOME			106
+#define GLUT_KEY_END			107
+#define GLUT_KEY_INSERT			108
+#endif
+
+/* Entry/exit  state. */
+#define GLUT_LEFT			0
+#define GLUT_ENTERED			1
+
+/* Menu usage  state. */
+#define GLUT_MENU_NOT_IN_USE		0
+#define GLUT_MENU_IN_USE		1
+
+/* Visibility  state. */
+#define GLUT_NOT_VISIBLE		0
+#define GLUT_VISIBLE			1
+
+/* Window status  state. */
+#define GLUT_HIDDEN			0
+#define GLUT_FULLY_RETAINED		1
+#define GLUT_PARTIALLY_RETAINED		2
+#define GLUT_FULLY_COVERED		3
+
+/* Color index component selection values. */
+#define GLUT_RED			0
+#define GLUT_GREEN			1
+#define GLUT_BLUE			2
+
+/* Layers for use. */
+#define GLUT_NORMAL			0
+#define GLUT_OVERLAY			1
+
+#if defined(_WIN32)
+/* Stroke font constants (use these in GLUT program). */
+#define GLUT_STROKE_ROMAN		((void*)0)
+#define GLUT_STROKE_MONO_ROMAN		((void*)1)
+
+/* Bitmap font constants (use these in GLUT program). */
+#define GLUT_BITMAP_9_BY_15		((void*)2)
+#define GLUT_BITMAP_8_BY_13		((void*)3)
+#define GLUT_BITMAP_TIMES_ROMAN_10	((void*)4)
+#define GLUT_BITMAP_TIMES_ROMAN_24	((void*)5)
+#if (GLUT_API_VERSION >= 3)
+#define GLUT_BITMAP_HELVETICA_10	((void*)6)
+#define GLUT_BITMAP_HELVETICA_12	((void*)7)
+#define GLUT_BITMAP_HELVETICA_18	((void*)8)
+#endif
+#else
+/* Stroke font opaque addresses (use constants instead in source code). */
+extern void *glutStrokeRoman;
+extern void *glutStrokeMonoRoman;
+
+/* Stroke font constants (use these in GLUT program). */
+#define GLUT_STROKE_ROMAN		(&glutStrokeRoman)
+#define GLUT_STROKE_MONO_ROMAN		(&glutStrokeMonoRoman)
+
+/* Bitmap font opaque addresses (use constants instead in source code). */
+extern void *glutBitmap9By15;
+extern void *glutBitmap8By13;
+extern void *glutBitmapTimesRoman10;
+extern void *glutBitmapTimesRoman24;
+extern void *glutBitmapHelvetica10;
+extern void *glutBitmapHelvetica12;
+extern void *glutBitmapHelvetica18;
+
+/* Bitmap font constants (use these in GLUT program). */
+#define GLUT_BITMAP_9_BY_15		(&glutBitmap9By15)
+#define GLUT_BITMAP_8_BY_13		(&glutBitmap8By13)
+#define GLUT_BITMAP_TIMES_ROMAN_10	(&glutBitmapTimesRoman10)
+#define GLUT_BITMAP_TIMES_ROMAN_24	(&glutBitmapTimesRoman24)
+#if (GLUT_API_VERSION >= 3)
+#define GLUT_BITMAP_HELVETICA_10	(&glutBitmapHelvetica10)
+#define GLUT_BITMAP_HELVETICA_12	(&glutBitmapHelvetica12)
+#define GLUT_BITMAP_HELVETICA_18	(&glutBitmapHelvetica18)
+#endif
+#endif
+
+/* glutGet parameters. */
+#define GLUT_WINDOW_X			100
+#define GLUT_WINDOW_Y			101
+#define GLUT_WINDOW_WIDTH		102
+#define GLUT_WINDOW_HEIGHT		103
+#define GLUT_WINDOW_BUFFER_SIZE		104
+#define GLUT_WINDOW_STENCIL_SIZE	105
+#define GLUT_WINDOW_DEPTH_SIZE		106
+#define GLUT_WINDOW_RED_SIZE		107
+#define GLUT_WINDOW_GREEN_SIZE		108
+#define GLUT_WINDOW_BLUE_SIZE		109
+#define GLUT_WINDOW_ALPHA_SIZE		110
+#define GLUT_WINDOW_ACCUM_RED_SIZE	111
+#define GLUT_WINDOW_ACCUM_GREEN_SIZE	112
+#define GLUT_WINDOW_ACCUM_BLUE_SIZE	113
+#define GLUT_WINDOW_ACCUM_ALPHA_SIZE	114
+#define GLUT_WINDOW_DOUBLEBUFFER	115
+#define GLUT_WINDOW_RGBA		116
+#define GLUT_WINDOW_PARENT		117
+#define GLUT_WINDOW_NUM_CHILDREN	118
+#define GLUT_WINDOW_COLORMAP_SIZE	119
+#if (GLUT_API_VERSION >= 2)
+#define GLUT_WINDOW_NUM_SAMPLES		120
+#define GLUT_WINDOW_STEREO		121
+#endif
+#if (GLUT_API_VERSION >= 3)
+#define GLUT_WINDOW_CURSOR		122
+#endif
+#define GLUT_SCREEN_WIDTH		200
+#define GLUT_SCREEN_HEIGHT		201
+#define GLUT_SCREEN_WIDTH_MM		202
+#define GLUT_SCREEN_HEIGHT_MM		203
+#define GLUT_MENU_NUM_ITEMS		300
+#define GLUT_DISPLAY_MODE_POSSIBLE	400
+#define GLUT_INIT_WINDOW_X		500
+#define GLUT_INIT_WINDOW_Y		501
+#define GLUT_INIT_WINDOW_WIDTH		502
+#define GLUT_INIT_WINDOW_HEIGHT		503
+#define GLUT_INIT_DISPLAY_MODE		504
+#if (GLUT_API_VERSION >= 2)
+#define GLUT_ELAPSED_TIME		700
+#endif
+#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 13)
+#define GLUT_WINDOW_FORMAT_ID		123
+#endif
+
+#if (GLUT_API_VERSION >= 2)
+/* glutDeviceGet parameters. */
+#define GLUT_HAS_KEYBOARD		600
+#define GLUT_HAS_MOUSE			601
+#define GLUT_HAS_SPACEBALL		602
+#define GLUT_HAS_DIAL_AND_BUTTON_BOX	603
+#define GLUT_HAS_TABLET			604
+#define GLUT_NUM_MOUSE_BUTTONS		605
+#define GLUT_NUM_SPACEBALL_BUTTONS	606
+#define GLUT_NUM_BUTTON_BOX_BUTTONS	607
+#define GLUT_NUM_DIALS			608
+#define GLUT_NUM_TABLET_BUTTONS		609
+#endif
+#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 13)
+#define GLUT_DEVICE_IGNORE_KEY_REPEAT   610
+#define GLUT_DEVICE_KEY_REPEAT          611
+#define GLUT_HAS_JOYSTICK		612
+#define GLUT_OWNS_JOYSTICK		613
+#define GLUT_JOYSTICK_BUTTONS		614
+#define GLUT_JOYSTICK_AXES		615
+#define GLUT_JOYSTICK_POLL_RATE		616
+#endif
+
+#if (GLUT_API_VERSION >= 3)
+/* glutLayerGet parameters. */
+#define GLUT_OVERLAY_POSSIBLE           800
+#define GLUT_LAYER_IN_USE		801
+#define GLUT_HAS_OVERLAY		802
+#define GLUT_TRANSPARENT_INDEX		803
+#define GLUT_NORMAL_DAMAGED		804
+#define GLUT_OVERLAY_DAMAGED		805
+
+#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9)
+/* glutVideoResizeGet parameters. */
+#define GLUT_VIDEO_RESIZE_POSSIBLE	900
+#define GLUT_VIDEO_RESIZE_IN_USE	901
+#define GLUT_VIDEO_RESIZE_X_DELTA	902
+#define GLUT_VIDEO_RESIZE_Y_DELTA	903
+#define GLUT_VIDEO_RESIZE_WIDTH_DELTA	904
+#define GLUT_VIDEO_RESIZE_HEIGHT_DELTA	905
+#define GLUT_VIDEO_RESIZE_X		906
+#define GLUT_VIDEO_RESIZE_Y		907
+#define GLUT_VIDEO_RESIZE_WIDTH		908
+#define GLUT_VIDEO_RESIZE_HEIGHT	909
+#endif
+
+/* glutUseLayer parameters. */
+#define GLUT_NORMAL			0
+#define GLUT_OVERLAY			1
+
+/* glutGetModifiers return mask. */
+#define GLUT_ACTIVE_SHIFT               1
+#define GLUT_ACTIVE_CTRL                2
+#define GLUT_ACTIVE_ALT                 4
+
+/* glutSetCursor parameters. */
+/* Basic arrows. */
+#define GLUT_CURSOR_RIGHT_ARROW		0
+#define GLUT_CURSOR_LEFT_ARROW		1
+/* Symbolic cursor shapes. */
+#define GLUT_CURSOR_INFO		2
+#define GLUT_CURSOR_DESTROY		3
+#define GLUT_CURSOR_HELP		4
+#define GLUT_CURSOR_CYCLE		5
+#define GLUT_CURSOR_SPRAY		6
+#define GLUT_CURSOR_WAIT		7
+#define GLUT_CURSOR_TEXT		8
+#define GLUT_CURSOR_CROSSHAIR		9
+/* Directional cursors. */
+#define GLUT_CURSOR_UP_DOWN		10
+#define GLUT_CURSOR_LEFT_RIGHT		11
+/* Sizing cursors. */
+#define GLUT_CURSOR_TOP_SIDE		12
+#define GLUT_CURSOR_BOTTOM_SIDE		13
+#define GLUT_CURSOR_LEFT_SIDE		14
+#define GLUT_CURSOR_RIGHT_SIDE		15
+#define GLUT_CURSOR_TOP_LEFT_CORNER	16
+#define GLUT_CURSOR_TOP_RIGHT_CORNER	17
+#define GLUT_CURSOR_BOTTOM_RIGHT_CORNER	18
+#define GLUT_CURSOR_BOTTOM_LEFT_CORNER	19
+/* Inherit from parent window. */
+#define GLUT_CURSOR_INHERIT		100
+/* Blank cursor. */
+#define GLUT_CURSOR_NONE		101
+/* Fullscreen crosshair (if available). */
+#define GLUT_CURSOR_FULL_CROSSHAIR	102
+#endif
+
+/* GLUT initialization sub-API. */
+extern void APIENTRY glutInit(int *argcp, char **argv);
+extern void APIENTRY glutInitDisplayMode(unsigned int mode);
+#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9)
+extern void APIENTRY glutInitDisplayString(const char *string);
+#endif
+extern void APIENTRY glutInitWindowPosition(int x, int y);
+extern void APIENTRY glutInitWindowSize(int width, int height);
+extern void APIENTRY glutMainLoop(void);
+
+/* GLUT window sub-API. */
+extern int APIENTRY glutCreateWindow(const char *title);
+extern int APIENTRY glutCreateSubWindow(int win, int x, int y, int width, int height);
+extern void APIENTRY glutDestroyWindow(int win);
+extern void APIENTRY glutPostRedisplay(void);
+#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 11)
+extern void APIENTRY glutPostWindowRedisplay(int win);
+#endif
+extern void APIENTRY glutSwapBuffers(void);
+extern int APIENTRY glutGetWindow(void);
+extern void APIENTRY glutSetWindow(int win);
+extern void APIENTRY glutSetWindowTitle(const char *title);
+extern void APIENTRY glutSetIconTitle(const char *title);
+extern void APIENTRY glutPositionWindow(int x, int y);
+extern void APIENTRY glutReshapeWindow(int width, int height);
+extern void APIENTRY glutPopWindow(void);
+extern void APIENTRY glutPushWindow(void);
+extern void APIENTRY glutIconifyWindow(void);
+extern void APIENTRY glutShowWindow(void);
+extern void APIENTRY glutHideWindow(void);
+#if (GLUT_API_VERSION >= 3)
+extern void APIENTRY glutFullScreen(void);
+extern void APIENTRY glutSetCursor(int cursor);
+#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9)
+extern void APIENTRY glutWarpPointer(int x, int y);
+#if (GLUT_MACOSX_IMPLEMENTATION >= 1)
+/* surface texturing API Mac OS X specific
+*  Note:
+*	glutSurfaceTexture has been deprecated, use GL_EXT_framebuffer_object
+*/
+#ifdef MAC_OS_X_VERSION_10_5
+extern void APIENTRY glutSurfaceTexture (GLenum target, GLenum internalformat, int surfacewin); AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_5
+#else
+extern void APIENTRY glutSurfaceTexture (GLenum target, GLenum internalformat, int surfacewin);
+#endif
+#endif
+#if (GLUT_MACOSX_IMPLEMENTATION >= 2)
+/* Mac OS X specific API */
+extern void APIENTRY glutWMCloseFunc(void (*func)(void));
+extern void APIENTRY glutCheckLoop(void);
+#endif
+#endif
+
+/* GLUT overlay sub-API. */
+extern void APIENTRY glutEstablishOverlay(void);
+extern void APIENTRY glutRemoveOverlay(void);
+extern void APIENTRY glutUseLayer(GLenum layer);
+extern void APIENTRY glutPostOverlayRedisplay(void);
+#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 11)
+extern void APIENTRY glutPostWindowOverlayRedisplay(int win);
+#endif
+extern void APIENTRY glutShowOverlay(void);
+extern void APIENTRY glutHideOverlay(void);
+#endif
+
+/* GLUT menu sub-API. */
+extern int APIENTRY glutCreateMenu(void (*)(int));
+extern void APIENTRY glutDestroyMenu(int menu);
+extern int APIENTRY glutGetMenu(void);
+extern void APIENTRY glutSetMenu(int menu);
+extern void APIENTRY glutAddMenuEntry(const char *label, int value);
+extern void APIENTRY glutAddSubMenu(const char *label, int submenu);
+extern void APIENTRY glutChangeToMenuEntry(int item, const char *label, int value);
+extern void APIENTRY glutChangeToSubMenu(int item, const char *label, int submenu);
+extern void APIENTRY glutRemoveMenuItem(int item);
+extern void APIENTRY glutAttachMenu(int button);
+extern void APIENTRY glutDetachMenu(int button);
+
+/* GLUT window callback sub-API. */
+extern void APIENTRY glutDisplayFunc(void (*func)(void));
+extern void APIENTRY glutReshapeFunc(void (*func)(int width, int height));
+extern void APIENTRY glutKeyboardFunc(void (*func)(unsigned char key, int x, int y));
+extern void APIENTRY glutMouseFunc(void (*func)(int button, int state, int x, int y));
+extern void APIENTRY glutMotionFunc(void (*func)(int x, int y));
+extern void APIENTRY glutPassiveMotionFunc(void (*func)(int x, int y));
+extern void APIENTRY glutEntryFunc(void (*func)(int state));
+extern void APIENTRY glutVisibilityFunc(void (*func)(int state));
+extern void APIENTRY glutIdleFunc(void (*func)(void));
+extern void APIENTRY glutTimerFunc(unsigned int millis, void (*func)(int value), int value);
+extern void APIENTRY glutMenuStateFunc(void (*func)(int state));
+#if (GLUT_API_VERSION >= 2)
+extern void APIENTRY glutSpecialFunc(void (*func)(int key, int x, int y));
+extern void APIENTRY glutSpaceballMotionFunc(void (*func)(int x, int y, int z));
+extern void APIENTRY glutSpaceballRotateFunc(void (*func)(int x, int y, int z));
+extern void APIENTRY glutSpaceballButtonFunc(void (*func)(int button, int state));
+extern void APIENTRY glutButtonBoxFunc(void (*func)(int button, int state));
+extern void APIENTRY glutDialsFunc(void (*func)(int dial, int value));
+extern void APIENTRY glutTabletMotionFunc(void (*func)(int x, int y));
+extern void APIENTRY glutTabletButtonFunc(void (*func)(int button, int state, int x, int y));
+#if (GLUT_API_VERSION >= 3)
+extern void APIENTRY glutMenuStatusFunc(void (*func)(int status, int x, int y));
+extern void APIENTRY glutOverlayDisplayFunc(void (*func)(void));
+#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9)
+extern void APIENTRY glutWindowStatusFunc(void (*func)(int state));
+#endif
+#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 13)
+extern void APIENTRY glutKeyboardUpFunc(void (*func)(unsigned char key, int x, int y));
+extern void APIENTRY glutSpecialUpFunc(void (*func)(int key, int x, int y));
+extern void APIENTRY glutJoystickFunc(void (*func)(unsigned int buttonMask, int x, int y, int z), int pollInterval);
+#endif
+#endif
+#endif
+
+/* GLUT color index sub-API. */
+extern void APIENTRY glutSetColor(int, GLfloat red, GLfloat green, GLfloat blue);
+extern GLfloat APIENTRY glutGetColor(int ndx, int component);
+extern void APIENTRY glutCopyColormap(int win);
+
+/* GLUT state retrieval sub-API. */
+extern int APIENTRY glutGet(GLenum type);
+extern int APIENTRY glutDeviceGet(GLenum type);
+#if (GLUT_API_VERSION >= 2)
+/* GLUT extension support sub-API */
+extern int APIENTRY glutExtensionSupported(const char *name);
+#endif
+#if (GLUT_API_VERSION >= 3)
+extern int APIENTRY glutGetModifiers(void);
+extern int APIENTRY glutLayerGet(GLenum type);
+#endif
+#if (GLUT_API_VERSION >= 5)
+extern void * APIENTRY glutGetProcAddress(const char *procName);
+#endif
+
+/* GLUT font sub-API */
+extern void APIENTRY glutBitmapCharacter(void *font, int character);
+extern int APIENTRY glutBitmapWidth(void *font, int character);
+extern void APIENTRY glutStrokeCharacter(void *font, int character);
+extern int APIENTRY glutStrokeWidth(void *font, int character);
+#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9)
+extern int APIENTRY glutBitmapLength(void *font, const unsigned char *string);
+extern int APIENTRY glutStrokeLength(void *font, const unsigned char *string);
+#endif
+
+/* GLUT pre-built models sub-API */
+extern void APIENTRY glutWireSphere(GLdouble radius, GLint slices, GLint stacks);
+extern void APIENTRY glutSolidSphere(GLdouble radius, GLint slices, GLint stacks);
+extern void APIENTRY glutWireCone(GLdouble base, GLdouble height, GLint slices, GLint stacks);
+extern void APIENTRY glutSolidCone(GLdouble base, GLdouble height, GLint slices, GLint stacks);
+extern void APIENTRY glutWireCube(GLdouble size);
+extern void APIENTRY glutSolidCube(GLdouble size);
+extern void APIENTRY glutWireTorus(GLdouble innerRadius, GLdouble outerRadius, GLint sides, GLint rings);
+extern void APIENTRY glutSolidTorus(GLdouble innerRadius, GLdouble outerRadius, GLint sides, GLint rings);
+extern void APIENTRY glutWireDodecahedron(void);
+extern void APIENTRY glutSolidDodecahedron(void);
+extern void APIENTRY glutWireTeapot(GLdouble size);
+extern void APIENTRY glutSolidTeapot(GLdouble size);
+extern void APIENTRY glutWireOctahedron(void);
+extern void APIENTRY glutSolidOctahedron(void);
+extern void APIENTRY glutWireTetrahedron(void);
+extern void APIENTRY glutSolidTetrahedron(void);
+extern void APIENTRY glutWireIcosahedron(void);
+extern void APIENTRY glutSolidIcosahedron(void);
+
+#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9)
+/* GLUT video resize sub-API. */
+extern int APIENTRY glutVideoResizeGet(GLenum param);
+extern void APIENTRY glutSetupVideoResizing(void);
+extern void APIENTRY glutStopVideoResizing(void);
+extern void APIENTRY glutVideoResize(int x, int y, int width, int height);
+extern void APIENTRY glutVideoPan(int x, int y, int width, int height);
+
+/* GLUT debugging sub-API. */
+extern void APIENTRY glutReportErrors(void);
+#endif
+
+#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 13)
+/* GLUT device control sub-API. */
+/* glutSetKeyRepeat modes. */
+#define GLUT_KEY_REPEAT_OFF		0
+#define GLUT_KEY_REPEAT_ON		1
+#define GLUT_KEY_REPEAT_DEFAULT		2
+
+/* Joystick button masks. */
+#define GLUT_JOYSTICK_BUTTON_A		1
+#define GLUT_JOYSTICK_BUTTON_B		2
+#define GLUT_JOYSTICK_BUTTON_C		4
+#define GLUT_JOYSTICK_BUTTON_D		8
+
+extern void APIENTRY glutIgnoreKeyRepeat(int ignore);
+extern void APIENTRY glutSetKeyRepeat(int repeatMode);
+extern void APIENTRY glutForceJoystickFunc(void);
+
+/* GLUT game mode sub-API. */
+/* glutGameModeGet. */
+#define GLUT_GAME_MODE_ACTIVE           0
+#define GLUT_GAME_MODE_POSSIBLE         1
+#define GLUT_GAME_MODE_WIDTH            2
+#define GLUT_GAME_MODE_HEIGHT           3
+#define GLUT_GAME_MODE_PIXEL_DEPTH      4
+#define GLUT_GAME_MODE_REFRESH_RATE     5
+#define GLUT_GAME_MODE_DISPLAY_CHANGED  6
+
+extern void APIENTRY glutGameModeString(const char *string);
+extern int APIENTRY glutEnterGameMode(void);
+extern void APIENTRY glutLeaveGameMode(void);
+extern int APIENTRY glutGameModeGet(GLenum mode);
+#endif
+
+#ifdef __cplusplus
+}
+
+#endif
+
+#ifdef GLUT_APIENTRY_DEFINED
+# undef GLUT_APIENTRY_DEFINED
+# undef APIENTRY
+#endif
+
+#ifdef GLUT_WINGDIAPI_DEFINED
+# undef GLUT_WINGDIAPI_DEFINED
+# undef WINGDIAPI
+#endif
+
+#endif                  /* __glut_h__ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Headers/glutbitmap.h	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,30 @@
+#ifndef __glutbitmap_h__
+#define __glutbitmap_h__
+
+/* Copyright (c) Mark J. Kilgard, 1994. */
+
+/* This program is freely distributable without licensing fees 
+   and is provided without guarantee or warrantee expressed or 
+   implied. This program is -not- in the public domain. */
+
+#include "glut.h"
+
+typedef struct {
+  const GLsizei width;
+  const GLsizei height;
+  const GLfloat xorig;
+  const GLfloat yorig;
+  const GLfloat advance;
+  const GLubyte *bitmap;
+} BitmapCharRec, *BitmapCharPtr;
+
+typedef struct {
+  const char *name;
+  const int num_chars;
+  const int first;
+  const BitmapCharRec * const *ch;
+} BitmapFontRec, *BitmapFontPtr;
+
+typedef void *GLUTbitmapFont;
+
+#endif /* __glutbitmap_h__ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Headers/glutf90.h	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,90 @@
+#ifndef __glutf90_h__
+#define __glutf90_h__
+
+/* Copyright (c) Mark J. Kilgard & Willam F. Mitchell, 1998. */
+
+/* This program is freely distributable without licensing fees 
+   and is provided without guarantee or warrantee expressed or 
+   implied. This program is -not- in the public domain. */
+
+/* This header provides the binding interface for William Mitchell's
+   f90gl Fortran 90 GLUT binding.  Other GLUT language bindings
+   can and should use this interace. */
+
+/* I appreciate the guidance from William Mitchell
+   (mitchell@cam.nist.gov) in developing this friend interface
+   for use by the f90gl package.  See ../../README.fortran */
+
+#include <GLUT/glut.h>
+
+#ifndef GLUTCALLBACK
+	#define GLUTCALLBACK
+#endif
+#ifndef APIENTRY
+	#define APIENTRY
+#endif
+
+/* Which callback enumerants for the __glutSetFCB/__glutGetFCB routines. */
+/* NOTE These values are part of a binary interface for the f90gl Fortran
+   90 binding and so must NOT changes (additions are allowed). */
+
+/* GLUTwindow callbacks. */
+#define GLUT_FCB_DISPLAY         0    /* GLUTdisplayFCB */
+#define GLUT_FCB_RESHAPE         1    /* GLUTreshapeFCB */
+#define GLUT_FCB_MOUSE           2    /* GLUTmouseFCB */
+#define GLUT_FCB_MOTION          3    /* GLUTmotionFCB */
+#define GLUT_FCB_PASSIVE         4    /* GLUTpassiveFCB */
+#define GLUT_FCB_ENTRY           5    /* GLUTentryFCB */
+#define GLUT_FCB_KEYBOARD        6    /* GLUTkeyboardFCB */
+#define GLUT_FCB_KEYBOARD_UP     7    /* GLUTkeyboardFCB */
+#define GLUT_FCB_WINDOW_STATUS   8    /* GLUTwindowStatusFCB */
+#define GLUT_FCB_VISIBILITY      9    /* GLUTvisibilityFCB */
+#define GLUT_FCB_SPECIAL         10   /* GLUTspecialFCB */
+#define GLUT_FCB_SPECIAL_UP      11   /* GLUTspecialFCB */
+#define GLUT_FCB_BUTTON_BOX      12   /* GLUTbuttonBoxFCB */
+#define GLUT_FCB_DIALS           13   /* GLUTdialsFCB */
+#define GLUT_FCB_SPACE_MOTION    14   /* GLUTspaceMotionFCB */
+#define GLUT_FCB_SPACE_ROTATE    15   /* GLUTspaceRotateFCB */
+#define GLUT_FCB_SPACE_BUTTON    16   /* GLUTspaceButtonFCB */
+#define GLUT_FCB_TABLET_MOTION   17   /* GLUTtabletMotionFCB */
+#define GLUT_FCB_TABLET_BUTTON   18   /* GLUTtabletButtonFCB */
+#define GLUT_FCB_JOYSTICK        19   /* GLUTjoystickFCB */
+#define GLUT_FCB_WMCLOSE         20   /* GLUTwmcloseFCB */
+/* Non-GLUTwindow callbacks. */
+#define GLUT_FCB_OVERLAY_DISPLAY 100  /* GLUTdisplayFCB */
+#define GLUT_FCB_SELECT          101  /* GLUTselectFCB */
+#define GLUT_FCB_TIMER           102  /* GLUTtimerFCB */
+
+/* GLUT Fortran callback function types. */
+typedef void (GLUTCALLBACK *GLUTdisplayFCB) (void);
+typedef void (GLUTCALLBACK *GLUTwmcloseFCB) (void);
+typedef void (GLUTCALLBACK *GLUTreshapeFCB) (int *, int *);
+/* NOTE the pressed key is int, not unsigned char for Fortran! */
+typedef void (GLUTCALLBACK *GLUTkeyboardFCB) (int *, int *, int *);
+typedef void (GLUTCALLBACK *GLUTmouseFCB) (int *, int *, int *, int *);
+typedef void (GLUTCALLBACK *GLUTmotionFCB) (int *, int *);
+typedef void (GLUTCALLBACK *GLUTpassiveFCB) (int *, int *);
+typedef void (GLUTCALLBACK *GLUTentryFCB) (int *);
+typedef void (GLUTCALLBACK *GLUTwindowStatusFCB) (int *);
+typedef void (GLUTCALLBACK *GLUTvisibilityFCB) (int *);
+typedef void (GLUTCALLBACK *GLUTspecialFCB) (int *, int *, int *);
+typedef void (GLUTCALLBACK *GLUTbuttonBoxFCB) (int *, int *);
+typedef void (GLUTCALLBACK *GLUTdialsFCB) (int *, int *);
+typedef void (GLUTCALLBACK *GLUTspaceMotionFCB) (int *, int *, int *);
+typedef void (GLUTCALLBACK *GLUTspaceRotateFCB) (int *, int *, int *);
+typedef void (GLUTCALLBACK *GLUTspaceButtonFCB) (int *, int *);
+typedef void (GLUTCALLBACK *GLUTtabletMotionFCB) (int *, int *);
+typedef void (GLUTCALLBACK *GLUTtabletButtonFCB) (int *, int *, int *, int *);
+typedef void (GLUTCALLBACK *GLUTjoystickFCB) (unsigned int *buttonMask, int *x, int *y, int *z);
+
+typedef void (GLUTCALLBACK *GLUTselectFCB) (int *);
+typedef void (GLUTCALLBACK *GLUTtimerFCB) (int *);
+typedef void (GLUTCALLBACK *GLUTmenuStateFCB) (int *);  /* DEPRICATED. */
+typedef void (GLUTCALLBACK *GLUTmenuStatusFCB) (int *, int *, int *);
+typedef void (GLUTCALLBACK *GLUTidleFCB) (void);
+
+/* Functions that set and return Fortran callback functions. */
+extern void* APIENTRY __glutGetFCB(int which);
+extern void APIENTRY __glutSetFCB(int which, void *func);
+
+#endif  /* __glutf90_h__ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Headers/glutstroke.h	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,42 @@
+#ifndef __glutstroke_h__
+#define __glutstroke_h__
+
+/* Copyright (c) Mark J. Kilgard, 1994. */
+
+/* This program is freely distributable without licensing fees 
+   and is provided without guarantee or warrantee expressed or 
+   implied. This program is -not- in the public domain. */
+
+#if defined(_WIN32)
+#pragma warning (disable:4244)  /* disable bogus conversion warnings */
+#pragma warning (disable:4305)  /* VC++ 5.0 version of above warning. */
+#endif
+
+typedef struct {
+  float x;
+  float y;
+} CoordRec, *CoordPtr;
+
+typedef struct {
+  int num_coords;
+  const CoordRec *coord;
+} StrokeRec, *StrokePtr;
+
+typedef struct {
+  int num_strokes;
+  const StrokeRec *stroke;
+  float center;
+  float right;
+} StrokeCharRec, *StrokeCharPtr;
+
+typedef struct {
+  const char *name;
+  int num_chars;
+  const StrokeCharRec *ch;
+  float top;
+  float bottom;
+} StrokeFontRec, *StrokeFontPtr;
+
+typedef void *GLUTstrokeFont;
+
+#endif /* __glutstroke_h__ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Headers/gutil.h	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,89 @@
+
+/*
+ * gutil.h
+ *
+ * FUNCTION:
+ * Provide utilities that allow rotation to occur 
+ * around any axis.
+ * 
+ * HISTORY:
+ * created by Linas Vepstas  1990
+ * added single & double precision, June 1991, Linas Vepstas
+ */
+
+#ifndef __GUTIL_H__
+#define __GUTIL_H__
+
+#ifdef __GUTIL_DOUBLE
+#define gutDouble double
+#else
+#define gutDouble float  
+#endif
+
+
+#ifdef _NO_PROTO		/* NO ANSI C PROTOTYPING */
+
+/* Rotation Utilities */
+extern void rot_axis_f ();
+extern void rot_about_axis_f ();
+extern void rot_omega_f ();
+extern void urot_axis_f ();
+extern void urot_about_axis_f ();
+extern void urot_omega_f ();
+
+/* double-precision versions */
+extern void rot_axis_d ();
+extern void rot_about_axis_d ();
+extern void rot_omega_d ();
+extern void urot_axis_d ();
+extern void urot_about_axis_d ();
+extern void urot_omega_d ();
+
+/* viewpoint functions */
+extern void uview_direction_d ();
+extern void uview_direction_f ();
+extern void uviewpoint_d ();
+extern void uviewpoint_f ();
+
+#else /* _NO_PROTO */		/* ANSI C PROTOTYPING */
+
+/* Rotation Utilities */
+extern void rot_axis_f (float omega, float axis[3]);
+extern void rot_about_axis_f (float angle, float axis[3]);
+extern void rot_omega_f (float axis[3]);
+extern void urot_axis_f (float m[4][4], float omega, float axis[3]);
+extern void urot_about_axis_f (float m[4][4], float angle, float axis[3]);
+extern void urot_omega_f (float m[4][4], float axis[3]);
+
+/* double-precision versions */
+extern void rot_axis_d (double omega, double axis[3]);
+extern void rot_about_axis_d (double angle, double axis[3]);
+extern void rot_omega_d (double axis[3]);
+extern void urot_axis_d (double m[4][4], double omega, double axis[3]);
+extern void urot_about_axis_d (double m[4][4], double angle, double axis[3]);
+extern void urot_omega_d (double m[4][4], double axis[3]);
+
+/* viewpoint functions */
+extern void uview_direction_d (double m[4][4],		/* returned */
+                        double v21[3],		/* input */
+                        double up[3]);		/* input */
+
+extern void uview_direction_f (float m[4][4],		/* returned */
+                        float v21[3],		/* input */
+                        float up[3]);		/* input */
+
+extern void uviewpoint_d (double m[4][4],		/* returned */
+                   double v1[3],		/* input */
+                   double v2[3],		/* input */
+                   double up[3]);		/* input */
+
+extern void uviewpoint_f (float m[4][4],		/* returned */
+                   float v1[3],		/* input */
+                   float v2[3],		/* input */
+                   float up[3]);		/* input */
+
+#endif /* _NO_PROTO */
+
+#endif /* _GUTIL_H__ */
+
+/* ------------------- end of file ---------------------- */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Headers/intersect.h	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,391 @@
+/*
+ * FUNCTION:
+ * This file contains a number of utilities useful to 3D graphics in
+ * general, and to the generation of tubing and extrusions in particular
+ * 
+ * HISTORY:
+ * Written by Linas Vepstas, August 1991
+ * Updated to correctly handle degenerate cases, Linas,  February 1993 
+ */
+
+#include <math.h>
+#include "port.h"
+#include "vvector.h"
+
+#define BACKWARDS_INTERSECT (2)
+
+/* ========================================================== */
+/*
+ * the Degenerate_Tolerance token represents the greatest amount by
+ * which different scales in a graphics environment can differ before
+ * they should be considered "degenerate".   That is, when one vector is
+ * a million times longer than another, changces are that the second will
+ * be less than a pixel int, and therefore was probably meant to be
+ * degenerate (by the CAD package, etc.)  But what should this tolerance
+ * be?  At least 1 in onethousand (since screen sizes are 1K pixels), but
+ * les than 1 in 4 million (since this is the limit of single-precision
+ * floating point accuracy).  Of course, if double precision were used,
+ * then the tolerance could be increased.
+ * 
+ * Potentially, this naive assumption could cause problems if the CAD
+ * package attempts to zoom in on small details, and turns out, certain
+ * points should not hvae been degenerate.  The problem presented here
+ * is that the tolerance could run out before single-precision ran
+ * out, and so the CAD packages would perceive this as a "bug".
+ * One alternative is to fiddle around & try to tighten the tolerance.
+ * However, the right alternative is to code the graphics pipeline in
+ * double-precision (and tighten the tolerance).
+ *
+ * By the way, note that Degernate Tolerance is a "dimensionless"
+ * quantitiy -- it has no units -- it does not measure feet, inches,
+ * millimeters or pixels.  It is used only in the computations of ratios
+ * and relative lengths.
+ */
+
+/* 
+ * Right now, the tolerance is set to 2 parts in a million, which
+ * corresponds to a 19-bit distinction of mantissas. Note that
+ * single-precsion numbers have 24 bit mantissas.
+ */
+
+#define DEGENERATE_TOLERANCE   (0.000002)
+
+/* ========================================================== */
+/* 
+ * The macro and subroutine INTERSECT are designed to compute the
+ * intersection of a line (defined by the points v1 and v2) and a plane
+ * (defined as plane which is normal to the vector n, and contains the
+ * point p).  Both return the point sect, which is the point of
+ * interesection.
+ *
+ * This MACRO attemps to be fairly robust by checking for a divide by
+ * zero.
+ */
+
+/* ========================================================== */
+/*
+ * HACK ALERT
+ * The intersection parameter t has the nice property that if t>1,
+ * then the intersection is "in front of" p1, and if t<0, then the
+ * intersection is "behind" p2. Unfortunately, as the intersecting plane
+ * and the line become parallel, t wraps through infinity -- i.e. t can
+ * become so large that t becomes "greater than infinity" and comes back 
+ * as a negative number (i.e. winding number hopped by one unit).  We 
+ * have no way of detecting this situation without adding gazzillions 
+ * of lines of code of topological algebra to detect the winding number;
+ * and this would be incredibly difficult, and ruin performance.
+ * 
+ * Thus, we've installed a cheap hack for use by the "cut style" drawing
+ * routines. If t proves to be a large negative number (more negative
+ * than -5), then we assume that t was positive and wound through
+ * infinity.  This makes most cuts look good, without introducing bogus
+ * cuts at infinity.
+ */
+/* ========================================================== */
+
+#define INTERSECT(sect,p,n,v1,v2)			\
+{							\
+   gleDouble deno, numer, t, omt;			\
+							\
+   deno = (v1[0] - v2[0]) * n[0];			\
+   deno += (v1[1] - v2[1]) * n[1];			\
+   deno += (v1[2] - v2[2]) * n[2];			\
+   							\
+   if (deno == 0.0) {					\
+      VEC_COPY (n, v1);					\
+      /* printf ("Intersect: Warning: line is coplanar with plane \n"); */ \
+   } else {						\
+							\
+      numer = (p[0] - v2[0]) * n[0];			\
+      numer += (p[1] - v2[1]) * n[1];			\
+      numer += (p[2] - v2[2]) * n[2];			\
+							\
+      t = numer / deno;					\
+      omt = 1.0 - t;					\
+							\
+      sect[0] = t * v1[0] + omt * v2[0];		\
+      sect[1] = t * v1[1] + omt * v2[1];		\
+      sect[2] = t * v1[2] + omt * v2[2];		\
+   }							\
+}
+
+/* ========================================================== */
+/* 
+ * The macro and subroutine BISECTING_PLANE compute a normal vector that
+ * describes the bisecting plane between three points (v1, v2 and v3).  
+ * This bisecting plane has the following properties:
+ * 1) it contains the point v2
+ * 2) the angle it makes with v21 == v2 - v1 is equal to the angle it 
+ *    makes with v32 == v3 - v2 
+ * 3) it is perpendicular to the plane defined by v1, v2, v3.
+ *
+ * Having input v1, v2, and v3, it returns a unit vector n.
+ *
+ * In some cases, the user may specify degenerate points, and still
+ * expect "reasonable" or "obvious" behaviour.  The "expected"
+ * behaviour for these degenerate cases is:
+ *
+ * 1) if v1 == v2 == v3, then return n=0
+ * 2) if v1 == v2, then return v32 (normalized).
+ * 3) if v2 == v3, then return v21 (normalized).
+ * 4) if v1, v2 and v3 co-linear, then return v21 (normalized).
+ *
+ * Mathematically, these special cases "make sense" -- we just have to
+ * code around potential divide-by-zero's in the code below.
+ */
+
+/* ========================================================== */
+
+#define BISECTING_PLANE(valid,n,v1,v2,v3)			\
+{								\
+   double v21[3], v32[3];					\
+   double len21, len32;						\
+   double vdot;							\
+								\
+   VEC_DIFF (v21, v2, v1);					\
+   VEC_DIFF (v32, v3, v2);					\
+								\
+   VEC_LENGTH (len21, v21);					\
+   VEC_LENGTH (len32, v32);					\
+								\
+   if (len21 <= DEGENERATE_TOLERANCE * len32) {			\
+								\
+      if (len32 == 0.0) {					\
+         /* all three points lie ontop of one-another */	\
+         VEC_ZERO (n);						\
+         valid = FALSE;						\
+      } else {							\
+         /* return a normalized copy of v32 as bisector */	\
+         len32 = 1.0 / len32;					\
+         VEC_SCALE (n, len32, v32);				\
+         valid = TRUE;						\
+      }								\
+								\
+   } else {							\
+								\
+      valid = TRUE;						\
+								\
+      if (len32 <= DEGENERATE_TOLERANCE * len21) {		\
+         /* return a normalized copy of v21 as bisector */	\
+         len21 = 1.0 / len21;					\
+         VEC_SCALE (n, len21, v21);				\
+								\
+      } else {							\
+								\
+         /* normalize v21 to be of unit length */		\
+         len21 = 1.0 / len21;					\
+         VEC_SCALE (v21, len21, v21);				\
+								\
+         /* normalize v32 to be of unit length */		\
+         len32 = 1.0 / len32;					\
+         VEC_SCALE (v32, len32, v32);				\
+								\
+         VEC_DOT_PRODUCT (vdot, v32, v21);			\
+								\
+         /* if vdot == 1 or -1, then points are colinear */	\
+         if ((vdot >= (1.0-DEGENERATE_TOLERANCE)) || 		\
+             (vdot <= (-1.0+DEGENERATE_TOLERANCE))) {		\
+            VEC_COPY (n, v21);					\
+         } else {						\
+   								\
+            /* go do the full computation */ 			\
+            n[0] = vdot * (v32[0] + v21[0]) - v32[0] - v21[0];	\
+            n[1] = vdot * (v32[1] + v21[1]) - v32[1] - v21[1];	\
+            n[2] = vdot * (v32[2] + v21[2]) - v32[2] - v21[2];	\
+								\
+            /* if above if-test's passed, 			\
+             * n should NEVER be of zero length */		\
+            VEC_NORMALIZE (n);					\
+         } 							\
+      } 							\
+   } 								\
+}
+
+/* ========================================================== */
+/*
+ * The block of code below is ifdef'd out, and is here for reference
+ * purposes only.  It performs the "mathematically right thing" for
+ * computing a bisecting plane, but is, unfortunately, subject ot noise
+ * in the presence of near degenerate points.  Since computer graphics,
+ * due to sloppy coding, laziness, or correctness, is filled with
+ * degenerate points, we can't really use this version.  The code above
+ * is far more appropriate for graphics.
+ */
+
+#ifdef MATHEMATICALLY_EXACT_GRAPHICALLY_A_KILLER
+#define BISECTING_PLANE(n,v1,v2,v3)				\
+{								\
+   double v21[3], v32[3];					\
+   double len21, len32;						\
+   double vdot;							\
+								\
+   VEC_DIFF (v21, v2, v1);					\
+   VEC_DIFF (v32, v3, v2);					\
+								\
+   VEC_LENGTH (len21, v21);					\
+   VEC_LENGTH (len32, v32);					\
+								\
+   if (len21 == 0.0) {						\
+								\
+      if (len32 == 0.0) {					\
+         /* all three points lie ontop of one-another */	\
+         VEC_ZERO (n);						\
+         valid = FALSE;						\
+      } else {							\
+         /* return a normalized copy of v32 as bisector */	\
+         len32 = 1.0 / len32;					\
+         VEC_SCALE (n, len32, v32);				\
+      }								\
+								\
+   } else {							\
+								\
+      /* normalize v21 to be of unit length */			\
+      len21 = 1.0 / len21;					\
+      VEC_SCALE (v21, len21, v21);				\
+								\
+      if (len32 == 0.0) {					\
+         /* return a normalized copy of v21 as bisector */	\
+         VEC_COPY (n, v21);					\
+      } else {							\
+								\
+         /* normalize v32 to be of unit length */		\
+         len32 = 1.0 / len32;					\
+         VEC_SCALE (v32, len32, v32);				\
+								\
+         VEC_DOT_PRODUCT (vdot, v32, v21);			\
+								\
+         /* if vdot == 1 or -1, then points are colinear */	\
+         if ((vdot == 1.0) || (vdot == -1.0)) {			\
+            VEC_COPY (n, v21);					\
+         } else {						\
+   								\
+            /* go do the full computation */ 			\
+            n[0] = vdot * (v32[0] + v21[0]) - v32[0] - v21[0];	\
+            n[1] = vdot * (v32[1] + v21[1]) - v32[1] - v21[1];	\
+            n[2] = vdot * (v32[2] + v21[2]) - v32[2] - v21[2];	\
+								\
+            /* if above if-test's passed, 			\
+             * n should NEVER be of zero length */		\
+            VEC_NORMALIZE (n);					\
+         } 							\
+      } 							\
+   } 								\
+}
+#endif
+
+/* ========================================================== */
+/*
+ * This macro computes the plane perpendicular to the the plane
+ * defined by three points, and whose normal vector is givven as the
+ * difference between the two vectors ...
+ * 
+ * (See way below for the "math" model if you want to understand this.
+ * The comments about relative errors above apply here.)
+ */
+
+#define CUTTING_PLANE(valid,n,v1,v2,v3)				\
+{								\
+   double v21[3], v32[3];					\
+   double len21, len32;						\
+   double lendiff;						\
+								\
+   VEC_DIFF (v21, v2, v1);					\
+   VEC_DIFF (v32, v3, v2);					\
+								\
+   VEC_LENGTH (len21, v21);					\
+   VEC_LENGTH (len32, v32);					\
+								\
+   if (len21 <= DEGENERATE_TOLERANCE * len32) {			\
+								\
+      if (len32 == 0.0) {					\
+         /* all three points lie ontop of one-another */	\
+         VEC_ZERO (n);						\
+         valid = FALSE;						\
+      } else {							\
+         /* return a normalized copy of v32 as cut-vector */	\
+         len32 = 1.0 / len32;					\
+         VEC_SCALE (n, len32, v32);				\
+         valid = TRUE;						\
+      }								\
+								\
+   } else {							\
+								\
+      valid = TRUE;						\
+								\
+      if (len32 <= DEGENERATE_TOLERANCE * len21) {		\
+         /* return a normalized copy of v21 as cut vector */	\
+         len21 = 1.0 / len21;					\
+         VEC_SCALE (n, len21, v21);				\
+      } else {							\
+								\
+         /* normalize v21 to be of unit length */		\
+         len21 = 1.0 / len21;					\
+         VEC_SCALE (v21, len21, v21);				\
+								\
+         /* normalize v32 to be of unit length */		\
+         len32 = 1.0 / len32;					\
+         VEC_SCALE (v32, len32, v32);				\
+								\
+         VEC_DIFF (n, v21, v32);				\
+         VEC_LENGTH (lendiff, n);				\
+								\
+         /* if the perp vector is very small, then the two 	\
+          * vectors are darn near collinear, and the cut 	\
+          * vector is probably poorly defined. */		\
+         if (lendiff < DEGENERATE_TOLERANCE) {			\
+            VEC_ZERO (n);					\
+            valid = FALSE;					\
+         } else {						\
+            lendiff = 1.0 / lendiff;				\
+            VEC_SCALE (n, lendiff, n);				\
+         } 							\
+      } 							\
+   } 								\
+}
+
+/* ========================================================== */
+
+#ifdef MATHEMATICALLY_EXACT_GRAPHICALLY_A_KILLER
+#define CUTTING_PLANE(n,v1,v2,v3)		\
+{						\
+   double v21[3], v32[3];			\
+						\
+   VEC_DIFF (v21, v2, v1);			\
+   VEC_DIFF (v32, v3, v2);			\
+						\
+   VEC_NORMALIZE (v21);				\
+   VEC_NORMALIZE (v32);				\
+						\
+   VEC_DIFF (n, v21, v32);			\
+   VEC_NORMALIZE (n);				\
+}
+#endif
+
+
+/* ============================================================ */
+/* This macro is used in several places to cycle through a series of
+ * points to find the next non-degenerate point in a series */
+
+#define FIND_NON_DEGENERATE_POINT(inext,npoints,len,diff,point_array)   \
+{                                                                       \
+   gleDouble slen;							\
+   gleDouble summa[3];							\
+   									\
+   do {                                                                 \
+      /* get distance to next point */                                  \
+      VEC_DIFF (diff, point_array[inext+1], point_array[inext]);        \
+      VEC_LENGTH (len, diff);                                           \
+      VEC_SUM (summa, point_array[inext+1], point_array[inext]);        \
+      VEC_LENGTH (slen, summa);                                         \
+      slen *= DEGENERATE_TOLERANCE;					\
+      inext ++;                                                         \
+   } while ((len <= slen) && (inext < npoints-1));                      \
+}
+
+/* ========================================================== */
+
+extern int bisecting_plane (gleDouble n[3],    /* returned */
+                      gleDouble v1[3],  /* input */
+                      gleDouble v2[3],  /* input */
+                      gleDouble v3[3]);  /* input */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Headers/port.h	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,298 @@
+
+/*
+ * port.h 
+ *
+ * FUNCTION:
+ * This file contains defines for porting the tubing toolkit from GL to
+ * OpenGL to some callback scheme.
+ *
+ * HISTORY:
+ * Created by Linas Vepstas --  February 1993
+ * Added auto texture coord generation hacks, Linas April 1994 
+ */
+
+#ifndef __GLE_PORT_H__
+#define __GLE_PORT_H__
+
+
+#ifndef TRUE
+#define TRUE 1
+#endif
+
+#ifndef FALSE
+#define FALSE 0
+#endif
+
+#ifndef M_PI
+#define M_PI 3.14159265358979323846
+#endif
+
+/* ====================================================== */
+/* Some compilers can't handle multiply-subscripted array's */
+
+#ifdef FUNKY_C
+typedef gleDouble gleVector;
+#define AVAL(arr,n,i,j)  arr(6*n+3*i+j)
+#define VVAL(arr,n,i)  arr(3*n+i)
+
+#else  /* FUNKY_C */
+typedef double gleVector[3];
+typedef double glePoint[2];
+#define AVAL(arr,n,i,j)  arr[n][i][j]
+#define VVAL(arr,n,i)  arr[n][i];
+
+#endif /* FUNKY_C */
+
+/* ====================================================== */
+/* These are used to convey info about topography to the 
+ * texture mapping routines */
+
+#define FRONT 		1
+#define BACK 		2
+#define FRONT_CAP 	3
+#define BACK_CAP	4
+#define FILLET		5
+
+/* ====================================================== */
+
+#define __GLE_DOUBLE
+
+/* ====================================================== */
+
+#ifdef __GLE_DOUBLE
+#ifndef gleDouble
+    #define gleDouble 		double
+#endif
+#define urot_axis(a,b,c) 	urot_axis_d(a,b,c)
+#define uview_direction(a,b,c) 	uview_direction_d(a,b,c)
+#define uviewpoint(a,b,c,d) 	uviewpoint_d(a,b,c,d)
+#define MULTMATRIX(m)		MULTMATRIX_D(m)
+#define LOADMATRIX(m)		LOADMATRIX_D(m)
+#define V3F(x,j,id)		V3F_D(x,j,id)
+#define N3F(x)			N3F_D(x)
+#define T2F(x,y)		T2F_D(x,y)
+#else 
+#define gleDouble 		float
+#define urot_axis(a,b,c) 	urot_axis_f(a,b,c)
+#define uview_direction(a,b,c) 	uview_direction_f(a,b,c)
+#define uviewpoint(a,b,c,d) 	uviewpoint_f(a,b,c,d)
+#define MULTMATRIX(m)		MULTMATRIX_F(m)
+#define LOADMATRIX(m)		LOADMATRIX_F(m)
+#define V3F(x,j,id)		V3F_F(x,j,id)
+#define N3F(x)			N3F_F(x)
+#define T2F(x,y)		T2F_F(x,y)
+#endif 
+
+/* ====================================================== */
+
+#if (defined DEBUG_GL_32 || DEBUG_OPENGL_10)
+#undef GL_32
+#undef OPENGL_10
+
+#define BGNTMESH(i,len)	printf ("bgntmesh() \n");
+#define ENDTMESH()      printf ("endtmesh() \n");
+#define BGNPOLYGON()	printf ("bgnpolygon() \n");
+#define ENDPOLYGON()	printf ("endpolygon() \n");
+#define V3F_F(x,j,id)	printf ("v3f(x)		%f %f %f \n", x[0], x[1], x[2]);
+#define V3F_D(x,j,id)	printf ("v3d(x) 	%f %f %f \n", x[0], x[1], x[2]);
+#define	N3F_F(x)	printf ("n3f(x) 	%f %f %f \n", x[0], x[1], x[2]);
+#define	N3F_D(x)	printf ("n3d(x)		%f %f %f \n", x[0], x[1], x[2]);
+#define	C3F(x)		printf ("c3f(x) 	%f %f %f \n", x[0], x[1], x[2]);
+
+#define	POPMATRIX()	printf ("popmatrix () \n");
+#define	PUSHMATRIX()	printf ("pushmatrix() \n");
+#define	MULTMATRIX_F(x)	MULTMATRIX_D(x)
+#define	LOADMATRIX_F(x)	LOADMATRIX_D(x)
+
+
+#define LOADMATRIX_D(x) {				\
+   int i, j; 						\
+   printf ("loadmatrix (x) \n");			\
+   for (i=0; i<4; i++) {				\
+      for (j=0; j<4; j++) {				\
+         printf ( "%f ", x[i][j]);			\
+      }							\
+      printf (" \n");					\
+   }							\
+}
+
+#define MULTMATRIX_D(x) {				\
+   int i, j; 						\
+   printf ("multmatrix (x) \n");			\
+   for (i=0; i<4; i++) {				\
+      for (j=0; j<4; j++) {				\
+         printf ( "%f ", x[i][j]);			\
+      }							\
+      printf (" \n");					\
+   }							\
+}
+
+#define __IS_LIGHTING_ON  (1)
+
+#endif
+
+/* ====================================================== */
+
+#ifdef GL_32
+
+#include <gl/gl.h>
+
+#define BGNTMESH(i,len)	bgntmesh()
+#define ENDTMESH()	endtmesh()
+#define BGNPOLYGON()	bgnpolygon()
+#define ENDPOLYGON()	endpolygon()
+#define V3F_F(x,j,id)	v3f(x)
+#define V3F_D(x,j,id)	v3d(x)
+#define	N3F_F(x)	n3f(x)
+#define	T2F_F(x,y)
+#define	T2F_D(x,y)
+#define	C3F(x)		c3f(x)
+
+#define	POPMATRIX()	popmatrix ()
+#define	PUSHMATRIX()	pushmatrix()
+#define	MULTMATRIX_F(x)	multmatrix (x)
+#define	LOADMATRIX_F(x)	loadmatrix (x)
+
+#define	N3F_D(x) {					\
+   float nnn[3];					\
+   nnn[0] = (float) x[0]; 				\
+   nnn[1] = (float) x[1]; 				\
+   nnn[2] = (float) x[2]; 				\
+   n3f (nnn);						\
+}
+
+#define LOADMATRIX_D(x) {				\
+   int i, j; 						\
+   float mmm[4][4];					\
+   for (i=0; i<4; i++) {				\
+      for (j=0; j<4; j++) {				\
+         mmm[i][j] = (float) x[i][j];			\
+      }							\
+   }							\
+   loadmatrix(mmm);					\
+}
+
+#define MULTMATRIX_D(x) {				\
+   int i, j; 						\
+   float mmm[4][4];					\
+   for (i=0; i<4; i++) {				\
+      for (j=0; j<4; j++) {				\
+         mmm[i][j] = (float) x[i][j];			\
+      }							\
+   }							\
+   multmatrix(mmm);					\
+}
+
+/* #define __IS_LIGHTING_ON  (MSINGLE == getmmode()) */
+#define __IS_LIGHTING_ON  (extrusion_join_style & TUBE_LIGHTING_ON)
+
+#endif /* GL_32 */
+
+/* ====================================================== */
+#ifdef OPENGL_10
+
+#if defined(_WIN32)
+#include <windows.h>
+#pragma warning (disable:4244)          /* disable bogus conversion warnings */
+#endif
+#include <OpenGL/gl.h>
+#include <OpenGL/glu.h>
+
+/*
+#define	N3F_F(x) {					\
+   float nnn[3];					\
+   nnn[0] = - (float) x[0]; 				\
+   nnn[1] = - (float) x[1]; 				\
+   nnn[2] = - (float) x[2]; 				\
+   glNormal3fv (nnn);						\
+}
+#define	N3F_D(x) {					\
+   float nnn[3];					\
+   nnn[0] = - (float) x[0]; 				\
+   nnn[1] = - (float) x[1]; 				\
+   nnn[2] = - (float) x[2]; 				\
+   glNormal3fv (nnn);						\
+}
+*/
+
+#define	C3F(x)		glColor3fv(x)
+#define	T2F_F(x,y)	glTexCoord2f(x,y)
+#define	T2F_D(x,y)	glTexCoord2d(x,y)
+
+#define	POPMATRIX()	glPopMatrix()
+#define	PUSHMATRIX()	glPushMatrix()
+
+#define	MULTMATRIX_F(x)	glMultMatrixf ((const GLfloat *)x)
+#define	LOADMATRIX_F(x)	glLoadMatrixf ((const GLfloat *)x)
+
+#define	MULTMATRIX_D(x)	glMultMatrixd ((const GLdouble *)x)
+#define	LOADMATRIX_D(x)	glLoadMatrixd ((const GLdouble *)x)
+
+#define __IS_LIGHTING_ON  (glIsEnabled(GL_LIGHTING))
+
+/* ====================================================== */
+#ifdef AUTO_TEXTURE
+
+#define BGNTMESH(i,len) { 					\
+	if(_gle_gc -> bgn_gen_texture) (*(_gle_gc -> bgn_gen_texture))(i,len);\
+	glBegin (GL_TRIANGLE_STRIP); 			\
+}
+
+#define BGNPOLYGON() { 					\
+	if(_gle_gc -> bgn_gen_texture) (*(_gle_gc -> bgn_gen_texture))();\
+	glBegin (GL_POLYGON);				\
+}
+
+#define N3F_F(x) { 					\
+	if(_gle_gc -> n3f_gen_texture) (*(_gle_gc -> n3f_gen_texture))(x); \
+	glNormal3fv(x); 				\
+}
+
+#define N3F_D(x) { 					\
+	if(_gle_gc -> n3d_gen_texture) (*(_gle_gc -> n3d_gen_texture))(x); \
+	glNormal3dv(x); 				\
+}
+
+#define V3F_F(x,j,id) { 					\
+	if(_gle_gc -> v3f_gen_texture) (*(_gle_gc -> v3f_gen_texture))(x,j,id);\
+	glVertex3fv(x); 				\
+}
+
+#define V3F_D(x,j,id) { 					\
+	if(_gle_gc -> v3d_gen_texture) (*(_gle_gc -> v3d_gen_texture))(x,j,id); \
+	glVertex3dv(x); 				\
+}
+
+#define ENDTMESH() {					\
+	if(_gle_gc -> end_gen_texture) (*(_gle_gc -> end_gen_texture))(); \
+	glEnd ();					\
+}
+
+#define ENDPOLYGON() {					\
+	if(_gle_gc -> end_gen_texture) (*(_gle_gc -> end_gen_texture))(); \
+	glEnd ();					\
+}
+
+/* ====================================================== */
+#else /* AUTO_TEXTURE */
+
+#define BGNTMESH(i,len)	glBegin (GL_TRIANGLE_STRIP);
+#define BGNPOLYGON() 	glBegin (GL_POLYGON);
+
+#define	N3F_F(x)	glNormal3fv(x)
+#define	N3F_D(x)	glNormal3dv(x)
+#define V3F_F(x,j,id)	glVertex3fv(x);
+#define V3F_D(x,j,id)	glVertex3dv(x);
+
+#define ENDTMESH()	glEnd ()
+#define ENDPOLYGON()	glEnd()
+
+#endif /* AUTO_TEXTURE */
+
+#endif /* OPENGL_10 */
+
+/* ====================================================== */
+
+
+#endif /* __GLE_PORT_H__ */
+/* ================== END OF FILE ======================= */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Headers/rot.h	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,98 @@
+
+/*
+ * rot.h
+ *
+ * FUNCTION:
+ * rotation matrix utilities
+ *
+ * HISTORY:
+ * Linas Vepstas Aug 1990
+ */
+
+/* ========================================================== */
+/* 
+ * The MACROS below generate and return more traditional rotation
+ * matrices -- matrices for rotations about principal axes.
+ */
+/* ========================================================== */
+
+#define ROTX_CS(m,cosine,sine)		\
+{					\
+   /* rotation about the x-axis */	\
+					\
+   m[0][0] = 1.0;			\
+   m[0][1] = 0.0;			\
+   m[0][2] = 0.0;			\
+   m[0][3] = 0.0;			\
+					\
+   m[1][0] = 0.0;			\
+   m[1][1] = (cosine);			\
+   m[1][2] = (sine);			\
+   m[1][3] = 0.0;			\
+					\
+   m[2][0] = 0.0;			\
+   m[2][1] = -(sine);			\
+   m[2][2] = (cosine);			\
+   m[2][3] = 0.0;			\
+					\
+   m[3][0] = 0.0;			\
+   m[3][1] = 0.0;			\
+   m[3][2] = 0.0;			\
+   m[3][3] = 1.0;			\
+}				
+
+/* ========================================================== */
+
+#define ROTY_CS(m,cosine,sine)		\
+{					\
+   /* rotation about the y-axis */	\
+					\
+   m[0][0] = (cosine);			\
+   m[0][1] = 0.0;			\
+   m[0][2] = -(sine);			\
+   m[0][3] = 0.0;			\
+					\
+   m[1][0] = 0.0;			\
+   m[1][1] = 1.0;			\
+   m[1][2] = 0.0;			\
+   m[1][3] = 0.0;			\
+					\
+   m[2][0] = (sine);			\
+   m[2][1] = 0.0;			\
+   m[2][2] = (cosine);			\
+   m[2][3] = 0.0;			\
+					\
+   m[3][0] = 0.0;			\
+   m[3][1] = 0.0;			\
+   m[3][2] = 0.0;			\
+   m[3][3] = 1.0;			\
+}
+
+/* ========================================================== */
+
+#define ROTZ_CS(m,cosine,sine)		\
+{					\
+   /* rotation about the z-axis */	\
+					\
+   m[0][0] = (cosine);			\
+   m[0][1] = (sine);			\
+   m[0][2] = 0.0;			\
+   m[0][3] = 0.0;			\
+					\
+   m[1][0] = -(sine);			\
+   m[1][1] = (cosine);			\
+   m[1][2] = 0.0;			\
+   m[1][3] = 0.0;			\
+					\
+   m[2][0] = 0.0;			\
+   m[2][1] = 0.0;			\
+   m[2][2] = 1.0;			\
+   m[2][3] = 0.0;			\
+					\
+   m[3][0] = 0.0;			\
+   m[3][1] = 0.0;			\
+   m[3][2] = 0.0;			\
+   m[3][3] = 1.0;			\
+}
+
+/* ========================================================== */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Headers/segment.h	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,98 @@
+
+/*
+ * MODULE: segment.h
+ *
+ * FUNCTION:
+ * Contains function prototypes for segment drawing subroutines.
+ * These are used only internally, and are not to be exported to
+ * the user.
+ *
+ * HISTORY:
+ * Create by Linas Vepstas
+ * Added tube.h include to define gleDouble, tad February 2002
+ */
+
+/* ============================================================ */
+
+#include "tube.h"
+
+extern void draw_segment_plain (int ncp,       /* number of contour points */
+                           gleDouble front_contour[][3],
+                           gleDouble back_contour[][3],
+                           int inext, double len);
+
+extern void draw_segment_color (int ncp,       /* number of contour points */
+                           gleDouble front_contour[][3],
+                           gleDouble back_contour[][3],
+                           float color_last[3],
+                           float color_next[3],
+                           int inext, double len);
+
+extern void draw_segment_edge_n (int ncp,      /* number of contour points */
+                           gleDouble front_contour[][3],
+                           gleDouble back_contour[][3],
+                           double norm_cont[][3],
+                           int inext, double len);
+
+extern void draw_segment_c_and_edge_n (int ncp,   
+                           gleDouble front_contour[][3],
+                           gleDouble back_contour[][3],
+                           double norm_cont[][3],
+                           float color_last[3],
+                           float color_next[3],
+                           int inext, double len);
+
+extern void draw_segment_facet_n (int ncp,     
+                           gleDouble front_contour[][3],
+                           gleDouble back_contour[][3],
+                           double norm_cont[][3],
+                           int inext, double len);
+
+extern void draw_segment_c_and_facet_n (int ncp,    
+                           gleDouble front_contour[][3],
+                           gleDouble back_contour[][3],
+                           double norm_cont[][3],
+                           float color_last[3],
+                           float color_next[3],
+                           int inext, double len);
+
+/* ============================================================ */
+
+extern void draw_binorm_segment_edge_n (int ncp,  
+                           double front_contour[][3],
+                           double back_contour[][3],
+                           double front_norm[][3],
+                           double back_norm[][3],
+                           int inext, double len);
+
+extern void draw_binorm_segment_c_and_edge_n (int ncp,   
+                           double front_contour[][3],
+                           double back_contour[][3],
+                           double front_norm[][3],
+                           double back_norm[][3],
+                           float color_last[3],
+                           float color_next[3],
+                           int inext, double len);
+
+extern void draw_binorm_segment_facet_n (int ncp, 
+                           double front_contour[][3],
+                           double back_contour[][3],
+                           double front_norm[][3],
+                           double back_norm[][3],
+                           int inext, double len);
+
+extern void draw_binorm_segment_c_and_facet_n (int ncp,    
+                           double front_contour[][3],
+                           double back_contour[][3],
+                           double front_norm[][3],
+                           double back_norm[][3],
+                           float color_last[3],
+                           float color_next[3],
+                           int inext, double len);
+
+extern void draw_angle_style_back_cap (int ncp,        /* number of contour points */
+                           gleDouble bi[3],             /* biscetor */
+                           gleDouble point_array[][3]);  /* polyline */
+
+/* -------------------------- end of file -------------------------------- */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Headers/tube.h	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,203 @@
+/* 
+ * tube.h
+ *
+ * FUNCTION:
+ * Tubing and Extrusion header file.
+ * This file provides protypes and defines for the extrusion 
+ * and tubing primitives.
+ *
+ * HISTORY:
+ * Linas Vepstas 1990, 1991
+ */
+
+#ifndef __TUBE_H__
+#define __TUBE_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ GLE API revision history:
+ 
+ GLE_API_VERSION is updated to reflect GLE API changes (interface
+ changes, semantic changes, deletions, or additions).
+ 
+ GLE_API_VERSION=228  GLUT 3.7 release of GLE.
+**/
+#ifndef GLE_API_VERSION  /* allow this to be overriden */
+#define GLE_API_VERSION                228
+#endif
+
+/* some types */
+#ifndef gleDouble
+    #define gleDouble double
+#endif
+typedef gleDouble gleAffine[2][3];
+
+/* ====================================================== */
+
+/* defines for tubing join styles */
+#define TUBE_JN_RAW          0x1
+#define TUBE_JN_ANGLE        0x2
+#define TUBE_JN_CUT          0x3
+#define TUBE_JN_ROUND        0x4
+#define TUBE_JN_MASK         0xf    /* mask bits */
+#define TUBE_JN_CAP          0x10
+
+/* determine how normal vectors are to be handled */
+#define TUBE_NORM_FACET      0x100
+#define TUBE_NORM_EDGE       0x200
+#define TUBE_NORM_PATH_EDGE  0x400 /* for spiral, lathe, helix primitives */
+#define TUBE_NORM_MASK       0xf00    /* mask bits */
+
+/* closed or open countours */
+#define TUBE_CONTOUR_CLOSED	0x1000
+
+#define GLE_TEXTURE_ENABLE	0x10000
+#define GLE_TEXTURE_STYLE_MASK	0xff
+#define GLE_TEXTURE_VERTEX_FLAT		1
+#define GLE_TEXTURE_NORMAL_FLAT		2
+#define GLE_TEXTURE_VERTEX_CYL		3
+#define GLE_TEXTURE_NORMAL_CYL		4
+#define GLE_TEXTURE_VERTEX_SPH		5
+#define GLE_TEXTURE_NORMAL_SPH		6
+#define GLE_TEXTURE_VERTEX_MODEL_FLAT	7
+#define GLE_TEXTURE_NORMAL_MODEL_FLAT	8
+#define GLE_TEXTURE_VERTEX_MODEL_CYL	9
+#define GLE_TEXTURE_NORMAL_MODEL_CYL	10
+#define GLE_TEXTURE_VERTEX_MODEL_SPH	11
+#define GLE_TEXTURE_NORMAL_MODEL_SPH	12
+
+#ifdef GL_32
+/* HACK for GL 3.2 -- needed because no way to tell if lighting is on.  */
+#define TUBE_LIGHTING_ON	0x80000000
+
+#define gleExtrusion		extrusion
+#define gleSetJoinStyle		setjoinstyle
+#define gleGetJoinStyle		getjoinstyle
+#define glePolyCone		polycone
+#define glePolyCylinder		polycylinder
+#define	gleSuperExtrusion	super_extrusion
+#define	gleTwistExtrusion	twist_extrusion
+#define	gleSpiral		spiral
+#define	gleLathe		lathe
+#define	gleHelicoid		helicoid
+#define	gleToroid		toroid
+#define	gleScrew		screw
+
+#endif /* GL_32 */
+
+extern int gleGetJoinStyle (void);
+extern void gleSetJoinStyle (int style);	/* bitwise OR of flags */
+extern int gleGetNumSlices(void);
+extern void gleSetNumSlices(int slices);
+
+/* draw polyclinder, specified as a polyline */
+extern void glePolyCylinder (int npoints,	/* num points in polyline */
+                   gleDouble point_array[][3],	/* polyline vertces */
+                   float color_array[][3],	/* colors at polyline verts */
+                   gleDouble radius);		/* radius of polycylinder */
+
+/* draw polycone, specified as a polyline with radii */
+extern void glePolyCone (int npoints,	 /* numpoints in poly-line */
+                   gleDouble point_array[][3],	/* polyline vertices */
+                   float color_array[][3],	/* colors at polyline verts */
+                   gleDouble radius_array[]); /* cone radii at polyline verts */
+
+/* extrude arbitrary 2D contour along arbitrary 3D path */
+extern void gleExtrusion (int ncp,         /* number of contour points */
+                gleDouble contour[][2],     /* 2D contour */
+                gleDouble cont_normal[][2], /* 2D contour normals */
+                gleDouble up[3],            /* up vector for contour */
+                int npoints,            /* numpoints in poly-line */
+                gleDouble point_array[][3], /* polyline vertices */
+                float color_array[][3]); /* colors at polyline verts */
+
+/* extrude 2D contour, specifying local rotations (twists) */
+extern void gleTwistExtrusion (int ncp,         /* number of contour points */
+                gleDouble contour[][2],    /* 2D contour */
+                gleDouble cont_normal[][2], /* 2D contour normals */
+                gleDouble up[3],           /* up vector for contour */
+                int npoints,           /* numpoints in poly-line */
+                gleDouble point_array[][3],        /* polyline vertices */
+                float color_array[][3],        /* color at polyline verts */
+                gleDouble twist_array[]);   /* countour twists (in degrees) */
+
+/* extrude 2D contour, specifying local affine tranformations */
+extern void gleSuperExtrusion (int ncp,  /* number of contour points */
+                gleDouble contour[][2],    /* 2D contour */
+                gleDouble cont_normal[][2], /* 2D contour normals */
+                gleDouble up[3],           /* up vector for contour */
+                int npoints,           /* numpoints in poly-line */
+                gleDouble point_array[][3],        /* polyline vertices */
+                float color_array[][3],        /* color at polyline verts */
+                gleDouble xform_array[][2][3]);   /* 2D contour xforms */
+
+/* spiral moves contour along helical path by parallel transport */
+extern void gleSpiral (int ncp,        /* number of contour points */
+             gleDouble contour[][2],    /* 2D contour */
+             gleDouble cont_normal[][2], /* 2D contour normals */
+             gleDouble up[3],           /* up vector for contour */
+             gleDouble startRadius,	/* spiral starts in x-y plane */
+             gleDouble drdTheta,        /* change in radius per revolution */
+             gleDouble startZ,		/* starting z value */
+             gleDouble dzdTheta,        /* change in Z per revolution */
+             gleDouble startXform[2][3], /* starting contour affine xform */
+             gleDouble dXformdTheta[2][3], /* tangent change xform per revoln */
+             gleDouble startTheta,	/* start angle in x-y plane */
+             gleDouble sweepTheta);	/* degrees to spiral around */
+
+/* lathe moves contour along helical path by helically shearing 3D space */
+extern void gleLathe (int ncp,        /* number of contour points */
+             gleDouble contour[][2],    /* 2D contour */
+             gleDouble cont_normal[][2], /* 2D contour normals */
+             gleDouble up[3],           /* up vector for contour */
+             gleDouble startRadius,	/* spiral starts in x-y plane */
+             gleDouble drdTheta,        /* change in radius per revolution */
+             gleDouble startZ,		/* starting z value */
+             gleDouble dzdTheta,        /* change in Z per revolution */
+             gleDouble startXform[2][3], /* starting contour affine xform */
+             gleDouble dXformdTheta[2][3], /* tangent change xform per revoln */
+             gleDouble startTheta,	/* start angle in x-y plane */
+             gleDouble sweepTheta);	/* degrees to spiral around */
+
+/* similar to spiral, except contour is a circle */
+extern void gleHelicoid (gleDouble rToroid, /* circle contour (torus) radius */
+             gleDouble startRadius,	/* spiral starts in x-y plane */
+             gleDouble drdTheta,        /* change in radius per revolution */
+             gleDouble startZ,		/* starting z value */
+             gleDouble dzdTheta,        /* change in Z per revolution */
+             gleDouble startXform[2][3], /* starting contour affine xform */
+             gleDouble dXformdTheta[2][3], /* tangent change xform per revoln */
+             gleDouble startTheta,	/* start angle in x-y plane */
+             gleDouble sweepTheta);	/* degrees to spiral around */
+
+/* similar to lathe, except contour is a circle */
+extern void gleToroid (gleDouble rToroid, /* circle contour (torus) radius */
+             gleDouble startRadius,	/* spiral starts in x-y plane */
+             gleDouble drdTheta,        /* change in radius per revolution */
+             gleDouble startZ,		/* starting z value */
+             gleDouble dzdTheta,        /* change in Z per revolution */
+             gleDouble startXform[2][3], /* starting contour affine xform */
+             gleDouble dXformdTheta[2][3], /* tangent change xform per revoln */
+             gleDouble startTheta,	/* start angle in x-y plane */
+             gleDouble sweepTheta);	/* degrees to spiral around */
+
+/* draws a screw shape */
+extern void gleScrew (int ncp,          /* number of contour points */
+             gleDouble contour[][2],    /* 2D contour */
+             gleDouble cont_normal[][2], /* 2D contour normals */
+             gleDouble up[3],           /* up vector for contour */
+             gleDouble startz,          /* start of segment */
+             gleDouble endz,            /* end of segment */
+             gleDouble twist);          /* number of rotations */
+
+extern void gleTextureMode (int mode);
+
+#ifdef __cplusplus
+}
+
+#endif
+#endif /* __TUBE_H__ */
+/* ================== END OF FILE ======================= */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Headers/tube_gc.h	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,78 @@
+
+/*
+ * tube_gc.h
+ *
+ * FUNCTION:
+ * This file allows for easy changes to changes in the way the extrusion
+ * library handles state info (i.e. context).
+ *
+ * HISTORY:
+ * Linas Vepstas --- February 1993
+ * Added auto texture coord generation hacks, Linas April 1994
+ * Added tube.h include to define gleDouble, tad February 2002
+ */
+
+#include "tube.h"
+#include "port.h" /* for gleVector */
+
+typedef float gleColor[3];
+typedef double gleTwoVec[2];
+
+typedef struct {
+
+   /* public methods */
+   void (*bgn_gen_texture) (int, double);
+   void (*n3f_gen_texture) (float *);
+   void (*n3d_gen_texture) (double *);
+   void (*v3f_gen_texture) (float *, int, int);
+   void (*v3d_gen_texture) (double *, int, int);
+   void (*end_gen_texture) (void);
+
+   /* protected members -- "general knowledge" stuff */
+   int join_style;
+
+   /* arguments passed into extrusion code */ 
+   int ncp;     /* number of contour points */
+   gleTwoVec *contour;    /* 2D contour */
+   gleTwoVec *cont_normal;  /* 2D contour normals */
+   gleDouble *up;               /* up vector */
+   int npoints;  /* number of points in polyline */
+   gleVector *point_array;     /* path */
+   gleColor *color_array;         /* path colors */
+   gleAffine *xform_array;  /* contour xforms */
+
+   /* private members, used by texturing code */
+   int num_vert;
+   int segment_number;
+   double segment_length;
+   double accum_seg_len;
+   double prev_x;
+   double prev_y;
+
+   void (*save_bgn_gen_texture) (int, double);
+   void (*save_n3f_gen_texture) (float *);
+   void (*save_n3d_gen_texture) (double *);
+   void (*save_v3f_gen_texture) (float *, int, int);
+   void (*save_v3d_gen_texture) (double *, int, int);
+   void (*save_end_gen_texture) (void);
+
+} gleGC;
+
+extern gleGC *_gle_gc;
+extern gleGC * gleCreateGC (void);
+
+#define INIT_GC() {if (!_gle_gc) _gle_gc = gleCreateGC(); }
+#define extrusion_join_style (_gle_gc->join_style)
+
+#define __TUBE_CLOSE_CONTOUR (extrusion_join_style & TUBE_CONTOUR_CLOSED)
+#define __TUBE_DRAW_CAP (extrusion_join_style & TUBE_JN_CAP)
+#define __TUBE_DRAW_FACET_NORMALS (extrusion_join_style & TUBE_NORM_FACET)
+#define __TUBE_DRAW_PATH_EDGE_NORMALS (extrusion_join_style & TUBE_NORM_PATH_EDGE)
+
+#define __TUBE_STYLE (extrusion_join_style & TUBE_JN_MASK)
+#define __TUBE_RAW_JOIN (extrusion_join_style & TUBE_JN_RAW)
+#define __TUBE_CUT_JOIN (extrusion_join_style & TUBE_JN_CUT)
+#define __TUBE_ANGLE_JOIN (extrusion_join_style & TUBE_JN_ANGLE)
+#define __TUBE_ROUND_JOIN (extrusion_join_style & TUBE_JN_ROUND)
+
+/* ======================= END OF FILE ========================== */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Headers/vvector.h	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,1339 @@
+
+/*
+ * vvector.h
+ *
+ * FUNCTION:
+ * This file contains a number of utilities useful for handling
+ * 3D vectors
+ * 
+ * HISTORY:
+ * Written by Linas Vepstas, August 1991
+ * Added 2D code, March 1993
+ * Added Outer products, C++ proofed, Linas Vepstas October 1993
+ */
+
+#ifndef __GUTIL_VECTOR_H__
+#define __GUTIL_VECTOR_H__
+
+#if defined(__cplusplus) || defined(c_plusplus)
+extern "C" {
+#endif
+
+
+#include <math.h>
+#include "port.h"
+
+/* ========================================================== */
+/* Zero out a 2D vector */
+
+#define VEC_ZERO_2(a)				\
+{						\
+   (a)[0] = (a)[1] = 0.0;			\
+}
+
+/* ========================================================== */
+/* Zero out a 3D vector */
+
+#define VEC_ZERO(a)				\
+{						\
+   (a)[0] = (a)[1] = (a)[2] = 0.0;		\
+}
+
+/* ========================================================== */
+/* Zero out a 4D vector */
+
+#define VEC_ZERO_4(a)				\
+{						\
+   (a)[0] = (a)[1] = (a)[2] = (a)[3] = 0.0;	\
+}
+
+/* ========================================================== */
+/* Vector copy */
+
+#define VEC_COPY_2(b,a)				\
+{						\
+   (b)[0] = (a)[0];				\
+   (b)[1] = (a)[1];				\
+}
+
+/* ========================================================== */
+/* Copy 3D vector */
+
+#define VEC_COPY(b,a)				\
+{						\
+   (b)[0] = (a)[0];				\
+   (b)[1] = (a)[1];				\
+   (b)[2] = (a)[2];				\
+}
+
+/* ========================================================== */
+/* Copy 4D vector */
+
+#define VEC_COPY_4(b,a)				\
+{						\
+   (b)[0] = (a)[0];				\
+   (b)[1] = (a)[1];				\
+   (b)[2] = (a)[2];				\
+   (b)[3] = (a)[3];				\
+}
+
+/* ========================================================== */
+/* Vector difference */
+
+#define VEC_DIFF_2(v21,v2,v1)			\
+{						\
+   (v21)[0] = (v2)[0] - (v1)[0];		\
+   (v21)[1] = (v2)[1] - (v1)[1];		\
+}
+
+/* ========================================================== */
+/* Vector difference */
+
+#define VEC_DIFF(v21,v2,v1)			\
+{						\
+   (v21)[0] = (v2)[0] - (v1)[0];		\
+   (v21)[1] = (v2)[1] - (v1)[1];		\
+   (v21)[2] = (v2)[2] - (v1)[2];		\
+}
+
+/* ========================================================== */
+/* Vector difference */
+
+#define VEC_DIFF_4(v21,v2,v1)			\
+{						\
+   (v21)[0] = (v2)[0] - (v1)[0];		\
+   (v21)[1] = (v2)[1] - (v1)[1];		\
+   (v21)[2] = (v2)[2] - (v1)[2];		\
+   (v21)[3] = (v2)[3] - (v1)[3];		\
+}
+
+/* ========================================================== */
+/* Vector sum */
+
+#define VEC_SUM_2(v21,v2,v1)			\
+{						\
+   (v21)[0] = (v2)[0] + (v1)[0];		\
+   (v21)[1] = (v2)[1] + (v1)[1];		\
+}
+
+/* ========================================================== */
+/* Vector sum */
+
+#define VEC_SUM(v21,v2,v1)			\
+{						\
+   (v21)[0] = (v2)[0] + (v1)[0];		\
+   (v21)[1] = (v2)[1] + (v1)[1];		\
+   (v21)[2] = (v2)[2] + (v1)[2];		\
+}
+
+/* ========================================================== */
+/* Vector sum */
+
+#define VEC_SUM_4(v21,v2,v1)			\
+{						\
+   (v21)[0] = (v2)[0] + (v1)[0];		\
+   (v21)[1] = (v2)[1] + (v1)[1];		\
+   (v21)[2] = (v2)[2] + (v1)[2];		\
+   (v21)[3] = (v2)[3] + (v1)[3];		\
+}
+
+/* ========================================================== */
+/* scalar times vector */
+
+#define VEC_SCALE_2(c,a,b)			\
+{						\
+   (c)[0] = (a)*(b)[0];				\
+   (c)[1] = (a)*(b)[1];				\
+}
+
+/* ========================================================== */
+/* scalar times vector */
+
+#define VEC_SCALE(c,a,b)			\
+{						\
+   (c)[0] = (a)*(b)[0];				\
+   (c)[1] = (a)*(b)[1];				\
+   (c)[2] = (a)*(b)[2];				\
+}
+
+/* ========================================================== */
+/* scalar times vector */
+
+#define VEC_SCALE_4(c,a,b)			\
+{						\
+   (c)[0] = (a)*(b)[0];				\
+   (c)[1] = (a)*(b)[1];				\
+   (c)[2] = (a)*(b)[2];				\
+   (c)[3] = (a)*(b)[3];				\
+}
+
+/* ========================================================== */
+/* accumulate scaled vector */
+
+#define VEC_ACCUM_2(c,a,b)			\
+{						\
+   (c)[0] += (a)*(b)[0];			\
+   (c)[1] += (a)*(b)[1];			\
+}
+
+/* ========================================================== */
+/* accumulate scaled vector */
+
+#define VEC_ACCUM(c,a,b)			\
+{						\
+   (c)[0] += (a)*(b)[0];			\
+   (c)[1] += (a)*(b)[1];			\
+   (c)[2] += (a)*(b)[2];			\
+}
+
+/* ========================================================== */
+/* accumulate scaled vector */
+
+#define VEC_ACCUM_4(c,a,b)			\
+{						\
+   (c)[0] += (a)*(b)[0];			\
+   (c)[1] += (a)*(b)[1];			\
+   (c)[2] += (a)*(b)[2];			\
+   (c)[3] += (a)*(b)[3];			\
+}
+
+/* ========================================================== */
+/* Vector dot product */
+
+#define VEC_DOT_PRODUCT_2(c,a,b)			\
+{							\
+   c = (a)[0]*(b)[0] + (a)[1]*(b)[1];			\
+}
+
+/* ========================================================== */
+/* Vector dot product */
+
+#define VEC_DOT_PRODUCT(c,a,b)				\
+{							\
+   c = (a)[0]*(b)[0] + (a)[1]*(b)[1] + (a)[2]*(b)[2];	\
+}
+
+/* ========================================================== */
+/* Vector dot product */
+
+#define VEC_DOT_PRODUCT_4(c,a,b)			\
+{							\
+   c = (a)[0]*(b)[0] + (a)[1]*(b)[1] + (a)[2]*(b)[2] + (a)[3]*(b)[3] ;	\
+}
+
+/* ========================================================== */
+/* vector impact parameter (squared) */
+
+#define VEC_IMPACT_SQ(bsq,direction,position)		\
+{							\
+   gleDouble vlen, llel;					\
+   VEC_DOT_PRODUCT (vlen, position, position);		\
+   VEC_DOT_PRODUCT (llel, direction, position);		\
+   bsq = vlen - llel*llel;				\
+}
+
+/* ========================================================== */
+/* vector impact parameter */
+
+#define VEC_IMPACT(bsq,direction,position)		\
+{							\
+   VEC_IMPACT_SQ(bsq,direction,position);		\
+   bsq = sqrt (bsq);					\
+}
+
+/* ========================================================== */
+/* Vector length */
+
+#define VEC_LENGTH_2(vlen,a)			\
+{						\
+   vlen = a[0]*a[0] + a[1]*a[1];			\
+   vlen = sqrt (vlen);				\
+}
+
+/* ========================================================== */
+/* Vector length */
+
+#define VEC_LENGTH(vlen,a)			\
+{						\
+   vlen = (a)[0]*(a)[0] + (a)[1]*(a)[1];		\
+   vlen += (a)[2]*(a)[2];			\
+   vlen = sqrt (vlen);				\
+}
+
+/* ========================================================== */
+/* Vector length */
+
+#define VEC_LENGTH_4(vlen,a)			\
+{						\
+   vlen = (a)[0]*(a)[0] + (a)[1]*(a)[1];		\
+   vlen += (a)[2]*(a)[2];			\
+   vlen += (a)[3] * (a)[3];			\
+   vlen = sqrt (vlen);				\
+}
+
+/* ========================================================== */
+/* distance between two points */
+
+#define VEC_DISTANCE(vlen,va,vb)			\
+{						\
+    gleDouble tmp[4];				\
+    VEC_DIFF (tmp, vb, va);			\
+    VEC_LENGTH (vlen, tmp);			\
+}
+
+/* ========================================================== */
+/* Vector length */
+
+#define VEC_CONJUGATE_LENGTH(vlen,a)		\
+{						\
+   vlen = 1.0 - a[0]*a[0] - a[1]*a[1] - a[2]*a[2];\
+   vlen = sqrt (vlen);				\
+}
+
+/* ========================================================== */
+/* Vector length */
+
+#define VEC_NORMALIZE(a)			\
+{						\
+   double vlen;					\
+   VEC_LENGTH (vlen,a);				\
+   if (vlen != 0.0) {				\
+      vlen = 1.0 / vlen;				\
+      a[0] *= vlen;				\
+      a[1] *= vlen;				\
+      a[2] *= vlen;				\
+   }						\
+}
+
+/* ========================================================== */
+/* Vector length */
+
+#define VEC_RENORMALIZE(a,newlen)		\
+{						\
+   double vlen;					\
+   VEC_LENGTH (vlen,a);				\
+   if (vlen != 0.0) {				\
+      vlen = newlen / vlen;				\
+      a[0] *= vlen;				\
+      a[1] *= vlen;				\
+      a[2] *= vlen;				\
+   }						\
+}
+
+/* ========================================================== */
+/* 3D Vector cross product yeilding vector */
+
+#define VEC_CROSS_PRODUCT(c,a,b)		\
+{						\
+   c[0] = (a)[1] * (b)[2] - (a)[2] * (b)[1];	\
+   c[1] = (a)[2] * (b)[0] - (a)[0] * (b)[2];	\
+   c[2] = (a)[0] * (b)[1] - (a)[1] * (b)[0];	\
+}
+
+/* ========================================================== */
+/* Vector perp -- assumes that n is of unit length 
+ * accepts vector v, subtracts out any component parallel to n */
+
+#define VEC_PERP(vp,v,n)			\
+{						\
+   double vdot;					\
+						\
+   VEC_DOT_PRODUCT (vdot, v, n);			\
+   vp[0] = (v)[0] - (vdot) * (n)[0];		\
+   vp[1] = (v)[1] - (vdot) * (n)[1];		\
+   vp[2] = (v)[2] - (vdot) * (n)[2];		\
+}
+
+/* ========================================================== */
+/* Vector parallel -- assumes that n is of unit length 
+ * accepts vector v, subtracts out any component perpendicular to n */
+
+#define VEC_PARALLEL(vp,v,n)			\
+{						\
+   double vdot;					\
+						\
+   VEC_DOT_PRODUCT (vdot, v, n);			\
+   vp[0] = (vdot) * (n)[0];			\
+   vp[1] = (vdot) * (n)[1];			\
+   vp[2] = (vdot) * (n)[2];			\
+}
+
+/* ========================================================== */
+/* Vector reflection -- assumes n is of unit length */
+/* Takes vector v, reflects it against reflector n, and returns vr */
+
+#define VEC_REFLECT(vr,v,n)			\
+{						\
+   double vdot;					\
+						\
+   VEC_DOT_PRODUCT (vdot, v, n);			\
+   vr[0] = (v)[0] - 2.0 * (vdot) * (n)[0];	\
+   vr[1] = (v)[1] - 2.0 * (vdot) * (n)[1];	\
+   vr[2] = (v)[2] - 2.0 * (vdot) * (n)[2];	\
+}
+
+/* ========================================================== */
+/* Vector blending */
+/* Takes two vectors a, b, blends them together */ 
+
+#define VEC_BLEND(vr,sa,a,sb,b)			\
+{						\
+						\
+   vr[0] = (sa) * (a)[0] + (sb) * (b)[0];	\
+   vr[1] = (sa) * (a)[1] + (sb) * (b)[1];	\
+   vr[2] = (sa) * (a)[2] + (sb) * (b)[2];	\
+}
+
+/* ========================================================== */
+/* Vector print */
+
+#define VEC_PRINT_2(a)					\
+{							\
+   double vlen;						\
+   VEC_LENGTH_2 (vlen, a);					\
+   printf (" a is %f %f length of a is %f \n", a[0], a[1], vlen); \
+}
+
+/* ========================================================== */
+/* Vector print */
+
+#define VEC_PRINT(a)					\
+{							\
+   double vlen;						\
+   VEC_LENGTH (vlen, (a));				\
+   printf (" a is %f %f %f length of a is %f \n", (a)[0], (a)[1], (a)[2], vlen); \
+}
+
+/* ========================================================== */
+/* Vector print */
+
+#define VEC_PRINT_4(a)					\
+{							\
+   double vlen;						\
+   VEC_LENGTH_4 (vlen, (a));				\
+   printf (" a is %f %f %f %f length of a is %f \n",	\
+       (a)[0], (a)[1], (a)[2], (a)[3], vlen);		\
+}
+
+/* ========================================================== */
+/* print matrix */
+
+#define MAT_PRINT_4X4(mmm) {				\
+   int i,j;						\
+   printf ("matrix mmm is \n");				\
+   if (mmm == NULL) {					\
+      printf (" Null \n");				\
+   } else {						\
+      for (i=0; i<4; i++) {				\
+         for (j=0; j<4; j++) {				\
+            printf ("%f ", mmm[i][j]);			\
+         }						\
+         printf (" \n");				\
+      }							\
+   }							\
+}
+
+/* ========================================================== */
+/* print matrix */
+
+#define MAT_PRINT_3X3(mmm) {				\
+   int i,j;						\
+   printf ("matrix mmm is \n");				\
+   if (mmm == NULL) {					\
+      printf (" Null \n");				\
+   } else {						\
+      for (i=0; i<3; i++) {				\
+         for (j=0; j<3; j++) {				\
+            printf ("%f ", mmm[i][j]);			\
+         }						\
+         printf (" \n");				\
+      }							\
+   }							\
+}
+
+/* ========================================================== */
+/* print matrix */
+
+#define MAT_PRINT_2X3(mmm) {				\
+   int i,j;						\
+   printf ("matrix mmm is \n");				\
+   if (mmm == NULL) {					\
+      printf (" Null \n");				\
+   } else {						\
+      for (i=0; i<2; i++) {				\
+         for (j=0; j<3; j++) {				\
+            printf ("%f ", mmm[i][j]);			\
+         }						\
+         printf (" \n");				\
+      }							\
+   }							\
+}
+
+/* ========================================================== */
+/* initialize matrix */
+
+#define IDENTIFY_MATRIX_3X3(m)			\
+{						\
+   m[0][0] = 1.0;				\
+   m[0][1] = 0.0;				\
+   m[0][2] = 0.0;				\
+						\
+   m[1][0] = 0.0;				\
+   m[1][1] = 1.0;				\
+   m[1][2] = 0.0;				\
+						\
+   m[2][0] = 0.0;				\
+   m[2][1] = 0.0;				\
+   m[2][2] = 1.0;				\
+}
+
+/* ========================================================== */
+/* initialize matrix */
+
+#define IDENTIFY_MATRIX_4X4(m)			\
+{						\
+   m[0][0] = 1.0;				\
+   m[0][1] = 0.0;				\
+   m[0][2] = 0.0;				\
+   m[0][3] = 0.0;				\
+						\
+   m[1][0] = 0.0;				\
+   m[1][1] = 1.0;				\
+   m[1][2] = 0.0;				\
+   m[1][3] = 0.0;				\
+						\
+   m[2][0] = 0.0;				\
+   m[2][1] = 0.0;				\
+   m[2][2] = 1.0;				\
+   m[2][3] = 0.0;				\
+						\
+   m[3][0] = 0.0;				\
+   m[3][1] = 0.0;				\
+   m[3][2] = 0.0;				\
+   m[3][3] = 1.0;				\
+}
+
+/* ========================================================== */
+/* matrix copy */
+
+#define COPY_MATRIX_2X2(b,a)	\
+{				\
+   b[0][0] = a[0][0];		\
+   b[0][1] = a[0][1];		\
+				\
+   b[1][0] = a[1][0];		\
+   b[1][1] = a[1][1];		\
+				\
+}
+
+/* ========================================================== */
+/* matrix copy */
+
+#define COPY_MATRIX_2X3(b,a)	\
+{				\
+   b[0][0] = a[0][0];		\
+   b[0][1] = a[0][1];		\
+   b[0][2] = a[0][2];		\
+				\
+   b[1][0] = a[1][0];		\
+   b[1][1] = a[1][1];		\
+   b[1][2] = a[1][2];		\
+}
+
+/* ========================================================== */
+/* matrix copy */
+
+#define COPY_MATRIX_3X3(b,a)	\
+{				\
+   b[0][0] = a[0][0];		\
+   b[0][1] = a[0][1];		\
+   b[0][2] = a[0][2];		\
+				\
+   b[1][0] = a[1][0];		\
+   b[1][1] = a[1][1];		\
+   b[1][2] = a[1][2];		\
+				\
+   b[2][0] = a[2][0];		\
+   b[2][1] = a[2][1];		\
+   b[2][2] = a[2][2];		\
+}
+
+/* ========================================================== */
+/* matrix copy */
+
+#define COPY_MATRIX_4X4(b,a)	\
+{				\
+   b[0][0] = a[0][0];		\
+   b[0][1] = a[0][1];		\
+   b[0][2] = a[0][2];		\
+   b[0][3] = a[0][3];		\
+				\
+   b[1][0] = a[1][0];		\
+   b[1][1] = a[1][1];		\
+   b[1][2] = a[1][2];		\
+   b[1][3] = a[1][3];		\
+				\
+   b[2][0] = a[2][0];		\
+   b[2][1] = a[2][1];		\
+   b[2][2] = a[2][2];		\
+   b[2][3] = a[2][3];		\
+				\
+   b[3][0] = a[3][0];		\
+   b[3][1] = a[3][1];		\
+   b[3][2] = a[3][2];		\
+   b[3][3] = a[3][3];		\
+}
+
+/* ========================================================== */
+/* matrix transpose */
+
+#define TRANSPOSE_MATRIX_2X2(b,a)	\
+{				\
+   b[0][0] = a[0][0];		\
+   b[0][1] = a[1][0];		\
+				\
+   b[1][0] = a[0][1];		\
+   b[1][1] = a[1][1];		\
+}
+
+/* ========================================================== */
+/* matrix transpose */
+
+#define TRANSPOSE_MATRIX_3X3(b,a)	\
+{				\
+   b[0][0] = a[0][0];		\
+   b[0][1] = a[1][0];		\
+   b[0][2] = a[2][0];		\
+				\
+   b[1][0] = a[0][1];		\
+   b[1][1] = a[1][1];		\
+   b[1][2] = a[2][1];		\
+				\
+   b[2][0] = a[0][2];		\
+   b[2][1] = a[1][2];		\
+   b[2][2] = a[2][2];		\
+}
+
+/* ========================================================== */
+/* matrix transpose */
+
+#define TRANSPOSE_MATRIX_4X4(b,a)	\
+{				\
+   b[0][0] = a[0][0];		\
+   b[0][1] = a[1][0];		\
+   b[0][2] = a[2][0];		\
+   b[0][3] = a[3][0];		\
+				\
+   b[1][0] = a[0][1];		\
+   b[1][1] = a[1][1];		\
+   b[1][2] = a[2][1];		\
+   b[1][3] = a[3][1];		\
+				\
+   b[2][0] = a[0][2];		\
+   b[2][1] = a[1][2];		\
+   b[2][2] = a[2][2];		\
+   b[2][3] = a[3][2];		\
+				\
+   b[3][0] = a[0][3];		\
+   b[3][1] = a[1][3];		\
+   b[3][2] = a[2][3];		\
+   b[3][3] = a[3][3];		\
+}
+
+/* ========================================================== */
+/* multiply matrix by scalar */
+
+#define SCALE_MATRIX_2X2(b,s,a)		\
+{					\
+   b[0][0] = (s) * a[0][0];		\
+   b[0][1] = (s) * a[0][1];		\
+					\
+   b[1][0] = (s) * a[1][0];		\
+   b[1][1] = (s) * a[1][1];		\
+}
+
+/* ========================================================== */
+/* multiply matrix by scalar */
+
+#define SCALE_MATRIX_3X3(b,s,a)		\
+{					\
+   b[0][0] = (s) * a[0][0];		\
+   b[0][1] = (s) * a[0][1];		\
+   b[0][2] = (s) * a[0][2];		\
+					\
+   b[1][0] = (s) * a[1][0];		\
+   b[1][1] = (s) * a[1][1];		\
+   b[1][2] = (s) * a[1][2];		\
+					\
+   b[2][0] = (s) * a[2][0];		\
+   b[2][1] = (s) * a[2][1];		\
+   b[2][2] = (s) * a[2][2];		\
+}
+
+/* ========================================================== */
+/* multiply matrix by scalar */
+
+#define SCALE_MATRIX_4X4(b,s,a)		\
+{					\
+   b[0][0] = (s) * a[0][0];		\
+   b[0][1] = (s) * a[0][1];		\
+   b[0][2] = (s) * a[0][2];		\
+   b[0][3] = (s) * a[0][3];		\
+					\
+   b[1][0] = (s) * a[1][0];		\
+   b[1][1] = (s) * a[1][1];		\
+   b[1][2] = (s) * a[1][2];		\
+   b[1][3] = (s) * a[1][3];		\
+					\
+   b[2][0] = (s) * a[2][0];		\
+   b[2][1] = (s) * a[2][1];		\
+   b[2][2] = (s) * a[2][2];		\
+   b[2][3] = (s) * a[2][3];		\
+					\
+   b[3][0] = s * a[3][0];		\
+   b[3][1] = s * a[3][1];		\
+   b[3][2] = s * a[3][2];		\
+   b[3][3] = s * a[3][3];		\
+}
+
+/* ========================================================== */
+/* multiply matrix by scalar */
+
+#define ACCUM_SCALE_MATRIX_2X2(b,s,a)		\
+{					\
+   b[0][0] += (s) * a[0][0];		\
+   b[0][1] += (s) * a[0][1];		\
+					\
+   b[1][0] += (s) * a[1][0];		\
+   b[1][1] += (s) * a[1][1];		\
+}
+
+/* +========================================================== */
+/* multiply matrix by scalar */
+
+#define ACCUM_SCALE_MATRIX_3X3(b,s,a)		\
+{					\
+   b[0][0] += (s) * a[0][0];		\
+   b[0][1] += (s) * a[0][1];		\
+   b[0][2] += (s) * a[0][2];		\
+					\
+   b[1][0] += (s) * a[1][0];		\
+   b[1][1] += (s) * a[1][1];		\
+   b[1][2] += (s) * a[1][2];		\
+					\
+   b[2][0] += (s) * a[2][0];		\
+   b[2][1] += (s) * a[2][1];		\
+   b[2][2] += (s) * a[2][2];		\
+}
+
+/* +========================================================== */
+/* multiply matrix by scalar */
+
+#define ACCUM_SCALE_MATRIX_4X4(b,s,a)		\
+{					\
+   b[0][0] += (s) * a[0][0];		\
+   b[0][1] += (s) * a[0][1];		\
+   b[0][2] += (s) * a[0][2];		\
+   b[0][3] += (s) * a[0][3];		\
+					\
+   b[1][0] += (s) * a[1][0];		\
+   b[1][1] += (s) * a[1][1];		\
+   b[1][2] += (s) * a[1][2];		\
+   b[1][3] += (s) * a[1][3];		\
+					\
+   b[2][0] += (s) * a[2][0];		\
+   b[2][1] += (s) * a[2][1];		\
+   b[2][2] += (s) * a[2][2];		\
+   b[2][3] += (s) * a[2][3];		\
+					\
+   b[3][0] += (s) * a[3][0];		\
+   b[3][1] += (s) * a[3][1];		\
+   b[3][2] += (s) * a[3][2];		\
+   b[3][3] += (s) * a[3][3];		\
+}
+
+/* +========================================================== */
+/* matrix product */
+/* c[x][y] = a[x][0]*b[0][y]+a[x][1]*b[1][y]+a[x][2]*b[2][y]+a[x][3]*b[3][y];*/
+
+#define MATRIX_PRODUCT_2X2(c,a,b)		\
+{						\
+   c[0][0] = a[0][0]*b[0][0]+a[0][1]*b[1][0];	\
+   c[0][1] = a[0][0]*b[0][1]+a[0][1]*b[1][1];	\
+						\
+   c[1][0] = a[1][0]*b[0][0]+a[1][1]*b[1][0];	\
+   c[1][1] = a[1][0]*b[0][1]+a[1][1]*b[1][1];	\
+						\
+}
+
+/* ========================================================== */
+/* matrix product */
+/* c[x][y] = a[x][0]*b[0][y]+a[x][1]*b[1][y]+a[x][2]*b[2][y]+a[x][3]*b[3][y];*/
+
+#define MATRIX_PRODUCT_3X3(c,a,b)				\
+{								\
+   c[0][0] = a[0][0]*b[0][0]+a[0][1]*b[1][0]+a[0][2]*b[2][0];	\
+   c[0][1] = a[0][0]*b[0][1]+a[0][1]*b[1][1]+a[0][2]*b[2][1];	\
+   c[0][2] = a[0][0]*b[0][2]+a[0][1]*b[1][2]+a[0][2]*b[2][2];	\
+								\
+   c[1][0] = a[1][0]*b[0][0]+a[1][1]*b[1][0]+a[1][2]*b[2][0];	\
+   c[1][1] = a[1][0]*b[0][1]+a[1][1]*b[1][1]+a[1][2]*b[2][1];	\
+   c[1][2] = a[1][0]*b[0][2]+a[1][1]*b[1][2]+a[1][2]*b[2][2];	\
+								\
+   c[2][0] = a[2][0]*b[0][0]+a[2][1]*b[1][0]+a[2][2]*b[2][0];	\
+   c[2][1] = a[2][0]*b[0][1]+a[2][1]*b[1][1]+a[2][2]*b[2][1];	\
+   c[2][2] = a[2][0]*b[0][2]+a[2][1]*b[1][2]+a[2][2]*b[2][2];	\
+}
+
+/* ========================================================== */
+/* matrix product */
+/* c[x][y] = a[x][0]*b[0][y]+a[x][1]*b[1][y]+a[x][2]*b[2][y]+a[x][3]*b[3][y];*/
+
+#define MATRIX_PRODUCT_4X4(c,a,b)		\
+{						\
+   c[0][0] = a[0][0]*b[0][0]+a[0][1]*b[1][0]+a[0][2]*b[2][0]+a[0][3]*b[3][0];\
+   c[0][1] = a[0][0]*b[0][1]+a[0][1]*b[1][1]+a[0][2]*b[2][1]+a[0][3]*b[3][1];\
+   c[0][2] = a[0][0]*b[0][2]+a[0][1]*b[1][2]+a[0][2]*b[2][2]+a[0][3]*b[3][2];\
+   c[0][3] = a[0][0]*b[0][3]+a[0][1]*b[1][3]+a[0][2]*b[2][3]+a[0][3]*b[3][3];\
+						\
+   c[1][0] = a[1][0]*b[0][0]+a[1][1]*b[1][0]+a[1][2]*b[2][0]+a[1][3]*b[3][0];\
+   c[1][1] = a[1][0]*b[0][1]+a[1][1]*b[1][1]+a[1][2]*b[2][1]+a[1][3]*b[3][1];\
+   c[1][2] = a[1][0]*b[0][2]+a[1][1]*b[1][2]+a[1][2]*b[2][2]+a[1][3]*b[3][2];\
+   c[1][3] = a[1][0]*b[0][3]+a[1][1]*b[1][3]+a[1][2]*b[2][3]+a[1][3]*b[3][3];\
+						\
+   c[2][0] = a[2][0]*b[0][0]+a[2][1]*b[1][0]+a[2][2]*b[2][0]+a[2][3]*b[3][0];\
+   c[2][1] = a[2][0]*b[0][1]+a[2][1]*b[1][1]+a[2][2]*b[2][1]+a[2][3]*b[3][1];\
+   c[2][2] = a[2][0]*b[0][2]+a[2][1]*b[1][2]+a[2][2]*b[2][2]+a[2][3]*b[3][2];\
+   c[2][3] = a[2][0]*b[0][3]+a[2][1]*b[1][3]+a[2][2]*b[2][3]+a[2][3]*b[3][3];\
+						\
+   c[3][0] = a[3][0]*b[0][0]+a[3][1]*b[1][0]+a[3][2]*b[2][0]+a[3][3]*b[3][0];\
+   c[3][1] = a[3][0]*b[0][1]+a[3][1]*b[1][1]+a[3][2]*b[2][1]+a[3][3]*b[3][1];\
+   c[3][2] = a[3][0]*b[0][2]+a[3][1]*b[1][2]+a[3][2]*b[2][2]+a[3][3]*b[3][2];\
+   c[3][3] = a[3][0]*b[0][3]+a[3][1]*b[1][3]+a[3][2]*b[2][3]+a[3][3]*b[3][3];\
+}
+
+/* ========================================================== */
+/* matrix times vector */
+
+#define MAT_DOT_VEC_2X2(p,m,v)					\
+{								\
+   p[0] = m[0][0]*v[0] + m[0][1]*v[1];				\
+   p[1] = m[1][0]*v[0] + m[1][1]*v[1];				\
+}
+
+/* ========================================================== */
+/* matrix times vector */
+
+#define MAT_DOT_VEC_3X3(p,m,v)					\
+{								\
+   p[0] = m[0][0]*v[0] + m[0][1]*v[1] + m[0][2]*v[2];		\
+   p[1] = m[1][0]*v[0] + m[1][1]*v[1] + m[1][2]*v[2];		\
+   p[2] = m[2][0]*v[0] + m[2][1]*v[1] + m[2][2]*v[2];		\
+}
+
+/* ========================================================== */
+/* matrix times vector */
+
+#define MAT_DOT_VEC_4X4(p,m,v)					\
+{								\
+   p[0] = m[0][0]*v[0] + m[0][1]*v[1] + m[0][2]*v[2] + m[0][3]*v[3];	\
+   p[1] = m[1][0]*v[0] + m[1][1]*v[1] + m[1][2]*v[2] + m[1][3]*v[3];	\
+   p[2] = m[2][0]*v[0] + m[2][1]*v[1] + m[2][2]*v[2] + m[2][3]*v[3];	\
+   p[3] = m[3][0]*v[0] + m[3][1]*v[1] + m[3][2]*v[2] + m[3][3]*v[3];	\
+}
+
+/* ========================================================== */
+/* vector transpose times matrix */
+/* p[j] = v[0]*m[0][j] + v[1]*m[1][j] + v[2]*m[2][j]; */
+
+#define VEC_DOT_MAT_3X3(p,v,m)					\
+{								\
+   p[0] = v[0]*m[0][0] + v[1]*m[1][0] + v[2]*m[2][0];		\
+   p[1] = v[0]*m[0][1] + v[1]*m[1][1] + v[2]*m[2][1];		\
+   p[2] = v[0]*m[0][2] + v[1]*m[1][2] + v[2]*m[2][2];		\
+}
+
+/* ========================================================== */
+/* affine matrix times vector */
+/* The matrix is assumed to be an affine matrix, with last two 
+ * entries representing a translation */
+
+#define MAT_DOT_VEC_2X3(p,m,v)					\
+{								\
+   p[0] = m[0][0]*v[0] + m[0][1]*v[1] + m[0][2];		\
+   p[1] = m[1][0]*v[0] + m[1][1]*v[1] + m[1][2];		\
+}
+
+/* ========================================================== */
+/* inverse transpose of matrix times vector
+ *
+ * This macro computes inverse transpose of matrix m, 
+ * and multiplies vector v into it, to yeild vector p
+ *
+ * DANGER !!! Do Not use this on normal vectors!!!
+ * It will leave normals the wrong length !!!
+ * See macro below for use on normals.
+ */
+
+#define INV_TRANSP_MAT_DOT_VEC_2X2(p,m,v)			\
+{								\
+   gleDouble det;						\
+								\
+   det = m[0][0]*m[1][1] - m[0][1]*m[1][0];			\
+   p[0] = m[1][1]*v[0] - m[1][0]*v[1];				\
+   p[1] = - m[0][1]*v[0] + m[0][0]*v[1];			\
+								\
+   /* if matrix not singular, and not orthonormal, then renormalize */ \
+   if ((det!=1.0) && (det != 0.0)) {				\
+      det = 1.0 / det;						\
+      p[0] *= det;						\
+      p[1] *= det;						\
+   }								\
+}
+
+/* ========================================================== */
+/* transform normal vector by inverse transpose of matrix 
+ * and then renormalize the vector 
+ *
+ * This macro computes inverse transpose of matrix m, 
+ * and multiplies vector v into it, to yeild vector p
+ * Vector p is then normalized.
+ */
+
+
+#define NORM_XFORM_2X2(p,m,v)					\
+{								\
+   double mlen;							\
+								\
+   /* do nothing if off-diagonals are zero and diagonals are 	\
+    * equal */							\
+   if ((m[0][1] != 0.0) || (m[1][0] != 0.0) || (m[0][0] != m[1][1])) { \
+      p[0] = m[1][1]*v[0] - m[1][0]*v[1];			\
+      p[1] = - m[0][1]*v[0] + m[0][0]*v[1];			\
+								\
+      mlen = p[0]*p[0] + p[1]*p[1];				\
+      mlen = 1.0 / sqrt (mlen);					\
+      p[0] *= mlen;						\
+      p[1] *= mlen;						\
+   } else {							\
+      VEC_COPY_2 (p, v);					\
+   }								\
+}
+
+/* ========================================================== */
+/* outer product of vector times vector transpose 
+ *
+ * The outer product of vector v and vector transpose t yeilds 
+ * dyadic matrix m.
+ */
+
+#define OUTER_PRODUCT_2X2(m,v,t)				\
+{								\
+   m[0][0] = v[0] * t[0];					\
+   m[0][1] = v[0] * t[1];					\
+								\
+   m[1][0] = v[1] * t[0];					\
+   m[1][1] = v[1] * t[1];					\
+}
+
+/* ========================================================== */
+/* outer product of vector times vector transpose 
+ *
+ * The outer product of vector v and vector transpose t yeilds 
+ * dyadic matrix m.
+ */
+
+#define OUTER_PRODUCT_3X3(m,v,t)				\
+{								\
+   m[0][0] = v[0] * t[0];					\
+   m[0][1] = v[0] * t[1];					\
+   m[0][2] = v[0] * t[2];					\
+								\
+   m[1][0] = v[1] * t[0];					\
+   m[1][1] = v[1] * t[1];					\
+   m[1][2] = v[1] * t[2];					\
+								\
+   m[2][0] = v[2] * t[0];					\
+   m[2][1] = v[2] * t[1];					\
+   m[2][2] = v[2] * t[2];					\
+}
+
+/* ========================================================== */
+/* outer product of vector times vector transpose 
+ *
+ * The outer product of vector v and vector transpose t yeilds 
+ * dyadic matrix m.
+ */
+
+#define OUTER_PRODUCT_4X4(m,v,t)				\
+{								\
+   m[0][0] = v[0] * t[0];					\
+   m[0][1] = v[0] * t[1];					\
+   m[0][2] = v[0] * t[2];					\
+   m[0][3] = v[0] * t[3];					\
+								\
+   m[1][0] = v[1] * t[0];					\
+   m[1][1] = v[1] * t[1];					\
+   m[1][2] = v[1] * t[2];					\
+   m[1][3] = v[1] * t[3];					\
+								\
+   m[2][0] = v[2] * t[0];					\
+   m[2][1] = v[2] * t[1];					\
+   m[2][2] = v[2] * t[2];					\
+   m[2][3] = v[2] * t[3];					\
+								\
+   m[3][0] = v[3] * t[0];					\
+   m[3][1] = v[3] * t[1];					\
+   m[3][2] = v[3] * t[2];					\
+   m[3][3] = v[3] * t[3];					\
+}
+
+/* +========================================================== */
+/* outer product of vector times vector transpose 
+ *
+ * The outer product of vector v and vector transpose t yeilds 
+ * dyadic matrix m.
+ */
+
+#define ACCUM_OUTER_PRODUCT_2X2(m,v,t)				\
+{								\
+   m[0][0] += v[0] * t[0];					\
+   m[0][1] += v[0] * t[1];					\
+								\
+   m[1][0] += v[1] * t[0];					\
+   m[1][1] += v[1] * t[1];					\
+}
+
+/* +========================================================== */
+/* outer product of vector times vector transpose 
+ *
+ * The outer product of vector v and vector transpose t yeilds 
+ * dyadic matrix m.
+ */
+
+#define ACCUM_OUTER_PRODUCT_3X3(m,v,t)				\
+{								\
+   m[0][0] += v[0] * t[0];					\
+   m[0][1] += v[0] * t[1];					\
+   m[0][2] += v[0] * t[2];					\
+								\
+   m[1][0] += v[1] * t[0];					\
+   m[1][1] += v[1] * t[1];					\
+   m[1][2] += v[1] * t[2];					\
+								\
+   m[2][0] += v[2] * t[0];					\
+   m[2][1] += v[2] * t[1];					\
+   m[2][2] += v[2] * t[2];					\
+}
+
+/* +========================================================== */
+/* outer product of vector times vector transpose 
+ *
+ * The outer product of vector v and vector transpose t yeilds 
+ * dyadic matrix m.
+ */
+
+#define ACCUM_OUTER_PRODUCT_4X4(m,v,t)				\
+{								\
+   m[0][0] += v[0] * t[0];					\
+   m[0][1] += v[0] * t[1];					\
+   m[0][2] += v[0] * t[2];					\
+   m[0][3] += v[0] * t[3];					\
+								\
+   m[1][0] += v[1] * t[0];					\
+   m[1][1] += v[1] * t[1];					\
+   m[1][2] += v[1] * t[2];					\
+   m[1][3] += v[1] * t[3];					\
+								\
+   m[2][0] += v[2] * t[0];					\
+   m[2][1] += v[2] * t[1];					\
+   m[2][2] += v[2] * t[2];					\
+   m[2][3] += v[2] * t[3];					\
+								\
+   m[3][0] += v[3] * t[0];					\
+   m[3][1] += v[3] * t[1];					\
+   m[3][2] += v[3] * t[2];					\
+   m[3][3] += v[3] * t[3];					\
+}
+
+/* +========================================================== */
+/* determinant of matrix
+ *
+ * Computes determinant of matrix m, returning d
+ */
+
+#define DETERMINANT_2X2(d,m)					\
+{								\
+   d = m[0][0] * m[1][1] - m[0][1] * m[1][0];			\
+}
+
+/* ========================================================== */
+/* determinant of matrix
+ *
+ * Computes determinant of matrix m, returning d
+ */
+
+#define DETERMINANT_3X3(d,m)					\
+{								\
+   d = m[0][0] * (m[1][1]*m[2][2] - m[1][2] * m[2][1]);		\
+   d -= m[0][1] * (m[1][0]*m[2][2] - m[1][2] * m[2][0]);	\
+   d += m[0][2] * (m[1][0]*m[2][1] - m[1][1] * m[2][0]);	\
+}
+
+/* ========================================================== */
+/* i,j,th cofactor of a 4x4 matrix
+ *
+ */
+
+#define COFACTOR_4X4_IJ(fac,m,i,j) 				\
+{								\
+   int ii[4], jj[4], k;						\
+								\
+   /* compute which row, columnt to skip */			\
+   for (k=0; k<i; k++) ii[k] = k;				\
+   for (k=i; k<3; k++) ii[k] = k+1;				\
+   for (k=0; k<j; k++) jj[k] = k;				\
+   for (k=j; k<3; k++) jj[k] = k+1;				\
+								\
+   (fac) = m[ii[0]][jj[0]] * (m[ii[1]][jj[1]]*m[ii[2]][jj[2]] 	\
+                            - m[ii[1]][jj[2]]*m[ii[2]][jj[1]]); \
+   (fac) -= m[ii[0]][jj[1]] * (m[ii[1]][jj[0]]*m[ii[2]][jj[2]]	\
+                             - m[ii[1]][jj[2]]*m[ii[2]][jj[0]]);\
+   (fac) += m[ii[0]][jj[2]] * (m[ii[1]][jj[0]]*m[ii[2]][jj[1]]	\
+                             - m[ii[1]][jj[1]]*m[ii[2]][jj[0]]);\
+								\
+   /* compute sign */						\
+   k = i+j;							\
+   if ( k != (k/2)*2) {						\
+      (fac) = -(fac);						\
+   }								\
+}
+
+/* ========================================================== */
+/* determinant of matrix
+ *
+ * Computes determinant of matrix m, returning d
+ */
+
+#define DETERMINANT_4X4(d,m)					\
+{								\
+   double cofac;						\
+   COFACTOR_4X4_IJ (cofac, m, 0, 0);				\
+   d = m[0][0] * cofac;						\
+   COFACTOR_4X4_IJ (cofac, m, 0, 1);				\
+   d += m[0][1] * cofac;					\
+   COFACTOR_4X4_IJ (cofac, m, 0, 2);				\
+   d += m[0][2] * cofac;					\
+   COFACTOR_4X4_IJ (cofac, m, 0, 3);				\
+   d += m[0][3] * cofac;					\
+}
+
+/* ========================================================== */
+/* cofactor of matrix
+ *
+ * Computes cofactor of matrix m, returning a
+ */
+
+#define COFACTOR_2X2(a,m)					\
+{								\
+   a[0][0] = (m)[1][1];						\
+   a[0][1] = - (m)[1][0];						\
+   a[1][0] = - (m)[0][1];						\
+   a[1][1] = (m)[0][0];						\
+}
+
+/* ========================================================== */
+/* cofactor of matrix
+ *
+ * Computes cofactor of matrix m, returning a
+ */
+
+#define COFACTOR_3X3(a,m)					\
+{								\
+   a[0][0] = m[1][1]*m[2][2] - m[1][2]*m[2][1];			\
+   a[0][1] = - (m[1][0]*m[2][2] - m[2][0]*m[1][2]);		\
+   a[0][2] = m[1][0]*m[2][1] - m[1][1]*m[2][0];			\
+   a[1][0] = - (m[0][1]*m[2][2] - m[0][2]*m[2][1]);		\
+   a[1][1] = m[0][0]*m[2][2] - m[0][2]*m[2][0];			\
+   a[1][2] = - (m[0][0]*m[2][1] - m[0][1]*m[2][0]);		\
+   a[2][0] = m[0][1]*m[1][2] - m[0][2]*m[1][1];			\
+   a[2][1] = - (m[0][0]*m[1][2] - m[0][2]*m[1][0]);		\
+   a[2][2] = m[0][0]*m[1][1] - m[0][1]*m[1][0]);		\
+}
+
+/* ========================================================== */
+/* cofactor of matrix
+ *
+ * Computes cofactor of matrix m, returning a
+ */
+
+#define COFACTOR_4X4(a,m)					\
+{								\
+   int i,j;							\
+								\
+   for (i=0; i<4; i++) {					\
+      for (j=0; j<4; j++) {					\
+         COFACTOR_4X4_IJ (a[i][j], m, i, j);			\
+      }								\
+   }								\
+}
+
+/* ========================================================== */
+/* adjoint of matrix
+ *
+ * Computes adjoint of matrix m, returning a
+ * (Note that adjoint is just the transpose of the cofactor matrix)
+ */
+
+#define ADJOINT_2X2(a,m)					\
+{								\
+   a[0][0] = (m)[1][1];						\
+   a[1][0] = - (m)[1][0];						\
+   a[0][1] = - (m)[0][1];						\
+   a[1][1] = (m)[0][0];						\
+}
+
+/* ========================================================== */
+/* adjoint of matrix
+ *
+ * Computes adjoint of matrix m, returning a
+ * (Note that adjoint is just the transpose of the cofactor matrix)
+ */
+
+
+#define ADJOINT_3X3(a,m)					\
+{								\
+   a[0][0] = m[1][1]*m[2][2] - m[1][2]*m[2][1];			\
+   a[1][0] = - (m[1][0]*m[2][2] - m[2][0]*m[1][2]);		\
+   a[2][0] = m[1][0]*m[2][1] - m[1][1]*m[2][0];			\
+   a[0][1] = - (m[0][1]*m[2][2] - m[0][2]*m[2][1]);		\
+   a[1][1] = m[0][0]*m[2][2] - m[0][2]*m[2][0];			\
+   a[2][1] = - (m[0][0]*m[2][1] - m[0][1]*m[2][0]);		\
+   a[0][2] = m[0][1]*m[1][2] - m[0][2]*m[1][1];			\
+   a[1][2] = - (m[0][0]*m[1][2] - m[0][2]*m[1][0]);		\
+   a[2][2] = m[0][0]*m[1][1] - m[0][1]*m[1][0]);		\
+}
+
+/* ========================================================== */
+/* adjoint of matrix
+ *
+ * Computes adjoint of matrix m, returning a
+ * (Note that adjoint is just the transpose of the cofactor matrix)
+ */
+
+#define ADJOINT_4X4(a,m)					\
+{								\
+   int i,j;							\
+								\
+   for (i=0; i<4; i++) {					\
+      for (j=0; j<4; j++) {					\
+         COFACTOR_4X4_IJ (a[j][i], m, i, j);			\
+      }								\
+   }								\
+}
+
+/* ========================================================== */
+/* compute adjoint of matrix and scale
+ *
+ * Computes adjoint of matrix m, scales it by s, returning a
+ */
+
+#define SCALE_ADJOINT_2X2(a,s,m)				\
+{								\
+   a[0][0] = (s) * m[1][1];					\
+   a[1][0] = - (s) * m[1][0];					\
+   a[0][1] = - (s) * m[0][1];					\
+   a[1][1] = (s) * m[0][0];					\
+}
+
+/* ========================================================== */
+/* compute adjoint of matrix and scale
+ *
+ * Computes adjoint of matrix m, scales it by s, returning a
+ */
+
+#define SCALE_ADJOINT_3X3(a,s,m)				\
+{								\
+   a[0][0] = (s) * (m[1][1] * m[2][2] - m[1][2] * m[2][1]);	\
+   a[1][0] = (s) * (m[1][2] * m[2][0] - m[1][0] * m[2][2]);	\
+   a[2][0] = (s) * (m[1][0] * m[2][1] - m[1][1] * m[2][0]);	\
+								\
+   a[0][1] = (s) * (m[0][2] * m[2][1] - m[0][1] * m[2][2]);	\
+   a[1][1] = (s) * (m[0][0] * m[2][2] - m[0][2] * m[2][0]);	\
+   a[2][1] = (s) * (m[0][1] * m[2][0] - m[0][0] * m[2][1]);	\
+								\
+   a[0][2] = (s) * (m[0][1] * m[1][2] - m[0][2] * m[1][1]);	\
+   a[1][2] = (s) * (m[0][2] * m[1][0] - m[0][0] * m[1][2]);	\
+   a[2][2] = (s) * (m[0][0] * m[1][1] - m[0][1] * m[1][0]);	\
+}
+
+/* ========================================================== */
+/* compute adjoint of matrix and scale
+ *
+ * Computes adjoint of matrix m, scales it by s, returning a
+ */
+
+#define SCALE_ADJOINT_4X4(a,s,m)				\
+{								\
+   int i,j;							\
+								\
+   for (i=0; i<4; i++) {					\
+      for (j=0; j<4; j++) {					\
+         COFACTOR_4X4_IJ (a[j][i], m, i, j);			\
+         a[j][i] *= s;						\
+      }								\
+   }								\
+}
+
+/* ========================================================== */
+/* inverse of matrix 
+ *
+ * Compute inverse of matrix a, returning determinant m and 
+ * inverse b
+ */
+
+#define INVERT_2X2(b,det,a)			\
+{						\
+   double tmp;					\
+   DETERMINANT_2X2 (det, a);			\
+   tmp = 1.0 / (det);				\
+   SCALE_ADJOINT_2X2 (b, tmp, a);		\
+}
+
+/* ========================================================== */
+/* inverse of matrix 
+ *
+ * Compute inverse of matrix a, returning determinant m and 
+ * inverse b
+ */
+
+#define INVERT_3X3(b,det,a)			\
+{						\
+   double tmp;					\
+   DETERMINANT_3X3 (det, a);			\
+   tmp = 1.0 / (det);				\
+   SCALE_ADJOINT_3X3 (b, tmp, a);		\
+}
+
+/* ========================================================== */
+/* inverse of matrix 
+ *
+ * Compute inverse of matrix a, returning determinant m and 
+ * inverse b
+ */
+
+#define INVERT_4X4(b,det,a)			\
+{						\
+   double tmp;					\
+   DETERMINANT_4X4 (det, a);			\
+   tmp = 1.0 / (det);				\
+   SCALE_ADJOINT_4X4 (b, tmp, a);		\
+}
+
+/* ========================================================== */
+#if defined(__cplusplus) || defined(c_plusplus)
+}
+#endif
+
+#endif /* __GUTIL_VECTOR_H__ */
+/* ===================== END OF FILE ======================== */
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Resources/Caution.tiff has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Resources/English.lproj/GLUT.nib/classes.nib	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,55 @@
+{
+    IBClasses = (
+        {
+            ACTIONS = {save = id; saveAs = id; }; 
+            CLASS = FirstResponder; 
+            LANGUAGE = ObjC; 
+            SUPERCLASS = NSObject; 
+        }, 
+        {
+            ACTIONS = {timerAction = id; }; 
+            CLASS = GLUTApplication; 
+            LANGUAGE = ObjC; 
+            OUTLETS = {
+                "_aboutMenuItem" = NSMenuItem; 
+                "_hideMenuItem" = NSMenuItem; 
+                "_quitMenuItem" = NSMenuItem; 
+            }; 
+            SUPERCLASS = NSApplication; 
+        }, 
+        {
+            ACTIONS = {toggleWindow = id; }; 
+            CLASS = GLUTClipboardController; 
+            LANGUAGE = ObjC; 
+            OUTLETS = {"_infoText" = id; "_scrollView" = id; }; 
+            SUPERCLASS = NSWindowController; 
+        }, 
+        {
+            ACTIONS = {
+                assign = id; 
+                cancel = id; 
+                inputMenu = id; 
+                invertInput = id; 
+                mouseMatrix = id; 
+                mousePreset = id; 
+                ok = id; 
+                setDefault = id; 
+            }; 
+            CLASS = GLUTPreferencesController; 
+            LANGUAGE = ObjC; 
+            OUTLETS = {
+                assignPrompt = NSTextField; 
+                assignText = NSTextField; 
+                inputMenu = NSPopUpButton; 
+                inverted = NSButton; 
+                mbConfigMenu = NSPopUpButton; 
+                mbConfigWarningIcon = NSImageView; 
+                mbConfigWarningText = NSTextField; 
+                middleButtonMatrix = NSMatrix; 
+                rightButtonMatrix = NSMatrix; 
+            }; 
+            SUPERCLASS = NSWindowController; 
+        }
+    ); 
+    IBVersion = 1; 
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Resources/English.lproj/GLUT.nib/info.nib	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>IBDocumentLocation</key>
+	<string>4 104 410 240 0 0 1152 848 </string>
+	<key>IBEditorPositions</key>
+	<dict>
+		<key>29</key>
+		<string>19 615 246 44 0 0 1152 848 </string>
+	</dict>
+	<key>IBFramework Version</key>
+	<string>291.0</string>
+	<key>IBGroupedObjects</key>
+	<dict/>
+	<key>IBLastGroupID</key>
+	<string>1</string>
+	<key>IBOpenObjects</key>
+	<array>
+		<integer>29</integer>
+	</array>
+	<key>IBSystem Version</key>
+	<string>6I32</string>
+</dict>
+</plist>
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Resources/English.lproj/GLUT.nib/objects.nib has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Resources/English.lproj/GLUTClipboard.nib/classes.nib	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,13 @@
+{
+    IBClasses = (
+        {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, 
+        {
+            ACTIONS = {toggleWindow = id; }; 
+            CLASS = GLUTClipboardController; 
+            LANGUAGE = ObjC; 
+            OUTLETS = {_infoText = id; _scrollView = id; }; 
+            SUPERCLASS = NSWindowController; 
+        }
+    ); 
+    IBVersion = 1; 
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Resources/English.lproj/GLUTClipboard.nib/info.nib	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist SYSTEM "file://localhost/System/Library/DTDs/PropertyList.dtd">
+<plist version="0.9">
+<dict>
+	<key>IBDocumentLocation</key>
+	<string>63 221 356 240 0 0 1600 1178 </string>
+	<key>IBFramework Version</key>
+	<string>263.2</string>
+	<key>IBSystem Version</key>
+	<string>5S41</string>
+</dict>
+</plist>
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Resources/English.lproj/GLUTClipboard.nib/objects.nib has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Resources/English.lproj/GLUTPreferences.nib/classes.nib	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,73 @@
+{
+    IBClasses = (
+        {
+            ACTIONS = {save = id; saveAs = id; }; 
+            CLASS = FirstResponder; 
+            LANGUAGE = ObjC; 
+            SUPERCLASS = NSObject; 
+        }, 
+        {
+            ACTIONS = {
+                cancel = id; 
+                joyAssign = id; 
+                joyDevice = id; 
+                joyElement = id; 
+                joyInvert = id; 
+                launchDebugMode = id; 
+                launchGamemodeCaptureSingle = id; 
+                launchIconic = id; 
+                launchUseCurrWD = id; 
+                launchUseExtDesktop = id; 
+                launchUseMacOSCoords = id; 
+                mouseEanbleEmulation = id; 
+                mouseMiddleMenu = id; 
+                mouseRightMenu = id; 
+                ok = id; 
+                spaceAssign = id; 
+                spaceDevice = id; 
+                spaceElement = id; 
+                spaceInvert = id; 
+            }; 
+            CLASS = GLUTPreferencesController; 
+            LANGUAGE = ObjC; 
+            OUTLETS = {
+                joyAssign = NSButton; 
+                joyAssignNote = NSTextField; 
+                joyAssignWarningIcon = NSImageView; 
+                joyDeviceMenu = NSPopUpButton; 
+                joyElement = NSTextField; 
+                joyInputMenu = NSPopUpButton; 
+                joyInverted = NSButton; 
+                launchDebugMode = NSButton; 
+                launchFadeTime = NSTextField; 
+                launchGamemodeCaptureSingle = NSButton; 
+                launchIconic = NSButton; 
+                launchInitHeight = NSTextField; 
+                launchInitWidth = NSTextField; 
+                launchInitX = NSTextField; 
+                launchInitY = NSTextField; 
+                launchMenuIdle = NSTextField; 
+                launchSyncToVBL = NSButton; 
+                launchUseCurrWD = NSButton; 
+                launchUseExtendedDesktop = NSButton; 
+                launchUseMacOSXCoords = NSButton; 
+                mouseAssignWarningIcon = NSImageView; 
+                mouseAssignWarningText = NSTextField; 
+                mouseDetected = NSTextField; 
+                mouseEmulation = NSButton; 
+                mouseMiddleConfigMenu = NSPopUpButton; 
+                mouseRightConfigMenu = NSPopUpButton; 
+                prefsTabView = NSTabView; 
+                spaceAssign = NSButton; 
+                spaceAssignNote = NSTextField; 
+                spaceAssignWarningIcon = NSImageView; 
+                spaceDeviceMenu = NSPopUpButton; 
+                spaceElement = NSTextField; 
+                spaceInputMenu = NSPopUpButton; 
+                spaceInverted = NSButton; 
+            }; 
+            SUPERCLASS = NSWindowController; 
+        }
+    ); 
+    IBVersion = 1; 
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Resources/English.lproj/GLUTPreferences.nib/info.nib	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>IBDocumentLocation</key>
+	<string>16 329 410 240 0 0 1920 1178 </string>
+	<key>IBFramework Version</key>
+	<string>439.0</string>
+	<key>IBOpenObjects</key>
+	<array>
+		<integer>205</integer>
+	</array>
+	<key>IBSystem Version</key>
+	<string>8G32</string>
+</dict>
+</plist>
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Resources/English.lproj/GLUTPreferences.nib/objects.nib has changed
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Resources/English.lproj/GLUTUI.strings has changed
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Resources/English.lproj/InfoPlist.strings has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Resources/Info.plist	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>CFBundleDevelopmentRegion</key>
+	<string>English</string>
+	<key>CFBundleExecutable</key>
+	<string>GLUT</string>
+	<key>CFBundleGetInfoString</key>
+	<string>3.4.0, Copyright (c) 2001-2008 Apple Inc., All Rights Reserved</string>
+	<key>CFBundleIdentifier</key>
+	<string>com.apple.glut</string>
+	<key>CFBundleInfoDictionaryVersion</key>
+	<string>6.0</string>
+	<key>CFBundlePackageType</key>
+	<string>FMWK</string>
+	<key>CFBundleShortVersionString</key>
+	<string>3.4.0</string>
+	<key>CFBundleSignature</key>
+	<string>????</string>
+	<key>CFBundleVersion</key>
+	<string>GLUT-3.4.0</string>
+</dict>
+</plist>
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Resources/blankCursor.tiff has changed
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Resources/bottomCursor.tiff has changed
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Resources/bottomleftCursor.tiff has changed
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Resources/bottomrightCursor.tiff has changed
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Resources/crossCursor.tiff has changed
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Resources/cycleCursor.tiff has changed
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Resources/destroyCursor.tiff has changed
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Resources/fingerCursor.tiff has changed
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Resources/helpCursor.tiff has changed
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Resources/leftCursor.tiff has changed
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Resources/leftRightCursor.tiff has changed
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Resources/rightArrowCursor.tiff has changed
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Resources/rightCursor.tiff has changed
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Resources/sprayCursor.tiff has changed
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Resources/topCursor.tiff has changed
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Resources/topleftCursor.tiff has changed
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Resources/toprightCursor.tiff has changed
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Resources/upDownCursor.tiff has changed
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Resources/waitCursor.tiff has changed
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/GLUT has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Headers/copy.h	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,18 @@
+
+/*
+ *
+ * Written By Linas Vepstas November 1991 
+ */
+
+
+#define COPY_THREE_WORDS(A,B) {						\
+	struct three_words { int a, b, c, };				\
+	*(struct three_words *) (A) = *(struct three_words *) (B);	\
+}
+
+#define COPY_FOUR_WORDS(A,B) {						\
+	struct four_words { int a, b, c, d, };				\
+	*(struct four_words *) (A) = *(struct four_words *) (B);	\
+}
+
+/* ============================================================= */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Headers/extrude.h	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,96 @@
+
+/*
+ * extrude.h
+ *
+ * FUNCTION:
+ * prototypes for privately used subroutines for the tubing library
+ *
+ * HISTORY:
+ * Linas Vepstas 1991
+ */
+ 
+#include "port.h" /* for gleDouble */
+
+#ifndef M_PI
+#define M_PI  3.14159265358979323846
+#endif
+
+/* ============================================================ */
+/* 
+ * Provides choice of calling subroutine, vs. invoking macro.
+ * Basically, inlines the source, or not.
+ * Trades performance for executable size.
+ */
+
+#define INLINE_INTERSECT
+#ifdef INLINE_INTERSECT
+#define INNERSECT(sect,p,n,v1,v2) { INTERSECT(sect,p,n,v1,v2); }
+#else
+#define INNERSECT(sect,p,n,v1,v2) intersect(sect,p,n,v1,v2)
+#endif /* INLINE_INTERSECT */
+
+/* ============================================================ */
+/* The folowing defines give a kludgy way of accessing the qmesh primitive */
+
+/*
+#define bgntmesh _emu_qmesh_bgnqmesh
+#define endtmesh _emu_qmesh_endqmesh
+#define c3f _emu_qmesh_c3f
+#define n3f _emu_qmesh_n3f
+#define v3f _emu_qmesh_v3f
+*/
+
+/* ============================================================ */
+
+extern void up_sanity_check (gleDouble up[3],      /* up vector for contour */
+                      int npoints,              /* numpoints in poly-line */
+                      gleDouble point_array[][3]);   /* polyline */
+
+
+extern void draw_raw_style_end_cap (int ncp,     /* number of contour points */
+                             gleDouble contour[][2],     /* 2D contour */
+                             gleDouble zval,             /* where to draw cap */
+                             int frontwards);    /* front or back cap */
+
+extern void draw_round_style_cap_callback (int iloop,
+                                  double cap[][3],
+                                  float face_color[3],
+                                  gleDouble cut_vector[3],
+                                  gleDouble bisect_vector[3],
+                                  double norms[][3],
+                                  int frontwards);
+
+extern void draw_angle_style_front_cap (int ncp,
+                           gleDouble bi[3],
+                           gleDouble point_array[][3]);
+
+extern void extrusion_raw_join (int ncp,        /* number of contour points */
+                         gleDouble contour[][2],    /* 2D contour */
+                         gleDouble cont_normal[][2],/* 2D contour normal vecs */
+                         gleDouble up[3],           /* up vector for contour */
+                         int npoints,           /* numpoints in poly-line */
+                         gleDouble point_array[][3],        /* polyline */
+                         float color_array[][3],        /* color of polyline */
+                         gleDouble xform_array[][2][3]);  /* 2D contour xforms */
+
+
+extern void extrusion_round_or_cut_join (int ncp, /* number of contour points */
+                         gleDouble contour[][2],    /* 2D contour */
+                         gleDouble cont_normal[][2],/* 2D contour normal vecs */
+                           gleDouble up[3],         /* up vector for contour */
+                           int npoints,         /* numpoints in poly-line */
+                           gleDouble point_array[][3],      /* polyline */
+                           float color_array[][3],      /* color of polyline */
+                           gleDouble xform_array[][2][3]);  /* 2D contour xforms */
+
+
+extern void extrusion_angle_join (int ncp,      /* number of contour points */
+                         gleDouble contour[][2],    /* 2D contour */
+                         gleDouble cont_normal[][2],/* 2D contour normal vecs */
+                           gleDouble up[3],         /* up vector for contour */
+                           int npoints,         /* numpoints in poly-line */
+                           gleDouble point_array[][3],      /* polyline */
+                           float color_array[][3],      /* color of polyline */
+                           gleDouble xform_array[][2][3]);  /* 2D contour xforms */
+
+/* -------------------------- end of file -------------------------------- */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Headers/glsmap.h	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,137 @@
+#ifndef __glsmap_h__
+#define __glsmap_h__
+
+/* Copyright (c) Mark J. Kilgard, 1998.  */
+
+/* This program is freely distributable without licensing fees
+   and is provided without guarantee or warrantee expressed or
+   implied. This program is -not- in the public domain. */
+
+#if defined(_WIN32)
+
+/* Try hard to avoid including <windows.h> to avoid name space pollution,
+   but Win32's <GL/gl.h> needs APIENTRY and WINGDIAPI defined properly. */
+# if 0
+#  define  WIN32_LEAN_AND_MEAN
+#  include <windows.h>
+# else
+   /* XXX This is from Win32's <windef.h> */
+#  ifndef APIENTRY
+#   if (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED)
+#    define APIENTRY    __stdcall
+#   else
+#    define APIENTRY
+#   endif
+#  endif
+#  ifndef CALLBACK
+    /* XXX This is from Win32's <winnt.h> */
+#   if (defined(_M_MRX000) || defined(_M_IX86) || defined(_M_ALPHA) || defined(_M_PPC)) && !defined(MIDL_PASS)
+#    define CALLBACK __stdcall
+#   else
+#    define CALLBACK
+#   endif
+#  endif
+   /* XXX This is from Win32's <wingdi.h> and <winnt.h> */
+#  ifndef WINGDIAPI
+#   define WINGDIAPI __declspec(dllimport)
+#  endif
+   /* XXX This is from Win32's <ctype.h> */
+#  ifndef _WCHAR_T_DEFINED
+typedef unsigned short wchar_t;
+#   define _WCHAR_T_DEFINED
+#  endif
+# endif
+
+#pragma warning (disable:4244)	/* Disable bogus conversion warnings. */
+#pragma warning (disable:4305)  /* VC++ 5.0 version of above warning. */
+
+#endif /* _WIN32 */
+
+#include <OpenGL/gl.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef enum {
+        SMAP_CLEAR_SMAP_TEXTURE = 0x1,
+        SMAP_GENERATE_VIEW_MIPMAPS = 0x2,
+        SMAP_GENERATE_SMAP_MIPMAPS = 0x4,
+        SMAP_GENERATE_MIPMAPS = 0x6  /* both of above */
+} SphereMapFlags;
+
+/* Cube view enumerants. */
+enum {
+	SMAP_FRONT = 0,
+	SMAP_TOP = 1,
+	SMAP_BOTTOM = 2,
+	SMAP_LEFT = 3,
+	SMAP_RIGHT = 4,
+	SMAP_BACK = 5
+};
+
+typedef struct _SphereMap SphereMap;
+
+extern SphereMap *smapCreateSphereMap(SphereMap *shareSmap);
+extern void smapDestroySphereMap(SphereMap *smap);
+
+extern void smapConfigureSphereMapMesh(SphereMap *smap, int steps, int rings, int edgeExtend);
+
+extern void smapSetSphereMapTexObj(SphereMap *smap, GLuint texobj);
+extern void smapSetViewTexObj(SphereMap *smap, GLuint texobj);
+extern void smapSetViewTexObjs(SphereMap *smap, GLuint texobjs[6]);
+extern void smapGetSphereMapTexObj(SphereMap *smap, GLuint *texobj);
+extern void smapGetViewTexObj(SphereMap *smap, GLuint *texobj);
+extern void smapGetViewTexObjs(SphereMap *smap, GLuint texobjs[6]);
+
+extern void smapSetFlags(SphereMap *smap, SphereMapFlags flags);
+extern void smapGetFlags(SphereMap *smap, SphereMapFlags *flags);
+
+extern void smapSetViewOrigin(SphereMap *smap, GLint x, GLint y);
+extern void smapSetSphereMapOrigin(SphereMap *smap, GLint x, GLint y);
+extern void smapGetViewOrigin(SphereMap *smap, GLint *x, GLint *y);
+extern void smapGetSphereMapOrigin(SphereMap *smap, GLint *x, GLint *y);
+
+extern void smapSetEye(SphereMap *smap, GLfloat eyex, GLfloat eyey,	GLfloat eyez);
+extern void smapSetEyeVector(SphereMap *smap, GLfloat *eye);
+extern void smapSetUp(SphereMap *smap, GLfloat upx, GLfloat upy, GLfloat upz);
+extern void smapSetUpVector(SphereMap *smap, GLfloat *up);
+extern void smapSetObject(SphereMap *smap, GLfloat objx, GLfloat objy, GLfloat objz);
+extern void smapSetObjectVector(SphereMap *smap, GLfloat *obj);
+extern void smapGetEye(SphereMap *smap, GLfloat *eyex, GLfloat *eyey, GLfloat *eyez);
+extern void smapGetEyeVector(SphereMap *smap, GLfloat *eye);
+extern void smapGetUp(SphereMap *smap, GLfloat *upx, GLfloat *upy, GLfloat *upz);
+extern void smapGetUpVector(SphereMap *smap, GLfloat *up);
+extern void smapGetObject(SphereMap *smap, GLfloat *objx, GLfloat *objy, GLfloat *objz);
+extern void smapGetObjectVector(SphereMap *smap, GLfloat *obj);
+
+extern void smapSetNearFar(SphereMap *smap, GLfloat viewNear, GLfloat viewFar);
+extern void smapGetNearFar(SphereMap *smap, GLfloat *viewNear, GLfloat *viewFar);
+
+extern void smapSetSphereMapTexDim(SphereMap *smap, GLsizei texdim);
+extern void smapSetViewTexDim(SphereMap *smap, GLsizei texdim);
+extern void smapGetSphereMapTexDim(SphereMap *smap, GLsizei *texdim);
+extern void smapGetViewTexDim(SphereMap *smap, GLsizei *texdim);
+
+extern void smapSetContextData(SphereMap *smap, void *context);
+extern void smapGetContextData(SphereMap *smap, void **context);
+
+extern void smapSetPositionLightsFunc(SphereMap *smap, void (*positionLights)(int view, void *context));
+extern void smapSetDrawViewFunc(SphereMap *smap, void (*drawView)(int view, void *context));
+extern void smapGetPositionLightsFunc(SphereMap *smap, void (**positionLights)(int view, void *context));
+extern void smapGetDrawViewFunc(SphereMap *smap, void (**drawView)(int view, void *context));
+
+extern void smapGenViewTex(SphereMap *smap, int view);
+extern void smapGenViewTexs(SphereMap *smap);
+extern void smapGenSphereMapFromViewTexs(SphereMap *smap);
+extern void smapGenSphereMap(SphereMap *smap);
+extern void smapGenSphereMapWithOneViewTex(SphereMap *smap);
+
+extern int smapRvecToSt(float rvec[3], float st[2]);
+extern void smapStToRvec(float *st, float *rvec);
+
+#ifdef __cplusplus
+}
+
+#endif
+#endif /* __glsmap_h__ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Headers/glsmapint.h	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,102 @@
+#ifndef __glsmapint_h__
+#define __glsmapint_h__
+
+/* Copyright (c) Mark J. Kilgard, 1998. */
+
+/* This program is freely distributable without licensing fees 
+   and is provided without guarantee or warrantee expressed or 
+   implied. This program is -not- in the public domain. */
+
+#include "glsmap.h"
+
+enum { X = 0, Y = 1, Z = 2 };
+
+#define INITFACE(mesh) \
+	int steps = mesh->steps; \
+	int sqsteps = mesh->steps * mesh->steps
+
+#define FACE(side,y,x) \
+	mesh->face[(side)*sqsteps + (y)*steps + (x)]
+
+#define FACExy(side,i,j) \
+	(&FACE(side,i,j).x)
+
+#define FACEst(side,i,j) \
+	(&FACE(side,i,j).s)
+
+#define INITBACK(mesh) \
+	int allrings = mesh->rings + mesh->edgeExtend; \
+	int ringedspokes = allrings * mesh->steps
+
+#define BACK(edge,ring,spoke) \
+	mesh->back[(edge)*ringedspokes + (ring)*mesh->steps + (spoke)]
+
+#define BACKxy(edge,ring,spoke) \
+	(&BACK(edge,ring,spoke).x)
+
+#define BACKst(edge,ring,spoke) \
+	(&BACK(edge,ring,spoke).s)
+
+typedef struct _STXY {
+	GLfloat s, t;
+	GLfloat x, y;
+} STXY;
+
+typedef struct _SphereMapMesh {
+
+	int refcnt;
+
+	int steps;
+	int rings;
+	int edgeExtend;
+
+	STXY *face;
+	STXY *back;
+
+} SphereMapMesh;
+
+struct _SphereMap {
+
+	/* Shared sphere map mesh vertex data. */
+	SphereMapMesh *mesh;
+
+	/* Texture object ids. */
+	GLuint smapTexObj;
+	GLuint viewTexObjs[6];
+	GLuint viewTexObj;
+
+        /* Flags */
+        SphereMapFlags flags;
+
+	/* Texture dimensions must be a power of two. */
+	int viewTexDim;  /* view texture dimension */
+	int smapTexDim;  /* sphere map texture dimension */
+
+	/* Viewport origins for view and sphere map rendering. */
+	int viewOrigin[2];
+	int smapOrigin[2];
+
+	/* Viewing vectors. */
+	GLfloat eye[3];
+	GLfloat up[3];
+	GLfloat obj[3];
+
+	/* Projection parameters. */
+	GLfloat viewNear;
+	GLfloat viewFar;
+
+	/* Rendering callbacks. */
+	void (*positionLights)(int view, void *context);
+	void (*drawView)(int view, void *context);
+
+	/* Application specified callback data. */
+	void *context;
+
+};
+
+/* Library internal routines. */
+extern void __smapDrawSphereMapMeshSide(SphereMapMesh *mesh, int side);
+extern void __smapDrawSphereMapMeshBack(SphereMapMesh *mesh);
+extern void __smapValidateSphereMapMesh(SphereMapMesh *mesh);
+
+#endif /* __glsmapint_h__ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Headers/glut.h	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,644 @@
+#ifndef __glut_h__
+#define __glut_h__
+
+/* Copyright (c) Mark J. Kilgard, 1994, 1995, 1996, 1998. */
+
+/* This program is freely distributable without licensing fees  and is
+   provided without guarantee or warrantee expressed or  implied. This
+   program is -not- in the public domain. */
+
+#if defined(_WIN32)
+
+/* GLUT 3.7 now tries to avoid including <windows.h>
+   to avoid name space pollution, but Win32's <GL/gl.h> 
+   needs APIENTRY and WINGDIAPI defined properly. */
+# if 0
+#  define  WIN32_LEAN_AND_MEAN
+#  include <windows.h>
+# else
+   /* XXX This is from Win32's <windef.h> */
+#  ifndef APIENTRY
+#   define GLUT_APIENTRY_DEFINED
+#   if (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED)
+#    define APIENTRY    __stdcall
+#   else
+#    define APIENTRY
+#   endif
+#  endif
+   /* XXX This is from Win32's <winnt.h> */
+#  ifndef CALLBACK
+#   if (defined(_M_MRX000) || defined(_M_IX86) || defined(_M_ALPHA) || defined(_M_PPC)) && !defined(MIDL_PASS)
+#    define CALLBACK __stdcall
+#   else
+#    define CALLBACK
+#   endif
+#  endif
+   /* XXX This is from Win32's <wingdi.h> and <winnt.h> */
+#  ifndef WINGDIAPI
+#   define GLUT_WINGDIAPI_DEFINED
+#   define WINGDIAPI __declspec(dllimport)
+#  endif
+   /* XXX This is from Win32's <ctype.h> */
+#  ifndef _WCHAR_T_DEFINED
+typedef unsigned short wchar_t;
+#   define _WCHAR_T_DEFINED
+#  endif
+# endif
+
+#pragma comment (lib, "winmm.lib")     /* link with Windows MultiMedia lib */
+#pragma comment (lib, "opengl32.lib")  /* link with Microsoft OpenGL lib */
+#pragma comment (lib, "glu32.lib")     /* link with OpenGL Utility lib */
+#pragma comment (lib, "glut32.lib")    /* link with Win32 GLUT lib */
+
+#pragma warning (disable:4244)	/* Disable bogus conversion warnings. */
+#pragma warning (disable:4305)  /* VC++ 5.0 version of above warning. */
+
+#endif
+
+#if defined(__APPLE__) || defined(MACOSX)
+#include <AvailabilityMacros.h>
+#include <OpenGL/gl.h>
+#include <OpenGL/glu.h>
+#else
+#include <GL/gl.h>
+#include <GL/glu.h>
+#endif
+
+/* define APIENTRY and CALLBACK to null string if we aren't on Win32 */
+#if !defined(_WIN32)
+#define APIENTRY
+#define GLUT_APIENTRY_DEFINED
+#define CALLBACK
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ GLUT API revision history:
+ 
+ GLUT_API_VERSION is updated to reflect incompatible GLUT
+ API changes (interface changes, semantic changes, deletions,
+ or additions).
+ 
+ GLUT_API_VERSION=1  First public release of GLUT.  11/29/94
+
+ GLUT_API_VERSION=2  Added support for OpenGL/GLX multisampling,
+ extension.  Supports new input devices like tablet, dial and button
+ box, and Spaceball.  Easy to query OpenGL extensions.
+
+ GLUT_API_VERSION=3  glutMenuStatus added.
+
+ GLUT_API_VERSION=4  glutInitDisplayString, glutWarpPointer,
+ glutBitmapLength, glutStrokeLength, glutWindowStatusFunc, dynamic
+ video resize subAPI, glutPostWindowRedisplay, glutKeyboardUpFunc,
+ glutSpecialUpFunc, glutIgnoreKeyRepeat, glutSetKeyRepeat,
+ glutJoystickFunc, glutForceJoystickFunc (NOT FINALIZED!).
+
+ GLUT_API_VERSION=5  glutGetProcAddress (added by BrianP)
+**/
+#ifndef GLUT_API_VERSION  /* allow this to be overriden */
+#define GLUT_API_VERSION		5
+#endif
+
+/**
+ GLUT implementation revision history:
+ 
+ GLUT_XLIB_IMPLEMENTATION is updated to reflect both GLUT
+ API revisions and implementation revisions (ie, bug fixes).
+
+ GLUT_XLIB_IMPLEMENTATION=1  mjk's first public release of
+ GLUT Xlib-based implementation.  11/29/94
+
+ GLUT_XLIB_IMPLEMENTATION=2  mjk's second public release of
+ GLUT Xlib-based implementation providing GLUT version 2 
+ interfaces.
+
+ GLUT_XLIB_IMPLEMENTATION=3  mjk's GLUT 2.2 images. 4/17/95
+
+ GLUT_XLIB_IMPLEMENTATION=4  mjk's GLUT 2.3 images. 6/?/95
+
+ GLUT_XLIB_IMPLEMENTATION=5  mjk's GLUT 3.0 images. 10/?/95
+
+ GLUT_XLIB_IMPLEMENTATION=7  mjk's GLUT 3.1+ with glutWarpPoitner.  7/24/96
+
+ GLUT_XLIB_IMPLEMENTATION=8  mjk's GLUT 3.1+ with glutWarpPoitner
+ and video resize.  1/3/97
+
+ GLUT_XLIB_IMPLEMENTATION=9 mjk's GLUT 3.4 release with early GLUT 4 routines.
+
+ GLUT_XLIB_IMPLEMENTATION=11 Mesa 2.5's GLUT 3.6 release.
+
+ GLUT_XLIB_IMPLEMENTATION=12 mjk's GLUT 3.6 release with early GLUT 4 routines + signal handling.
+
+ GLUT_XLIB_IMPLEMENTATION=13 mjk's GLUT 3.7 beta with GameGLUT support.
+
+ GLUT_XLIB_IMPLEMENTATION=14 mjk's GLUT 3.7 beta with f90gl friend interface.
+
+ GLUT_XLIB_IMPLEMENTATION=15 mjk's GLUT 3.7 beta sync'ed with Mesa <GL/glut.h>
+**/
+#ifndef GLUT_XLIB_IMPLEMENTATION  /* Allow this to be overriden. */
+#define GLUT_XLIB_IMPLEMENTATION	15
+#endif
+
+/**
+ MacOS X GLUT implementation revision history:
+ 
+ GLUT_MACOSX_IMPLEMENTATION is updated to reflect MacOS X
+ specific GLUT API revisions and implementation revisions
+ (ie, bug fixes).
+
+ GLUT_MACOSX_IMPLEMENTATION=1  glutSurfaceTexture.
+
+ GLUT_MACOSX_IMPLEMENTATION=2  glutWMCloseFunc, glutCheckLoop.
+  
+**/
+#ifndef GLUT_MACOSX_IMPLEMENTATION  /* Allow this to be overriden. */
+#define GLUT_MACOSX_IMPLEMENTATION	2
+#endif
+
+/* Display mode bit masks. */
+#define GLUT_RGB			0
+#define GLUT_RGBA			GLUT_RGB
+#define GLUT_INDEX			1
+#define GLUT_SINGLE			0
+#define GLUT_DOUBLE			2
+#define GLUT_ACCUM			4
+#define GLUT_ALPHA			8
+#define GLUT_DEPTH			16
+#define GLUT_STENCIL			32
+#if (GLUT_API_VERSION >= 2)
+#define GLUT_MULTISAMPLE		128
+#define GLUT_STEREO			256
+#endif
+#if (GLUT_API_VERSION >= 3)
+#define GLUT_LUMINANCE			512
+#endif
+#define GLUT_NO_RECOVERY    1024
+
+/* Mouse buttons. */
+#define GLUT_LEFT_BUTTON		0
+#define GLUT_MIDDLE_BUTTON		1
+#define GLUT_RIGHT_BUTTON		2
+
+/* Mouse button  state. */
+#define GLUT_DOWN			0
+#define GLUT_UP				1
+
+#if (GLUT_API_VERSION >= 2)
+/* function keys */
+#define GLUT_KEY_F1			1
+#define GLUT_KEY_F2			2
+#define GLUT_KEY_F3			3
+#define GLUT_KEY_F4			4
+#define GLUT_KEY_F5			5
+#define GLUT_KEY_F6			6
+#define GLUT_KEY_F7			7
+#define GLUT_KEY_F8			8
+#define GLUT_KEY_F9			9
+#define GLUT_KEY_F10			10
+#define GLUT_KEY_F11			11
+#define GLUT_KEY_F12			12
+/* directional keys */
+#define GLUT_KEY_LEFT			100
+#define GLUT_KEY_UP			101
+#define GLUT_KEY_RIGHT			102
+#define GLUT_KEY_DOWN			103
+#define GLUT_KEY_PAGE_UP		104
+#define GLUT_KEY_PAGE_DOWN		105
+#define GLUT_KEY_HOME			106
+#define GLUT_KEY_END			107
+#define GLUT_KEY_INSERT			108
+#endif
+
+/* Entry/exit  state. */
+#define GLUT_LEFT			0
+#define GLUT_ENTERED			1
+
+/* Menu usage  state. */
+#define GLUT_MENU_NOT_IN_USE		0
+#define GLUT_MENU_IN_USE		1
+
+/* Visibility  state. */
+#define GLUT_NOT_VISIBLE		0
+#define GLUT_VISIBLE			1
+
+/* Window status  state. */
+#define GLUT_HIDDEN			0
+#define GLUT_FULLY_RETAINED		1
+#define GLUT_PARTIALLY_RETAINED		2
+#define GLUT_FULLY_COVERED		3
+
+/* Color index component selection values. */
+#define GLUT_RED			0
+#define GLUT_GREEN			1
+#define GLUT_BLUE			2
+
+/* Layers for use. */
+#define GLUT_NORMAL			0
+#define GLUT_OVERLAY			1
+
+#if defined(_WIN32)
+/* Stroke font constants (use these in GLUT program). */
+#define GLUT_STROKE_ROMAN		((void*)0)
+#define GLUT_STROKE_MONO_ROMAN		((void*)1)
+
+/* Bitmap font constants (use these in GLUT program). */
+#define GLUT_BITMAP_9_BY_15		((void*)2)
+#define GLUT_BITMAP_8_BY_13		((void*)3)
+#define GLUT_BITMAP_TIMES_ROMAN_10	((void*)4)
+#define GLUT_BITMAP_TIMES_ROMAN_24	((void*)5)
+#if (GLUT_API_VERSION >= 3)
+#define GLUT_BITMAP_HELVETICA_10	((void*)6)
+#define GLUT_BITMAP_HELVETICA_12	((void*)7)
+#define GLUT_BITMAP_HELVETICA_18	((void*)8)
+#endif
+#else
+/* Stroke font opaque addresses (use constants instead in source code). */
+extern void *glutStrokeRoman;
+extern void *glutStrokeMonoRoman;
+
+/* Stroke font constants (use these in GLUT program). */
+#define GLUT_STROKE_ROMAN		(&glutStrokeRoman)
+#define GLUT_STROKE_MONO_ROMAN		(&glutStrokeMonoRoman)
+
+/* Bitmap font opaque addresses (use constants instead in source code). */
+extern void *glutBitmap9By15;
+extern void *glutBitmap8By13;
+extern void *glutBitmapTimesRoman10;
+extern void *glutBitmapTimesRoman24;
+extern void *glutBitmapHelvetica10;
+extern void *glutBitmapHelvetica12;
+extern void *glutBitmapHelvetica18;
+
+/* Bitmap font constants (use these in GLUT program). */
+#define GLUT_BITMAP_9_BY_15		(&glutBitmap9By15)
+#define GLUT_BITMAP_8_BY_13		(&glutBitmap8By13)
+#define GLUT_BITMAP_TIMES_ROMAN_10	(&glutBitmapTimesRoman10)
+#define GLUT_BITMAP_TIMES_ROMAN_24	(&glutBitmapTimesRoman24)
+#if (GLUT_API_VERSION >= 3)
+#define GLUT_BITMAP_HELVETICA_10	(&glutBitmapHelvetica10)
+#define GLUT_BITMAP_HELVETICA_12	(&glutBitmapHelvetica12)
+#define GLUT_BITMAP_HELVETICA_18	(&glutBitmapHelvetica18)
+#endif
+#endif
+
+/* glutGet parameters. */
+#define GLUT_WINDOW_X			100
+#define GLUT_WINDOW_Y			101
+#define GLUT_WINDOW_WIDTH		102
+#define GLUT_WINDOW_HEIGHT		103
+#define GLUT_WINDOW_BUFFER_SIZE		104
+#define GLUT_WINDOW_STENCIL_SIZE	105
+#define GLUT_WINDOW_DEPTH_SIZE		106
+#define GLUT_WINDOW_RED_SIZE		107
+#define GLUT_WINDOW_GREEN_SIZE		108
+#define GLUT_WINDOW_BLUE_SIZE		109
+#define GLUT_WINDOW_ALPHA_SIZE		110
+#define GLUT_WINDOW_ACCUM_RED_SIZE	111
+#define GLUT_WINDOW_ACCUM_GREEN_SIZE	112
+#define GLUT_WINDOW_ACCUM_BLUE_SIZE	113
+#define GLUT_WINDOW_ACCUM_ALPHA_SIZE	114
+#define GLUT_WINDOW_DOUBLEBUFFER	115
+#define GLUT_WINDOW_RGBA		116
+#define GLUT_WINDOW_PARENT		117
+#define GLUT_WINDOW_NUM_CHILDREN	118
+#define GLUT_WINDOW_COLORMAP_SIZE	119
+#if (GLUT_API_VERSION >= 2)
+#define GLUT_WINDOW_NUM_SAMPLES		120
+#define GLUT_WINDOW_STEREO		121
+#endif
+#if (GLUT_API_VERSION >= 3)
+#define GLUT_WINDOW_CURSOR		122
+#endif
+#define GLUT_SCREEN_WIDTH		200
+#define GLUT_SCREEN_HEIGHT		201
+#define GLUT_SCREEN_WIDTH_MM		202
+#define GLUT_SCREEN_HEIGHT_MM		203
+#define GLUT_MENU_NUM_ITEMS		300
+#define GLUT_DISPLAY_MODE_POSSIBLE	400
+#define GLUT_INIT_WINDOW_X		500
+#define GLUT_INIT_WINDOW_Y		501
+#define GLUT_INIT_WINDOW_WIDTH		502
+#define GLUT_INIT_WINDOW_HEIGHT		503
+#define GLUT_INIT_DISPLAY_MODE		504
+#if (GLUT_API_VERSION >= 2)
+#define GLUT_ELAPSED_TIME		700
+#endif
+#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 13)
+#define GLUT_WINDOW_FORMAT_ID		123
+#endif
+
+#if (GLUT_API_VERSION >= 2)
+/* glutDeviceGet parameters. */
+#define GLUT_HAS_KEYBOARD		600
+#define GLUT_HAS_MOUSE			601
+#define GLUT_HAS_SPACEBALL		602
+#define GLUT_HAS_DIAL_AND_BUTTON_BOX	603
+#define GLUT_HAS_TABLET			604
+#define GLUT_NUM_MOUSE_BUTTONS		605
+#define GLUT_NUM_SPACEBALL_BUTTONS	606
+#define GLUT_NUM_BUTTON_BOX_BUTTONS	607
+#define GLUT_NUM_DIALS			608
+#define GLUT_NUM_TABLET_BUTTONS		609
+#endif
+#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 13)
+#define GLUT_DEVICE_IGNORE_KEY_REPEAT   610
+#define GLUT_DEVICE_KEY_REPEAT          611
+#define GLUT_HAS_JOYSTICK		612
+#define GLUT_OWNS_JOYSTICK		613
+#define GLUT_JOYSTICK_BUTTONS		614
+#define GLUT_JOYSTICK_AXES		615
+#define GLUT_JOYSTICK_POLL_RATE		616
+#endif
+
+#if (GLUT_API_VERSION >= 3)
+/* glutLayerGet parameters. */
+#define GLUT_OVERLAY_POSSIBLE           800
+#define GLUT_LAYER_IN_USE		801
+#define GLUT_HAS_OVERLAY		802
+#define GLUT_TRANSPARENT_INDEX		803
+#define GLUT_NORMAL_DAMAGED		804
+#define GLUT_OVERLAY_DAMAGED		805
+
+#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9)
+/* glutVideoResizeGet parameters. */
+#define GLUT_VIDEO_RESIZE_POSSIBLE	900
+#define GLUT_VIDEO_RESIZE_IN_USE	901
+#define GLUT_VIDEO_RESIZE_X_DELTA	902
+#define GLUT_VIDEO_RESIZE_Y_DELTA	903
+#define GLUT_VIDEO_RESIZE_WIDTH_DELTA	904
+#define GLUT_VIDEO_RESIZE_HEIGHT_DELTA	905
+#define GLUT_VIDEO_RESIZE_X		906
+#define GLUT_VIDEO_RESIZE_Y		907
+#define GLUT_VIDEO_RESIZE_WIDTH		908
+#define GLUT_VIDEO_RESIZE_HEIGHT	909
+#endif
+
+/* glutUseLayer parameters. */
+#define GLUT_NORMAL			0
+#define GLUT_OVERLAY			1
+
+/* glutGetModifiers return mask. */
+#define GLUT_ACTIVE_SHIFT               1
+#define GLUT_ACTIVE_CTRL                2
+#define GLUT_ACTIVE_ALT                 4
+
+/* glutSetCursor parameters. */
+/* Basic arrows. */
+#define GLUT_CURSOR_RIGHT_ARROW		0
+#define GLUT_CURSOR_LEFT_ARROW		1
+/* Symbolic cursor shapes. */
+#define GLUT_CURSOR_INFO		2
+#define GLUT_CURSOR_DESTROY		3
+#define GLUT_CURSOR_HELP		4
+#define GLUT_CURSOR_CYCLE		5
+#define GLUT_CURSOR_SPRAY		6
+#define GLUT_CURSOR_WAIT		7
+#define GLUT_CURSOR_TEXT		8
+#define GLUT_CURSOR_CROSSHAIR		9
+/* Directional cursors. */
+#define GLUT_CURSOR_UP_DOWN		10
+#define GLUT_CURSOR_LEFT_RIGHT		11
+/* Sizing cursors. */
+#define GLUT_CURSOR_TOP_SIDE		12
+#define GLUT_CURSOR_BOTTOM_SIDE		13
+#define GLUT_CURSOR_LEFT_SIDE		14
+#define GLUT_CURSOR_RIGHT_SIDE		15
+#define GLUT_CURSOR_TOP_LEFT_CORNER	16
+#define GLUT_CURSOR_TOP_RIGHT_CORNER	17
+#define GLUT_CURSOR_BOTTOM_RIGHT_CORNER	18
+#define GLUT_CURSOR_BOTTOM_LEFT_CORNER	19
+/* Inherit from parent window. */
+#define GLUT_CURSOR_INHERIT		100
+/* Blank cursor. */
+#define GLUT_CURSOR_NONE		101
+/* Fullscreen crosshair (if available). */
+#define GLUT_CURSOR_FULL_CROSSHAIR	102
+#endif
+
+/* GLUT initialization sub-API. */
+extern void APIENTRY glutInit(int *argcp, char **argv);
+extern void APIENTRY glutInitDisplayMode(unsigned int mode);
+#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9)
+extern void APIENTRY glutInitDisplayString(const char *string);
+#endif
+extern void APIENTRY glutInitWindowPosition(int x, int y);
+extern void APIENTRY glutInitWindowSize(int width, int height);
+extern void APIENTRY glutMainLoop(void);
+
+/* GLUT window sub-API. */
+extern int APIENTRY glutCreateWindow(const char *title);
+extern int APIENTRY glutCreateSubWindow(int win, int x, int y, int width, int height);
+extern void APIENTRY glutDestroyWindow(int win);
+extern void APIENTRY glutPostRedisplay(void);
+#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 11)
+extern void APIENTRY glutPostWindowRedisplay(int win);
+#endif
+extern void APIENTRY glutSwapBuffers(void);
+extern int APIENTRY glutGetWindow(void);
+extern void APIENTRY glutSetWindow(int win);
+extern void APIENTRY glutSetWindowTitle(const char *title);
+extern void APIENTRY glutSetIconTitle(const char *title);
+extern void APIENTRY glutPositionWindow(int x, int y);
+extern void APIENTRY glutReshapeWindow(int width, int height);
+extern void APIENTRY glutPopWindow(void);
+extern void APIENTRY glutPushWindow(void);
+extern void APIENTRY glutIconifyWindow(void);
+extern void APIENTRY glutShowWindow(void);
+extern void APIENTRY glutHideWindow(void);
+#if (GLUT_API_VERSION >= 3)
+extern void APIENTRY glutFullScreen(void);
+extern void APIENTRY glutSetCursor(int cursor);
+#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9)
+extern void APIENTRY glutWarpPointer(int x, int y);
+#if (GLUT_MACOSX_IMPLEMENTATION >= 1)
+/* surface texturing API Mac OS X specific
+*  Note:
+*	glutSurfaceTexture has been deprecated, use GL_EXT_framebuffer_object
+*/
+#ifdef MAC_OS_X_VERSION_10_5
+extern void APIENTRY glutSurfaceTexture (GLenum target, GLenum internalformat, int surfacewin); AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_5
+#else
+extern void APIENTRY glutSurfaceTexture (GLenum target, GLenum internalformat, int surfacewin);
+#endif
+#endif
+#if (GLUT_MACOSX_IMPLEMENTATION >= 2)
+/* Mac OS X specific API */
+extern void APIENTRY glutWMCloseFunc(void (*func)(void));
+extern void APIENTRY glutCheckLoop(void);
+#endif
+#endif
+
+/* GLUT overlay sub-API. */
+extern void APIENTRY glutEstablishOverlay(void);
+extern void APIENTRY glutRemoveOverlay(void);
+extern void APIENTRY glutUseLayer(GLenum layer);
+extern void APIENTRY glutPostOverlayRedisplay(void);
+#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 11)
+extern void APIENTRY glutPostWindowOverlayRedisplay(int win);
+#endif
+extern void APIENTRY glutShowOverlay(void);
+extern void APIENTRY glutHideOverlay(void);
+#endif
+
+/* GLUT menu sub-API. */
+extern int APIENTRY glutCreateMenu(void (*)(int));
+extern void APIENTRY glutDestroyMenu(int menu);
+extern int APIENTRY glutGetMenu(void);
+extern void APIENTRY glutSetMenu(int menu);
+extern void APIENTRY glutAddMenuEntry(const char *label, int value);
+extern void APIENTRY glutAddSubMenu(const char *label, int submenu);
+extern void APIENTRY glutChangeToMenuEntry(int item, const char *label, int value);
+extern void APIENTRY glutChangeToSubMenu(int item, const char *label, int submenu);
+extern void APIENTRY glutRemoveMenuItem(int item);
+extern void APIENTRY glutAttachMenu(int button);
+extern void APIENTRY glutDetachMenu(int button);
+
+/* GLUT window callback sub-API. */
+extern void APIENTRY glutDisplayFunc(void (*func)(void));
+extern void APIENTRY glutReshapeFunc(void (*func)(int width, int height));
+extern void APIENTRY glutKeyboardFunc(void (*func)(unsigned char key, int x, int y));
+extern void APIENTRY glutMouseFunc(void (*func)(int button, int state, int x, int y));
+extern void APIENTRY glutMotionFunc(void (*func)(int x, int y));
+extern void APIENTRY glutPassiveMotionFunc(void (*func)(int x, int y));
+extern void APIENTRY glutEntryFunc(void (*func)(int state));
+extern void APIENTRY glutVisibilityFunc(void (*func)(int state));
+extern void APIENTRY glutIdleFunc(void (*func)(void));
+extern void APIENTRY glutTimerFunc(unsigned int millis, void (*func)(int value), int value);
+extern void APIENTRY glutMenuStateFunc(void (*func)(int state));
+#if (GLUT_API_VERSION >= 2)
+extern void APIENTRY glutSpecialFunc(void (*func)(int key, int x, int y));
+extern void APIENTRY glutSpaceballMotionFunc(void (*func)(int x, int y, int z));
+extern void APIENTRY glutSpaceballRotateFunc(void (*func)(int x, int y, int z));
+extern void APIENTRY glutSpaceballButtonFunc(void (*func)(int button, int state));
+extern void APIENTRY glutButtonBoxFunc(void (*func)(int button, int state));
+extern void APIENTRY glutDialsFunc(void (*func)(int dial, int value));
+extern void APIENTRY glutTabletMotionFunc(void (*func)(int x, int y));
+extern void APIENTRY glutTabletButtonFunc(void (*func)(int button, int state, int x, int y));
+#if (GLUT_API_VERSION >= 3)
+extern void APIENTRY glutMenuStatusFunc(void (*func)(int status, int x, int y));
+extern void APIENTRY glutOverlayDisplayFunc(void (*func)(void));
+#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9)
+extern void APIENTRY glutWindowStatusFunc(void (*func)(int state));
+#endif
+#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 13)
+extern void APIENTRY glutKeyboardUpFunc(void (*func)(unsigned char key, int x, int y));
+extern void APIENTRY glutSpecialUpFunc(void (*func)(int key, int x, int y));
+extern void APIENTRY glutJoystickFunc(void (*func)(unsigned int buttonMask, int x, int y, int z), int pollInterval);
+#endif
+#endif
+#endif
+
+/* GLUT color index sub-API. */
+extern void APIENTRY glutSetColor(int, GLfloat red, GLfloat green, GLfloat blue);
+extern GLfloat APIENTRY glutGetColor(int ndx, int component);
+extern void APIENTRY glutCopyColormap(int win);
+
+/* GLUT state retrieval sub-API. */
+extern int APIENTRY glutGet(GLenum type);
+extern int APIENTRY glutDeviceGet(GLenum type);
+#if (GLUT_API_VERSION >= 2)
+/* GLUT extension support sub-API */
+extern int APIENTRY glutExtensionSupported(const char *name);
+#endif
+#if (GLUT_API_VERSION >= 3)
+extern int APIENTRY glutGetModifiers(void);
+extern int APIENTRY glutLayerGet(GLenum type);
+#endif
+#if (GLUT_API_VERSION >= 5)
+extern void * APIENTRY glutGetProcAddress(const char *procName);
+#endif
+
+/* GLUT font sub-API */
+extern void APIENTRY glutBitmapCharacter(void *font, int character);
+extern int APIENTRY glutBitmapWidth(void *font, int character);
+extern void APIENTRY glutStrokeCharacter(void *font, int character);
+extern int APIENTRY glutStrokeWidth(void *font, int character);
+#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9)
+extern int APIENTRY glutBitmapLength(void *font, const unsigned char *string);
+extern int APIENTRY glutStrokeLength(void *font, const unsigned char *string);
+#endif
+
+/* GLUT pre-built models sub-API */
+extern void APIENTRY glutWireSphere(GLdouble radius, GLint slices, GLint stacks);
+extern void APIENTRY glutSolidSphere(GLdouble radius, GLint slices, GLint stacks);
+extern void APIENTRY glutWireCone(GLdouble base, GLdouble height, GLint slices, GLint stacks);
+extern void APIENTRY glutSolidCone(GLdouble base, GLdouble height, GLint slices, GLint stacks);
+extern void APIENTRY glutWireCube(GLdouble size);
+extern void APIENTRY glutSolidCube(GLdouble size);
+extern void APIENTRY glutWireTorus(GLdouble innerRadius, GLdouble outerRadius, GLint sides, GLint rings);
+extern void APIENTRY glutSolidTorus(GLdouble innerRadius, GLdouble outerRadius, GLint sides, GLint rings);
+extern void APIENTRY glutWireDodecahedron(void);
+extern void APIENTRY glutSolidDodecahedron(void);
+extern void APIENTRY glutWireTeapot(GLdouble size);
+extern void APIENTRY glutSolidTeapot(GLdouble size);
+extern void APIENTRY glutWireOctahedron(void);
+extern void APIENTRY glutSolidOctahedron(void);
+extern void APIENTRY glutWireTetrahedron(void);
+extern void APIENTRY glutSolidTetrahedron(void);
+extern void APIENTRY glutWireIcosahedron(void);
+extern void APIENTRY glutSolidIcosahedron(void);
+
+#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9)
+/* GLUT video resize sub-API. */
+extern int APIENTRY glutVideoResizeGet(GLenum param);
+extern void APIENTRY glutSetupVideoResizing(void);
+extern void APIENTRY glutStopVideoResizing(void);
+extern void APIENTRY glutVideoResize(int x, int y, int width, int height);
+extern void APIENTRY glutVideoPan(int x, int y, int width, int height);
+
+/* GLUT debugging sub-API. */
+extern void APIENTRY glutReportErrors(void);
+#endif
+
+#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 13)
+/* GLUT device control sub-API. */
+/* glutSetKeyRepeat modes. */
+#define GLUT_KEY_REPEAT_OFF		0
+#define GLUT_KEY_REPEAT_ON		1
+#define GLUT_KEY_REPEAT_DEFAULT		2
+
+/* Joystick button masks. */
+#define GLUT_JOYSTICK_BUTTON_A		1
+#define GLUT_JOYSTICK_BUTTON_B		2
+#define GLUT_JOYSTICK_BUTTON_C		4
+#define GLUT_JOYSTICK_BUTTON_D		8
+
+extern void APIENTRY glutIgnoreKeyRepeat(int ignore);
+extern void APIENTRY glutSetKeyRepeat(int repeatMode);
+extern void APIENTRY glutForceJoystickFunc(void);
+
+/* GLUT game mode sub-API. */
+/* glutGameModeGet. */
+#define GLUT_GAME_MODE_ACTIVE           0
+#define GLUT_GAME_MODE_POSSIBLE         1
+#define GLUT_GAME_MODE_WIDTH            2
+#define GLUT_GAME_MODE_HEIGHT           3
+#define GLUT_GAME_MODE_PIXEL_DEPTH      4
+#define GLUT_GAME_MODE_REFRESH_RATE     5
+#define GLUT_GAME_MODE_DISPLAY_CHANGED  6
+
+extern void APIENTRY glutGameModeString(const char *string);
+extern int APIENTRY glutEnterGameMode(void);
+extern void APIENTRY glutLeaveGameMode(void);
+extern int APIENTRY glutGameModeGet(GLenum mode);
+#endif
+
+#ifdef __cplusplus
+}
+
+#endif
+
+#ifdef GLUT_APIENTRY_DEFINED
+# undef GLUT_APIENTRY_DEFINED
+# undef APIENTRY
+#endif
+
+#ifdef GLUT_WINGDIAPI_DEFINED
+# undef GLUT_WINGDIAPI_DEFINED
+# undef WINGDIAPI
+#endif
+
+#endif                  /* __glut_h__ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Headers/glutbitmap.h	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,30 @@
+#ifndef __glutbitmap_h__
+#define __glutbitmap_h__
+
+/* Copyright (c) Mark J. Kilgard, 1994. */
+
+/* This program is freely distributable without licensing fees 
+   and is provided without guarantee or warrantee expressed or 
+   implied. This program is -not- in the public domain. */
+
+#include "glut.h"
+
+typedef struct {
+  const GLsizei width;
+  const GLsizei height;
+  const GLfloat xorig;
+  const GLfloat yorig;
+  const GLfloat advance;
+  const GLubyte *bitmap;
+} BitmapCharRec, *BitmapCharPtr;
+
+typedef struct {
+  const char *name;
+  const int num_chars;
+  const int first;
+  const BitmapCharRec * const *ch;
+} BitmapFontRec, *BitmapFontPtr;
+
+typedef void *GLUTbitmapFont;
+
+#endif /* __glutbitmap_h__ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Headers/glutf90.h	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,90 @@
+#ifndef __glutf90_h__
+#define __glutf90_h__
+
+/* Copyright (c) Mark J. Kilgard & Willam F. Mitchell, 1998. */
+
+/* This program is freely distributable without licensing fees 
+   and is provided without guarantee or warrantee expressed or 
+   implied. This program is -not- in the public domain. */
+
+/* This header provides the binding interface for William Mitchell's
+   f90gl Fortran 90 GLUT binding.  Other GLUT language bindings
+   can and should use this interace. */
+
+/* I appreciate the guidance from William Mitchell
+   (mitchell@cam.nist.gov) in developing this friend interface
+   for use by the f90gl package.  See ../../README.fortran */
+
+#include <GLUT/glut.h>
+
+#ifndef GLUTCALLBACK
+	#define GLUTCALLBACK
+#endif
+#ifndef APIENTRY
+	#define APIENTRY
+#endif
+
+/* Which callback enumerants for the __glutSetFCB/__glutGetFCB routines. */
+/* NOTE These values are part of a binary interface for the f90gl Fortran
+   90 binding and so must NOT changes (additions are allowed). */
+
+/* GLUTwindow callbacks. */
+#define GLUT_FCB_DISPLAY         0    /* GLUTdisplayFCB */
+#define GLUT_FCB_RESHAPE         1    /* GLUTreshapeFCB */
+#define GLUT_FCB_MOUSE           2    /* GLUTmouseFCB */
+#define GLUT_FCB_MOTION          3    /* GLUTmotionFCB */
+#define GLUT_FCB_PASSIVE         4    /* GLUTpassiveFCB */
+#define GLUT_FCB_ENTRY           5    /* GLUTentryFCB */
+#define GLUT_FCB_KEYBOARD        6    /* GLUTkeyboardFCB */
+#define GLUT_FCB_KEYBOARD_UP     7    /* GLUTkeyboardFCB */
+#define GLUT_FCB_WINDOW_STATUS   8    /* GLUTwindowStatusFCB */
+#define GLUT_FCB_VISIBILITY      9    /* GLUTvisibilityFCB */
+#define GLUT_FCB_SPECIAL         10   /* GLUTspecialFCB */
+#define GLUT_FCB_SPECIAL_UP      11   /* GLUTspecialFCB */
+#define GLUT_FCB_BUTTON_BOX      12   /* GLUTbuttonBoxFCB */
+#define GLUT_FCB_DIALS           13   /* GLUTdialsFCB */
+#define GLUT_FCB_SPACE_MOTION    14   /* GLUTspaceMotionFCB */
+#define GLUT_FCB_SPACE_ROTATE    15   /* GLUTspaceRotateFCB */
+#define GLUT_FCB_SPACE_BUTTON    16   /* GLUTspaceButtonFCB */
+#define GLUT_FCB_TABLET_MOTION   17   /* GLUTtabletMotionFCB */
+#define GLUT_FCB_TABLET_BUTTON   18   /* GLUTtabletButtonFCB */
+#define GLUT_FCB_JOYSTICK        19   /* GLUTjoystickFCB */
+#define GLUT_FCB_WMCLOSE         20   /* GLUTwmcloseFCB */
+/* Non-GLUTwindow callbacks. */
+#define GLUT_FCB_OVERLAY_DISPLAY 100  /* GLUTdisplayFCB */
+#define GLUT_FCB_SELECT          101  /* GLUTselectFCB */
+#define GLUT_FCB_TIMER           102  /* GLUTtimerFCB */
+
+/* GLUT Fortran callback function types. */
+typedef void (GLUTCALLBACK *GLUTdisplayFCB) (void);
+typedef void (GLUTCALLBACK *GLUTwmcloseFCB) (void);
+typedef void (GLUTCALLBACK *GLUTreshapeFCB) (int *, int *);
+/* NOTE the pressed key is int, not unsigned char for Fortran! */
+typedef void (GLUTCALLBACK *GLUTkeyboardFCB) (int *, int *, int *);
+typedef void (GLUTCALLBACK *GLUTmouseFCB) (int *, int *, int *, int *);
+typedef void (GLUTCALLBACK *GLUTmotionFCB) (int *, int *);
+typedef void (GLUTCALLBACK *GLUTpassiveFCB) (int *, int *);
+typedef void (GLUTCALLBACK *GLUTentryFCB) (int *);
+typedef void (GLUTCALLBACK *GLUTwindowStatusFCB) (int *);
+typedef void (GLUTCALLBACK *GLUTvisibilityFCB) (int *);
+typedef void (GLUTCALLBACK *GLUTspecialFCB) (int *, int *, int *);
+typedef void (GLUTCALLBACK *GLUTbuttonBoxFCB) (int *, int *);
+typedef void (GLUTCALLBACK *GLUTdialsFCB) (int *, int *);
+typedef void (GLUTCALLBACK *GLUTspaceMotionFCB) (int *, int *, int *);
+typedef void (GLUTCALLBACK *GLUTspaceRotateFCB) (int *, int *, int *);
+typedef void (GLUTCALLBACK *GLUTspaceButtonFCB) (int *, int *);
+typedef void (GLUTCALLBACK *GLUTtabletMotionFCB) (int *, int *);
+typedef void (GLUTCALLBACK *GLUTtabletButtonFCB) (int *, int *, int *, int *);
+typedef void (GLUTCALLBACK *GLUTjoystickFCB) (unsigned int *buttonMask, int *x, int *y, int *z);
+
+typedef void (GLUTCALLBACK *GLUTselectFCB) (int *);
+typedef void (GLUTCALLBACK *GLUTtimerFCB) (int *);
+typedef void (GLUTCALLBACK *GLUTmenuStateFCB) (int *);  /* DEPRICATED. */
+typedef void (GLUTCALLBACK *GLUTmenuStatusFCB) (int *, int *, int *);
+typedef void (GLUTCALLBACK *GLUTidleFCB) (void);
+
+/* Functions that set and return Fortran callback functions. */
+extern void* APIENTRY __glutGetFCB(int which);
+extern void APIENTRY __glutSetFCB(int which, void *func);
+
+#endif  /* __glutf90_h__ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Headers/glutstroke.h	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,42 @@
+#ifndef __glutstroke_h__
+#define __glutstroke_h__
+
+/* Copyright (c) Mark J. Kilgard, 1994. */
+
+/* This program is freely distributable without licensing fees 
+   and is provided without guarantee or warrantee expressed or 
+   implied. This program is -not- in the public domain. */
+
+#if defined(_WIN32)
+#pragma warning (disable:4244)  /* disable bogus conversion warnings */
+#pragma warning (disable:4305)  /* VC++ 5.0 version of above warning. */
+#endif
+
+typedef struct {
+  float x;
+  float y;
+} CoordRec, *CoordPtr;
+
+typedef struct {
+  int num_coords;
+  const CoordRec *coord;
+} StrokeRec, *StrokePtr;
+
+typedef struct {
+  int num_strokes;
+  const StrokeRec *stroke;
+  float center;
+  float right;
+} StrokeCharRec, *StrokeCharPtr;
+
+typedef struct {
+  const char *name;
+  int num_chars;
+  const StrokeCharRec *ch;
+  float top;
+  float bottom;
+} StrokeFontRec, *StrokeFontPtr;
+
+typedef void *GLUTstrokeFont;
+
+#endif /* __glutstroke_h__ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Headers/gutil.h	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,89 @@
+
+/*
+ * gutil.h
+ *
+ * FUNCTION:
+ * Provide utilities that allow rotation to occur 
+ * around any axis.
+ * 
+ * HISTORY:
+ * created by Linas Vepstas  1990
+ * added single & double precision, June 1991, Linas Vepstas
+ */
+
+#ifndef __GUTIL_H__
+#define __GUTIL_H__
+
+#ifdef __GUTIL_DOUBLE
+#define gutDouble double
+#else
+#define gutDouble float  
+#endif
+
+
+#ifdef _NO_PROTO		/* NO ANSI C PROTOTYPING */
+
+/* Rotation Utilities */
+extern void rot_axis_f ();
+extern void rot_about_axis_f ();
+extern void rot_omega_f ();
+extern void urot_axis_f ();
+extern void urot_about_axis_f ();
+extern void urot_omega_f ();
+
+/* double-precision versions */
+extern void rot_axis_d ();
+extern void rot_about_axis_d ();
+extern void rot_omega_d ();
+extern void urot_axis_d ();
+extern void urot_about_axis_d ();
+extern void urot_omega_d ();
+
+/* viewpoint functions */
+extern void uview_direction_d ();
+extern void uview_direction_f ();
+extern void uviewpoint_d ();
+extern void uviewpoint_f ();
+
+#else /* _NO_PROTO */		/* ANSI C PROTOTYPING */
+
+/* Rotation Utilities */
+extern void rot_axis_f (float omega, float axis[3]);
+extern void rot_about_axis_f (float angle, float axis[3]);
+extern void rot_omega_f (float axis[3]);
+extern void urot_axis_f (float m[4][4], float omega, float axis[3]);
+extern void urot_about_axis_f (float m[4][4], float angle, float axis[3]);
+extern void urot_omega_f (float m[4][4], float axis[3]);
+
+/* double-precision versions */
+extern void rot_axis_d (double omega, double axis[3]);
+extern void rot_about_axis_d (double angle, double axis[3]);
+extern void rot_omega_d (double axis[3]);
+extern void urot_axis_d (double m[4][4], double omega, double axis[3]);
+extern void urot_about_axis_d (double m[4][4], double angle, double axis[3]);
+extern void urot_omega_d (double m[4][4], double axis[3]);
+
+/* viewpoint functions */
+extern void uview_direction_d (double m[4][4],		/* returned */
+                        double v21[3],		/* input */
+                        double up[3]);		/* input */
+
+extern void uview_direction_f (float m[4][4],		/* returned */
+                        float v21[3],		/* input */
+                        float up[3]);		/* input */
+
+extern void uviewpoint_d (double m[4][4],		/* returned */
+                   double v1[3],		/* input */
+                   double v2[3],		/* input */
+                   double up[3]);		/* input */
+
+extern void uviewpoint_f (float m[4][4],		/* returned */
+                   float v1[3],		/* input */
+                   float v2[3],		/* input */
+                   float up[3]);		/* input */
+
+#endif /* _NO_PROTO */
+
+#endif /* _GUTIL_H__ */
+
+/* ------------------- end of file ---------------------- */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Headers/intersect.h	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,391 @@
+/*
+ * FUNCTION:
+ * This file contains a number of utilities useful to 3D graphics in
+ * general, and to the generation of tubing and extrusions in particular
+ * 
+ * HISTORY:
+ * Written by Linas Vepstas, August 1991
+ * Updated to correctly handle degenerate cases, Linas,  February 1993 
+ */
+
+#include <math.h>
+#include "port.h"
+#include "vvector.h"
+
+#define BACKWARDS_INTERSECT (2)
+
+/* ========================================================== */
+/*
+ * the Degenerate_Tolerance token represents the greatest amount by
+ * which different scales in a graphics environment can differ before
+ * they should be considered "degenerate".   That is, when one vector is
+ * a million times longer than another, changces are that the second will
+ * be less than a pixel int, and therefore was probably meant to be
+ * degenerate (by the CAD package, etc.)  But what should this tolerance
+ * be?  At least 1 in onethousand (since screen sizes are 1K pixels), but
+ * les than 1 in 4 million (since this is the limit of single-precision
+ * floating point accuracy).  Of course, if double precision were used,
+ * then the tolerance could be increased.
+ * 
+ * Potentially, this naive assumption could cause problems if the CAD
+ * package attempts to zoom in on small details, and turns out, certain
+ * points should not hvae been degenerate.  The problem presented here
+ * is that the tolerance could run out before single-precision ran
+ * out, and so the CAD packages would perceive this as a "bug".
+ * One alternative is to fiddle around & try to tighten the tolerance.
+ * However, the right alternative is to code the graphics pipeline in
+ * double-precision (and tighten the tolerance).
+ *
+ * By the way, note that Degernate Tolerance is a "dimensionless"
+ * quantitiy -- it has no units -- it does not measure feet, inches,
+ * millimeters or pixels.  It is used only in the computations of ratios
+ * and relative lengths.
+ */
+
+/* 
+ * Right now, the tolerance is set to 2 parts in a million, which
+ * corresponds to a 19-bit distinction of mantissas. Note that
+ * single-precsion numbers have 24 bit mantissas.
+ */
+
+#define DEGENERATE_TOLERANCE   (0.000002)
+
+/* ========================================================== */
+/* 
+ * The macro and subroutine INTERSECT are designed to compute the
+ * intersection of a line (defined by the points v1 and v2) and a plane
+ * (defined as plane which is normal to the vector n, and contains the
+ * point p).  Both return the point sect, which is the point of
+ * interesection.
+ *
+ * This MACRO attemps to be fairly robust by checking for a divide by
+ * zero.
+ */
+
+/* ========================================================== */
+/*
+ * HACK ALERT
+ * The intersection parameter t has the nice property that if t>1,
+ * then the intersection is "in front of" p1, and if t<0, then the
+ * intersection is "behind" p2. Unfortunately, as the intersecting plane
+ * and the line become parallel, t wraps through infinity -- i.e. t can
+ * become so large that t becomes "greater than infinity" and comes back 
+ * as a negative number (i.e. winding number hopped by one unit).  We 
+ * have no way of detecting this situation without adding gazzillions 
+ * of lines of code of topological algebra to detect the winding number;
+ * and this would be incredibly difficult, and ruin performance.
+ * 
+ * Thus, we've installed a cheap hack for use by the "cut style" drawing
+ * routines. If t proves to be a large negative number (more negative
+ * than -5), then we assume that t was positive and wound through
+ * infinity.  This makes most cuts look good, without introducing bogus
+ * cuts at infinity.
+ */
+/* ========================================================== */
+
+#define INTERSECT(sect,p,n,v1,v2)			\
+{							\
+   gleDouble deno, numer, t, omt;			\
+							\
+   deno = (v1[0] - v2[0]) * n[0];			\
+   deno += (v1[1] - v2[1]) * n[1];			\
+   deno += (v1[2] - v2[2]) * n[2];			\
+   							\
+   if (deno == 0.0) {					\
+      VEC_COPY (n, v1);					\
+      /* printf ("Intersect: Warning: line is coplanar with plane \n"); */ \
+   } else {						\
+							\
+      numer = (p[0] - v2[0]) * n[0];			\
+      numer += (p[1] - v2[1]) * n[1];			\
+      numer += (p[2] - v2[2]) * n[2];			\
+							\
+      t = numer / deno;					\
+      omt = 1.0 - t;					\
+							\
+      sect[0] = t * v1[0] + omt * v2[0];		\
+      sect[1] = t * v1[1] + omt * v2[1];		\
+      sect[2] = t * v1[2] + omt * v2[2];		\
+   }							\
+}
+
+/* ========================================================== */
+/* 
+ * The macro and subroutine BISECTING_PLANE compute a normal vector that
+ * describes the bisecting plane between three points (v1, v2 and v3).  
+ * This bisecting plane has the following properties:
+ * 1) it contains the point v2
+ * 2) the angle it makes with v21 == v2 - v1 is equal to the angle it 
+ *    makes with v32 == v3 - v2 
+ * 3) it is perpendicular to the plane defined by v1, v2, v3.
+ *
+ * Having input v1, v2, and v3, it returns a unit vector n.
+ *
+ * In some cases, the user may specify degenerate points, and still
+ * expect "reasonable" or "obvious" behaviour.  The "expected"
+ * behaviour for these degenerate cases is:
+ *
+ * 1) if v1 == v2 == v3, then return n=0
+ * 2) if v1 == v2, then return v32 (normalized).
+ * 3) if v2 == v3, then return v21 (normalized).
+ * 4) if v1, v2 and v3 co-linear, then return v21 (normalized).
+ *
+ * Mathematically, these special cases "make sense" -- we just have to
+ * code around potential divide-by-zero's in the code below.
+ */
+
+/* ========================================================== */
+
+#define BISECTING_PLANE(valid,n,v1,v2,v3)			\
+{								\
+   double v21[3], v32[3];					\
+   double len21, len32;						\
+   double vdot;							\
+								\
+   VEC_DIFF (v21, v2, v1);					\
+   VEC_DIFF (v32, v3, v2);					\
+								\
+   VEC_LENGTH (len21, v21);					\
+   VEC_LENGTH (len32, v32);					\
+								\
+   if (len21 <= DEGENERATE_TOLERANCE * len32) {			\
+								\
+      if (len32 == 0.0) {					\
+         /* all three points lie ontop of one-another */	\
+         VEC_ZERO (n);						\
+         valid = FALSE;						\
+      } else {							\
+         /* return a normalized copy of v32 as bisector */	\
+         len32 = 1.0 / len32;					\
+         VEC_SCALE (n, len32, v32);				\
+         valid = TRUE;						\
+      }								\
+								\
+   } else {							\
+								\
+      valid = TRUE;						\
+								\
+      if (len32 <= DEGENERATE_TOLERANCE * len21) {		\
+         /* return a normalized copy of v21 as bisector */	\
+         len21 = 1.0 / len21;					\
+         VEC_SCALE (n, len21, v21);				\
+								\
+      } else {							\
+								\
+         /* normalize v21 to be of unit length */		\
+         len21 = 1.0 / len21;					\
+         VEC_SCALE (v21, len21, v21);				\
+								\
+         /* normalize v32 to be of unit length */		\
+         len32 = 1.0 / len32;					\
+         VEC_SCALE (v32, len32, v32);				\
+								\
+         VEC_DOT_PRODUCT (vdot, v32, v21);			\
+								\
+         /* if vdot == 1 or -1, then points are colinear */	\
+         if ((vdot >= (1.0-DEGENERATE_TOLERANCE)) || 		\
+             (vdot <= (-1.0+DEGENERATE_TOLERANCE))) {		\
+            VEC_COPY (n, v21);					\
+         } else {						\
+   								\
+            /* go do the full computation */ 			\
+            n[0] = vdot * (v32[0] + v21[0]) - v32[0] - v21[0];	\
+            n[1] = vdot * (v32[1] + v21[1]) - v32[1] - v21[1];	\
+            n[2] = vdot * (v32[2] + v21[2]) - v32[2] - v21[2];	\
+								\
+            /* if above if-test's passed, 			\
+             * n should NEVER be of zero length */		\
+            VEC_NORMALIZE (n);					\
+         } 							\
+      } 							\
+   } 								\
+}
+
+/* ========================================================== */
+/*
+ * The block of code below is ifdef'd out, and is here for reference
+ * purposes only.  It performs the "mathematically right thing" for
+ * computing a bisecting plane, but is, unfortunately, subject ot noise
+ * in the presence of near degenerate points.  Since computer graphics,
+ * due to sloppy coding, laziness, or correctness, is filled with
+ * degenerate points, we can't really use this version.  The code above
+ * is far more appropriate for graphics.
+ */
+
+#ifdef MATHEMATICALLY_EXACT_GRAPHICALLY_A_KILLER
+#define BISECTING_PLANE(n,v1,v2,v3)				\
+{								\
+   double v21[3], v32[3];					\
+   double len21, len32;						\
+   double vdot;							\
+								\
+   VEC_DIFF (v21, v2, v1);					\
+   VEC_DIFF (v32, v3, v2);					\
+								\
+   VEC_LENGTH (len21, v21);					\
+   VEC_LENGTH (len32, v32);					\
+								\
+   if (len21 == 0.0) {						\
+								\
+      if (len32 == 0.0) {					\
+         /* all three points lie ontop of one-another */	\
+         VEC_ZERO (n);						\
+         valid = FALSE;						\
+      } else {							\
+         /* return a normalized copy of v32 as bisector */	\
+         len32 = 1.0 / len32;					\
+         VEC_SCALE (n, len32, v32);				\
+      }								\
+								\
+   } else {							\
+								\
+      /* normalize v21 to be of unit length */			\
+      len21 = 1.0 / len21;					\
+      VEC_SCALE (v21, len21, v21);				\
+								\
+      if (len32 == 0.0) {					\
+         /* return a normalized copy of v21 as bisector */	\
+         VEC_COPY (n, v21);					\
+      } else {							\
+								\
+         /* normalize v32 to be of unit length */		\
+         len32 = 1.0 / len32;					\
+         VEC_SCALE (v32, len32, v32);				\
+								\
+         VEC_DOT_PRODUCT (vdot, v32, v21);			\
+								\
+         /* if vdot == 1 or -1, then points are colinear */	\
+         if ((vdot == 1.0) || (vdot == -1.0)) {			\
+            VEC_COPY (n, v21);					\
+         } else {						\
+   								\
+            /* go do the full computation */ 			\
+            n[0] = vdot * (v32[0] + v21[0]) - v32[0] - v21[0];	\
+            n[1] = vdot * (v32[1] + v21[1]) - v32[1] - v21[1];	\
+            n[2] = vdot * (v32[2] + v21[2]) - v32[2] - v21[2];	\
+								\
+            /* if above if-test's passed, 			\
+             * n should NEVER be of zero length */		\
+            VEC_NORMALIZE (n);					\
+         } 							\
+      } 							\
+   } 								\
+}
+#endif
+
+/* ========================================================== */
+/*
+ * This macro computes the plane perpendicular to the the plane
+ * defined by three points, and whose normal vector is givven as the
+ * difference between the two vectors ...
+ * 
+ * (See way below for the "math" model if you want to understand this.
+ * The comments about relative errors above apply here.)
+ */
+
+#define CUTTING_PLANE(valid,n,v1,v2,v3)				\
+{								\
+   double v21[3], v32[3];					\
+   double len21, len32;						\
+   double lendiff;						\
+								\
+   VEC_DIFF (v21, v2, v1);					\
+   VEC_DIFF (v32, v3, v2);					\
+								\
+   VEC_LENGTH (len21, v21);					\
+   VEC_LENGTH (len32, v32);					\
+								\
+   if (len21 <= DEGENERATE_TOLERANCE * len32) {			\
+								\
+      if (len32 == 0.0) {					\
+         /* all three points lie ontop of one-another */	\
+         VEC_ZERO (n);						\
+         valid = FALSE;						\
+      } else {							\
+         /* return a normalized copy of v32 as cut-vector */	\
+         len32 = 1.0 / len32;					\
+         VEC_SCALE (n, len32, v32);				\
+         valid = TRUE;						\
+      }								\
+								\
+   } else {							\
+								\
+      valid = TRUE;						\
+								\
+      if (len32 <= DEGENERATE_TOLERANCE * len21) {		\
+         /* return a normalized copy of v21 as cut vector */	\
+         len21 = 1.0 / len21;					\
+         VEC_SCALE (n, len21, v21);				\
+      } else {							\
+								\
+         /* normalize v21 to be of unit length */		\
+         len21 = 1.0 / len21;					\
+         VEC_SCALE (v21, len21, v21);				\
+								\
+         /* normalize v32 to be of unit length */		\
+         len32 = 1.0 / len32;					\
+         VEC_SCALE (v32, len32, v32);				\
+								\
+         VEC_DIFF (n, v21, v32);				\
+         VEC_LENGTH (lendiff, n);				\
+								\
+         /* if the perp vector is very small, then the two 	\
+          * vectors are darn near collinear, and the cut 	\
+          * vector is probably poorly defined. */		\
+         if (lendiff < DEGENERATE_TOLERANCE) {			\
+            VEC_ZERO (n);					\
+            valid = FALSE;					\
+         } else {						\
+            lendiff = 1.0 / lendiff;				\
+            VEC_SCALE (n, lendiff, n);				\
+         } 							\
+      } 							\
+   } 								\
+}
+
+/* ========================================================== */
+
+#ifdef MATHEMATICALLY_EXACT_GRAPHICALLY_A_KILLER
+#define CUTTING_PLANE(n,v1,v2,v3)		\
+{						\
+   double v21[3], v32[3];			\
+						\
+   VEC_DIFF (v21, v2, v1);			\
+   VEC_DIFF (v32, v3, v2);			\
+						\
+   VEC_NORMALIZE (v21);				\
+   VEC_NORMALIZE (v32);				\
+						\
+   VEC_DIFF (n, v21, v32);			\
+   VEC_NORMALIZE (n);				\
+}
+#endif
+
+
+/* ============================================================ */
+/* This macro is used in several places to cycle through a series of
+ * points to find the next non-degenerate point in a series */
+
+#define FIND_NON_DEGENERATE_POINT(inext,npoints,len,diff,point_array)   \
+{                                                                       \
+   gleDouble slen;							\
+   gleDouble summa[3];							\
+   									\
+   do {                                                                 \
+      /* get distance to next point */                                  \
+      VEC_DIFF (diff, point_array[inext+1], point_array[inext]);        \
+      VEC_LENGTH (len, diff);                                           \
+      VEC_SUM (summa, point_array[inext+1], point_array[inext]);        \
+      VEC_LENGTH (slen, summa);                                         \
+      slen *= DEGENERATE_TOLERANCE;					\
+      inext ++;                                                         \
+   } while ((len <= slen) && (inext < npoints-1));                      \
+}
+
+/* ========================================================== */
+
+extern int bisecting_plane (gleDouble n[3],    /* returned */
+                      gleDouble v1[3],  /* input */
+                      gleDouble v2[3],  /* input */
+                      gleDouble v3[3]);  /* input */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Headers/port.h	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,298 @@
+
+/*
+ * port.h 
+ *
+ * FUNCTION:
+ * This file contains defines for porting the tubing toolkit from GL to
+ * OpenGL to some callback scheme.
+ *
+ * HISTORY:
+ * Created by Linas Vepstas --  February 1993
+ * Added auto texture coord generation hacks, Linas April 1994 
+ */
+
+#ifndef __GLE_PORT_H__
+#define __GLE_PORT_H__
+
+
+#ifndef TRUE
+#define TRUE 1
+#endif
+
+#ifndef FALSE
+#define FALSE 0
+#endif
+
+#ifndef M_PI
+#define M_PI 3.14159265358979323846
+#endif
+
+/* ====================================================== */
+/* Some compilers can't handle multiply-subscripted array's */
+
+#ifdef FUNKY_C
+typedef gleDouble gleVector;
+#define AVAL(arr,n,i,j)  arr(6*n+3*i+j)
+#define VVAL(arr,n,i)  arr(3*n+i)
+
+#else  /* FUNKY_C */
+typedef double gleVector[3];
+typedef double glePoint[2];
+#define AVAL(arr,n,i,j)  arr[n][i][j]
+#define VVAL(arr,n,i)  arr[n][i];
+
+#endif /* FUNKY_C */
+
+/* ====================================================== */
+/* These are used to convey info about topography to the 
+ * texture mapping routines */
+
+#define FRONT 		1
+#define BACK 		2
+#define FRONT_CAP 	3
+#define BACK_CAP	4
+#define FILLET		5
+
+/* ====================================================== */
+
+#define __GLE_DOUBLE
+
+/* ====================================================== */
+
+#ifdef __GLE_DOUBLE
+#ifndef gleDouble
+    #define gleDouble 		double
+#endif
+#define urot_axis(a,b,c) 	urot_axis_d(a,b,c)
+#define uview_direction(a,b,c) 	uview_direction_d(a,b,c)
+#define uviewpoint(a,b,c,d) 	uviewpoint_d(a,b,c,d)
+#define MULTMATRIX(m)		MULTMATRIX_D(m)
+#define LOADMATRIX(m)		LOADMATRIX_D(m)
+#define V3F(x,j,id)		V3F_D(x,j,id)
+#define N3F(x)			N3F_D(x)
+#define T2F(x,y)		T2F_D(x,y)
+#else 
+#define gleDouble 		float
+#define urot_axis(a,b,c) 	urot_axis_f(a,b,c)
+#define uview_direction(a,b,c) 	uview_direction_f(a,b,c)
+#define uviewpoint(a,b,c,d) 	uviewpoint_f(a,b,c,d)
+#define MULTMATRIX(m)		MULTMATRIX_F(m)
+#define LOADMATRIX(m)		LOADMATRIX_F(m)
+#define V3F(x,j,id)		V3F_F(x,j,id)
+#define N3F(x)			N3F_F(x)
+#define T2F(x,y)		T2F_F(x,y)
+#endif 
+
+/* ====================================================== */
+
+#if (defined DEBUG_GL_32 || DEBUG_OPENGL_10)
+#undef GL_32
+#undef OPENGL_10
+
+#define BGNTMESH(i,len)	printf ("bgntmesh() \n");
+#define ENDTMESH()      printf ("endtmesh() \n");
+#define BGNPOLYGON()	printf ("bgnpolygon() \n");
+#define ENDPOLYGON()	printf ("endpolygon() \n");
+#define V3F_F(x,j,id)	printf ("v3f(x)		%f %f %f \n", x[0], x[1], x[2]);
+#define V3F_D(x,j,id)	printf ("v3d(x) 	%f %f %f \n", x[0], x[1], x[2]);
+#define	N3F_F(x)	printf ("n3f(x) 	%f %f %f \n", x[0], x[1], x[2]);
+#define	N3F_D(x)	printf ("n3d(x)		%f %f %f \n", x[0], x[1], x[2]);
+#define	C3F(x)		printf ("c3f(x) 	%f %f %f \n", x[0], x[1], x[2]);
+
+#define	POPMATRIX()	printf ("popmatrix () \n");
+#define	PUSHMATRIX()	printf ("pushmatrix() \n");
+#define	MULTMATRIX_F(x)	MULTMATRIX_D(x)
+#define	LOADMATRIX_F(x)	LOADMATRIX_D(x)
+
+
+#define LOADMATRIX_D(x) {				\
+   int i, j; 						\
+   printf ("loadmatrix (x) \n");			\
+   for (i=0; i<4; i++) {				\
+      for (j=0; j<4; j++) {				\
+         printf ( "%f ", x[i][j]);			\
+      }							\
+      printf (" \n");					\
+   }							\
+}
+
+#define MULTMATRIX_D(x) {				\
+   int i, j; 						\
+   printf ("multmatrix (x) \n");			\
+   for (i=0; i<4; i++) {				\
+      for (j=0; j<4; j++) {				\
+         printf ( "%f ", x[i][j]);			\
+      }							\
+      printf (" \n");					\
+   }							\
+}
+
+#define __IS_LIGHTING_ON  (1)
+
+#endif
+
+/* ====================================================== */
+
+#ifdef GL_32
+
+#include <gl/gl.h>
+
+#define BGNTMESH(i,len)	bgntmesh()
+#define ENDTMESH()	endtmesh()
+#define BGNPOLYGON()	bgnpolygon()
+#define ENDPOLYGON()	endpolygon()
+#define V3F_F(x,j,id)	v3f(x)
+#define V3F_D(x,j,id)	v3d(x)
+#define	N3F_F(x)	n3f(x)
+#define	T2F_F(x,y)
+#define	T2F_D(x,y)
+#define	C3F(x)		c3f(x)
+
+#define	POPMATRIX()	popmatrix ()
+#define	PUSHMATRIX()	pushmatrix()
+#define	MULTMATRIX_F(x)	multmatrix (x)
+#define	LOADMATRIX_F(x)	loadmatrix (x)
+
+#define	N3F_D(x) {					\
+   float nnn[3];					\
+   nnn[0] = (float) x[0]; 				\
+   nnn[1] = (float) x[1]; 				\
+   nnn[2] = (float) x[2]; 				\
+   n3f (nnn);						\
+}
+
+#define LOADMATRIX_D(x) {				\
+   int i, j; 						\
+   float mmm[4][4];					\
+   for (i=0; i<4; i++) {				\
+      for (j=0; j<4; j++) {				\
+         mmm[i][j] = (float) x[i][j];			\
+      }							\
+   }							\
+   loadmatrix(mmm);					\
+}
+
+#define MULTMATRIX_D(x) {				\
+   int i, j; 						\
+   float mmm[4][4];					\
+   for (i=0; i<4; i++) {				\
+      for (j=0; j<4; j++) {				\
+         mmm[i][j] = (float) x[i][j];			\
+      }							\
+   }							\
+   multmatrix(mmm);					\
+}
+
+/* #define __IS_LIGHTING_ON  (MSINGLE == getmmode()) */
+#define __IS_LIGHTING_ON  (extrusion_join_style & TUBE_LIGHTING_ON)
+
+#endif /* GL_32 */
+
+/* ====================================================== */
+#ifdef OPENGL_10
+
+#if defined(_WIN32)
+#include <windows.h>
+#pragma warning (disable:4244)          /* disable bogus conversion warnings */
+#endif
+#include <OpenGL/gl.h>
+#include <OpenGL/glu.h>
+
+/*
+#define	N3F_F(x) {					\
+   float nnn[3];					\
+   nnn[0] = - (float) x[0]; 				\
+   nnn[1] = - (float) x[1]; 				\
+   nnn[2] = - (float) x[2]; 				\
+   glNormal3fv (nnn);						\
+}
+#define	N3F_D(x) {					\
+   float nnn[3];					\
+   nnn[0] = - (float) x[0]; 				\
+   nnn[1] = - (float) x[1]; 				\
+   nnn[2] = - (float) x[2]; 				\
+   glNormal3fv (nnn);						\
+}
+*/
+
+#define	C3F(x)		glColor3fv(x)
+#define	T2F_F(x,y)	glTexCoord2f(x,y)
+#define	T2F_D(x,y)	glTexCoord2d(x,y)
+
+#define	POPMATRIX()	glPopMatrix()
+#define	PUSHMATRIX()	glPushMatrix()
+
+#define	MULTMATRIX_F(x)	glMultMatrixf ((const GLfloat *)x)
+#define	LOADMATRIX_F(x)	glLoadMatrixf ((const GLfloat *)x)
+
+#define	MULTMATRIX_D(x)	glMultMatrixd ((const GLdouble *)x)
+#define	LOADMATRIX_D(x)	glLoadMatrixd ((const GLdouble *)x)
+
+#define __IS_LIGHTING_ON  (glIsEnabled(GL_LIGHTING))
+
+/* ====================================================== */
+#ifdef AUTO_TEXTURE
+
+#define BGNTMESH(i,len) { 					\
+	if(_gle_gc -> bgn_gen_texture) (*(_gle_gc -> bgn_gen_texture))(i,len);\
+	glBegin (GL_TRIANGLE_STRIP); 			\
+}
+
+#define BGNPOLYGON() { 					\
+	if(_gle_gc -> bgn_gen_texture) (*(_gle_gc -> bgn_gen_texture))();\
+	glBegin (GL_POLYGON);				\
+}
+
+#define N3F_F(x) { 					\
+	if(_gle_gc -> n3f_gen_texture) (*(_gle_gc -> n3f_gen_texture))(x); \
+	glNormal3fv(x); 				\
+}
+
+#define N3F_D(x) { 					\
+	if(_gle_gc -> n3d_gen_texture) (*(_gle_gc -> n3d_gen_texture))(x); \
+	glNormal3dv(x); 				\
+}
+
+#define V3F_F(x,j,id) { 					\
+	if(_gle_gc -> v3f_gen_texture) (*(_gle_gc -> v3f_gen_texture))(x,j,id);\
+	glVertex3fv(x); 				\
+}
+
+#define V3F_D(x,j,id) { 					\
+	if(_gle_gc -> v3d_gen_texture) (*(_gle_gc -> v3d_gen_texture))(x,j,id); \
+	glVertex3dv(x); 				\
+}
+
+#define ENDTMESH() {					\
+	if(_gle_gc -> end_gen_texture) (*(_gle_gc -> end_gen_texture))(); \
+	glEnd ();					\
+}
+
+#define ENDPOLYGON() {					\
+	if(_gle_gc -> end_gen_texture) (*(_gle_gc -> end_gen_texture))(); \
+	glEnd ();					\
+}
+
+/* ====================================================== */
+#else /* AUTO_TEXTURE */
+
+#define BGNTMESH(i,len)	glBegin (GL_TRIANGLE_STRIP);
+#define BGNPOLYGON() 	glBegin (GL_POLYGON);
+
+#define	N3F_F(x)	glNormal3fv(x)
+#define	N3F_D(x)	glNormal3dv(x)
+#define V3F_F(x,j,id)	glVertex3fv(x);
+#define V3F_D(x,j,id)	glVertex3dv(x);
+
+#define ENDTMESH()	glEnd ()
+#define ENDPOLYGON()	glEnd()
+
+#endif /* AUTO_TEXTURE */
+
+#endif /* OPENGL_10 */
+
+/* ====================================================== */
+
+
+#endif /* __GLE_PORT_H__ */
+/* ================== END OF FILE ======================= */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Headers/rot.h	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,98 @@
+
+/*
+ * rot.h
+ *
+ * FUNCTION:
+ * rotation matrix utilities
+ *
+ * HISTORY:
+ * Linas Vepstas Aug 1990
+ */
+
+/* ========================================================== */
+/* 
+ * The MACROS below generate and return more traditional rotation
+ * matrices -- matrices for rotations about principal axes.
+ */
+/* ========================================================== */
+
+#define ROTX_CS(m,cosine,sine)		\
+{					\
+   /* rotation about the x-axis */	\
+					\
+   m[0][0] = 1.0;			\
+   m[0][1] = 0.0;			\
+   m[0][2] = 0.0;			\
+   m[0][3] = 0.0;			\
+					\
+   m[1][0] = 0.0;			\
+   m[1][1] = (cosine);			\
+   m[1][2] = (sine);			\
+   m[1][3] = 0.0;			\
+					\
+   m[2][0] = 0.0;			\
+   m[2][1] = -(sine);			\
+   m[2][2] = (cosine);			\
+   m[2][3] = 0.0;			\
+					\
+   m[3][0] = 0.0;			\
+   m[3][1] = 0.0;			\
+   m[3][2] = 0.0;			\
+   m[3][3] = 1.0;			\
+}				
+
+/* ========================================================== */
+
+#define ROTY_CS(m,cosine,sine)		\
+{					\
+   /* rotation about the y-axis */	\
+					\
+   m[0][0] = (cosine);			\
+   m[0][1] = 0.0;			\
+   m[0][2] = -(sine);			\
+   m[0][3] = 0.0;			\
+					\
+   m[1][0] = 0.0;			\
+   m[1][1] = 1.0;			\
+   m[1][2] = 0.0;			\
+   m[1][3] = 0.0;			\
+					\
+   m[2][0] = (sine);			\
+   m[2][1] = 0.0;			\
+   m[2][2] = (cosine);			\
+   m[2][3] = 0.0;			\
+					\
+   m[3][0] = 0.0;			\
+   m[3][1] = 0.0;			\
+   m[3][2] = 0.0;			\
+   m[3][3] = 1.0;			\
+}
+
+/* ========================================================== */
+
+#define ROTZ_CS(m,cosine,sine)		\
+{					\
+   /* rotation about the z-axis */	\
+					\
+   m[0][0] = (cosine);			\
+   m[0][1] = (sine);			\
+   m[0][2] = 0.0;			\
+   m[0][3] = 0.0;			\
+					\
+   m[1][0] = -(sine);			\
+   m[1][1] = (cosine);			\
+   m[1][2] = 0.0;			\
+   m[1][3] = 0.0;			\
+					\
+   m[2][0] = 0.0;			\
+   m[2][1] = 0.0;			\
+   m[2][2] = 1.0;			\
+   m[2][3] = 0.0;			\
+					\
+   m[3][0] = 0.0;			\
+   m[3][1] = 0.0;			\
+   m[3][2] = 0.0;			\
+   m[3][3] = 1.0;			\
+}
+
+/* ========================================================== */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Headers/segment.h	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,98 @@
+
+/*
+ * MODULE: segment.h
+ *
+ * FUNCTION:
+ * Contains function prototypes for segment drawing subroutines.
+ * These are used only internally, and are not to be exported to
+ * the user.
+ *
+ * HISTORY:
+ * Create by Linas Vepstas
+ * Added tube.h include to define gleDouble, tad February 2002
+ */
+
+/* ============================================================ */
+
+#include "tube.h"
+
+extern void draw_segment_plain (int ncp,       /* number of contour points */
+                           gleDouble front_contour[][3],
+                           gleDouble back_contour[][3],
+                           int inext, double len);
+
+extern void draw_segment_color (int ncp,       /* number of contour points */
+                           gleDouble front_contour[][3],
+                           gleDouble back_contour[][3],
+                           float color_last[3],
+                           float color_next[3],
+                           int inext, double len);
+
+extern void draw_segment_edge_n (int ncp,      /* number of contour points */
+                           gleDouble front_contour[][3],
+                           gleDouble back_contour[][3],
+                           double norm_cont[][3],
+                           int inext, double len);
+
+extern void draw_segment_c_and_edge_n (int ncp,   
+                           gleDouble front_contour[][3],
+                           gleDouble back_contour[][3],
+                           double norm_cont[][3],
+                           float color_last[3],
+                           float color_next[3],
+                           int inext, double len);
+
+extern void draw_segment_facet_n (int ncp,     
+                           gleDouble front_contour[][3],
+                           gleDouble back_contour[][3],
+                           double norm_cont[][3],
+                           int inext, double len);
+
+extern void draw_segment_c_and_facet_n (int ncp,    
+                           gleDouble front_contour[][3],
+                           gleDouble back_contour[][3],
+                           double norm_cont[][3],
+                           float color_last[3],
+                           float color_next[3],
+                           int inext, double len);
+
+/* ============================================================ */
+
+extern void draw_binorm_segment_edge_n (int ncp,  
+                           double front_contour[][3],
+                           double back_contour[][3],
+                           double front_norm[][3],
+                           double back_norm[][3],
+                           int inext, double len);
+
+extern void draw_binorm_segment_c_and_edge_n (int ncp,   
+                           double front_contour[][3],
+                           double back_contour[][3],
+                           double front_norm[][3],
+                           double back_norm[][3],
+                           float color_last[3],
+                           float color_next[3],
+                           int inext, double len);
+
+extern void draw_binorm_segment_facet_n (int ncp, 
+                           double front_contour[][3],
+                           double back_contour[][3],
+                           double front_norm[][3],
+                           double back_norm[][3],
+                           int inext, double len);
+
+extern void draw_binorm_segment_c_and_facet_n (int ncp,    
+                           double front_contour[][3],
+                           double back_contour[][3],
+                           double front_norm[][3],
+                           double back_norm[][3],
+                           float color_last[3],
+                           float color_next[3],
+                           int inext, double len);
+
+extern void draw_angle_style_back_cap (int ncp,        /* number of contour points */
+                           gleDouble bi[3],             /* biscetor */
+                           gleDouble point_array[][3]);  /* polyline */
+
+/* -------------------------- end of file -------------------------------- */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Headers/tube.h	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,203 @@
+/* 
+ * tube.h
+ *
+ * FUNCTION:
+ * Tubing and Extrusion header file.
+ * This file provides protypes and defines for the extrusion 
+ * and tubing primitives.
+ *
+ * HISTORY:
+ * Linas Vepstas 1990, 1991
+ */
+
+#ifndef __TUBE_H__
+#define __TUBE_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ GLE API revision history:
+ 
+ GLE_API_VERSION is updated to reflect GLE API changes (interface
+ changes, semantic changes, deletions, or additions).
+ 
+ GLE_API_VERSION=228  GLUT 3.7 release of GLE.
+**/
+#ifndef GLE_API_VERSION  /* allow this to be overriden */
+#define GLE_API_VERSION                228
+#endif
+
+/* some types */
+#ifndef gleDouble
+    #define gleDouble double
+#endif
+typedef gleDouble gleAffine[2][3];
+
+/* ====================================================== */
+
+/* defines for tubing join styles */
+#define TUBE_JN_RAW          0x1
+#define TUBE_JN_ANGLE        0x2
+#define TUBE_JN_CUT          0x3
+#define TUBE_JN_ROUND        0x4
+#define TUBE_JN_MASK         0xf    /* mask bits */
+#define TUBE_JN_CAP          0x10
+
+/* determine how normal vectors are to be handled */
+#define TUBE_NORM_FACET      0x100
+#define TUBE_NORM_EDGE       0x200
+#define TUBE_NORM_PATH_EDGE  0x400 /* for spiral, lathe, helix primitives */
+#define TUBE_NORM_MASK       0xf00    /* mask bits */
+
+/* closed or open countours */
+#define TUBE_CONTOUR_CLOSED	0x1000
+
+#define GLE_TEXTURE_ENABLE	0x10000
+#define GLE_TEXTURE_STYLE_MASK	0xff
+#define GLE_TEXTURE_VERTEX_FLAT		1
+#define GLE_TEXTURE_NORMAL_FLAT		2
+#define GLE_TEXTURE_VERTEX_CYL		3
+#define GLE_TEXTURE_NORMAL_CYL		4
+#define GLE_TEXTURE_VERTEX_SPH		5
+#define GLE_TEXTURE_NORMAL_SPH		6
+#define GLE_TEXTURE_VERTEX_MODEL_FLAT	7
+#define GLE_TEXTURE_NORMAL_MODEL_FLAT	8
+#define GLE_TEXTURE_VERTEX_MODEL_CYL	9
+#define GLE_TEXTURE_NORMAL_MODEL_CYL	10
+#define GLE_TEXTURE_VERTEX_MODEL_SPH	11
+#define GLE_TEXTURE_NORMAL_MODEL_SPH	12
+
+#ifdef GL_32
+/* HACK for GL 3.2 -- needed because no way to tell if lighting is on.  */
+#define TUBE_LIGHTING_ON	0x80000000
+
+#define gleExtrusion		extrusion
+#define gleSetJoinStyle		setjoinstyle
+#define gleGetJoinStyle		getjoinstyle
+#define glePolyCone		polycone
+#define glePolyCylinder		polycylinder
+#define	gleSuperExtrusion	super_extrusion
+#define	gleTwistExtrusion	twist_extrusion
+#define	gleSpiral		spiral
+#define	gleLathe		lathe
+#define	gleHelicoid		helicoid
+#define	gleToroid		toroid
+#define	gleScrew		screw
+
+#endif /* GL_32 */
+
+extern int gleGetJoinStyle (void);
+extern void gleSetJoinStyle (int style);	/* bitwise OR of flags */
+extern int gleGetNumSlices(void);
+extern void gleSetNumSlices(int slices);
+
+/* draw polyclinder, specified as a polyline */
+extern void glePolyCylinder (int npoints,	/* num points in polyline */
+                   gleDouble point_array[][3],	/* polyline vertces */
+                   float color_array[][3],	/* colors at polyline verts */
+                   gleDouble radius);		/* radius of polycylinder */
+
+/* draw polycone, specified as a polyline with radii */
+extern void glePolyCone (int npoints,	 /* numpoints in poly-line */
+                   gleDouble point_array[][3],	/* polyline vertices */
+                   float color_array[][3],	/* colors at polyline verts */
+                   gleDouble radius_array[]); /* cone radii at polyline verts */
+
+/* extrude arbitrary 2D contour along arbitrary 3D path */
+extern void gleExtrusion (int ncp,         /* number of contour points */
+                gleDouble contour[][2],     /* 2D contour */
+                gleDouble cont_normal[][2], /* 2D contour normals */
+                gleDouble up[3],            /* up vector for contour */
+                int npoints,            /* numpoints in poly-line */
+                gleDouble point_array[][3], /* polyline vertices */
+                float color_array[][3]); /* colors at polyline verts */
+
+/* extrude 2D contour, specifying local rotations (twists) */
+extern void gleTwistExtrusion (int ncp,         /* number of contour points */
+                gleDouble contour[][2],    /* 2D contour */
+                gleDouble cont_normal[][2], /* 2D contour normals */
+                gleDouble up[3],           /* up vector for contour */
+                int npoints,           /* numpoints in poly-line */
+                gleDouble point_array[][3],        /* polyline vertices */
+                float color_array[][3],        /* color at polyline verts */
+                gleDouble twist_array[]);   /* countour twists (in degrees) */
+
+/* extrude 2D contour, specifying local affine tranformations */
+extern void gleSuperExtrusion (int ncp,  /* number of contour points */
+                gleDouble contour[][2],    /* 2D contour */
+                gleDouble cont_normal[][2], /* 2D contour normals */
+                gleDouble up[3],           /* up vector for contour */
+                int npoints,           /* numpoints in poly-line */
+                gleDouble point_array[][3],        /* polyline vertices */
+                float color_array[][3],        /* color at polyline verts */
+                gleDouble xform_array[][2][3]);   /* 2D contour xforms */
+
+/* spiral moves contour along helical path by parallel transport */
+extern void gleSpiral (int ncp,        /* number of contour points */
+             gleDouble contour[][2],    /* 2D contour */
+             gleDouble cont_normal[][2], /* 2D contour normals */
+             gleDouble up[3],           /* up vector for contour */
+             gleDouble startRadius,	/* spiral starts in x-y plane */
+             gleDouble drdTheta,        /* change in radius per revolution */
+             gleDouble startZ,		/* starting z value */
+             gleDouble dzdTheta,        /* change in Z per revolution */
+             gleDouble startXform[2][3], /* starting contour affine xform */
+             gleDouble dXformdTheta[2][3], /* tangent change xform per revoln */
+             gleDouble startTheta,	/* start angle in x-y plane */
+             gleDouble sweepTheta);	/* degrees to spiral around */
+
+/* lathe moves contour along helical path by helically shearing 3D space */
+extern void gleLathe (int ncp,        /* number of contour points */
+             gleDouble contour[][2],    /* 2D contour */
+             gleDouble cont_normal[][2], /* 2D contour normals */
+             gleDouble up[3],           /* up vector for contour */
+             gleDouble startRadius,	/* spiral starts in x-y plane */
+             gleDouble drdTheta,        /* change in radius per revolution */
+             gleDouble startZ,		/* starting z value */
+             gleDouble dzdTheta,        /* change in Z per revolution */
+             gleDouble startXform[2][3], /* starting contour affine xform */
+             gleDouble dXformdTheta[2][3], /* tangent change xform per revoln */
+             gleDouble startTheta,	/* start angle in x-y plane */
+             gleDouble sweepTheta);	/* degrees to spiral around */
+
+/* similar to spiral, except contour is a circle */
+extern void gleHelicoid (gleDouble rToroid, /* circle contour (torus) radius */
+             gleDouble startRadius,	/* spiral starts in x-y plane */
+             gleDouble drdTheta,        /* change in radius per revolution */
+             gleDouble startZ,		/* starting z value */
+             gleDouble dzdTheta,        /* change in Z per revolution */
+             gleDouble startXform[2][3], /* starting contour affine xform */
+             gleDouble dXformdTheta[2][3], /* tangent change xform per revoln */
+             gleDouble startTheta,	/* start angle in x-y plane */
+             gleDouble sweepTheta);	/* degrees to spiral around */
+
+/* similar to lathe, except contour is a circle */
+extern void gleToroid (gleDouble rToroid, /* circle contour (torus) radius */
+             gleDouble startRadius,	/* spiral starts in x-y plane */
+             gleDouble drdTheta,        /* change in radius per revolution */
+             gleDouble startZ,		/* starting z value */
+             gleDouble dzdTheta,        /* change in Z per revolution */
+             gleDouble startXform[2][3], /* starting contour affine xform */
+             gleDouble dXformdTheta[2][3], /* tangent change xform per revoln */
+             gleDouble startTheta,	/* start angle in x-y plane */
+             gleDouble sweepTheta);	/* degrees to spiral around */
+
+/* draws a screw shape */
+extern void gleScrew (int ncp,          /* number of contour points */
+             gleDouble contour[][2],    /* 2D contour */
+             gleDouble cont_normal[][2], /* 2D contour normals */
+             gleDouble up[3],           /* up vector for contour */
+             gleDouble startz,          /* start of segment */
+             gleDouble endz,            /* end of segment */
+             gleDouble twist);          /* number of rotations */
+
+extern void gleTextureMode (int mode);
+
+#ifdef __cplusplus
+}
+
+#endif
+#endif /* __TUBE_H__ */
+/* ================== END OF FILE ======================= */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Headers/tube_gc.h	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,78 @@
+
+/*
+ * tube_gc.h
+ *
+ * FUNCTION:
+ * This file allows for easy changes to changes in the way the extrusion
+ * library handles state info (i.e. context).
+ *
+ * HISTORY:
+ * Linas Vepstas --- February 1993
+ * Added auto texture coord generation hacks, Linas April 1994
+ * Added tube.h include to define gleDouble, tad February 2002
+ */
+
+#include "tube.h"
+#include "port.h" /* for gleVector */
+
+typedef float gleColor[3];
+typedef double gleTwoVec[2];
+
+typedef struct {
+
+   /* public methods */
+   void (*bgn_gen_texture) (int, double);
+   void (*n3f_gen_texture) (float *);
+   void (*n3d_gen_texture) (double *);
+   void (*v3f_gen_texture) (float *, int, int);
+   void (*v3d_gen_texture) (double *, int, int);
+   void (*end_gen_texture) (void);
+
+   /* protected members -- "general knowledge" stuff */
+   int join_style;
+
+   /* arguments passed into extrusion code */ 
+   int ncp;     /* number of contour points */
+   gleTwoVec *contour;    /* 2D contour */
+   gleTwoVec *cont_normal;  /* 2D contour normals */
+   gleDouble *up;               /* up vector */
+   int npoints;  /* number of points in polyline */
+   gleVector *point_array;     /* path */
+   gleColor *color_array;         /* path colors */
+   gleAffine *xform_array;  /* contour xforms */
+
+   /* private members, used by texturing code */
+   int num_vert;
+   int segment_number;
+   double segment_length;
+   double accum_seg_len;
+   double prev_x;
+   double prev_y;
+
+   void (*save_bgn_gen_texture) (int, double);
+   void (*save_n3f_gen_texture) (float *);
+   void (*save_n3d_gen_texture) (double *);
+   void (*save_v3f_gen_texture) (float *, int, int);
+   void (*save_v3d_gen_texture) (double *, int, int);
+   void (*save_end_gen_texture) (void);
+
+} gleGC;
+
+extern gleGC *_gle_gc;
+extern gleGC * gleCreateGC (void);
+
+#define INIT_GC() {if (!_gle_gc) _gle_gc = gleCreateGC(); }
+#define extrusion_join_style (_gle_gc->join_style)
+
+#define __TUBE_CLOSE_CONTOUR (extrusion_join_style & TUBE_CONTOUR_CLOSED)
+#define __TUBE_DRAW_CAP (extrusion_join_style & TUBE_JN_CAP)
+#define __TUBE_DRAW_FACET_NORMALS (extrusion_join_style & TUBE_NORM_FACET)
+#define __TUBE_DRAW_PATH_EDGE_NORMALS (extrusion_join_style & TUBE_NORM_PATH_EDGE)
+
+#define __TUBE_STYLE (extrusion_join_style & TUBE_JN_MASK)
+#define __TUBE_RAW_JOIN (extrusion_join_style & TUBE_JN_RAW)
+#define __TUBE_CUT_JOIN (extrusion_join_style & TUBE_JN_CUT)
+#define __TUBE_ANGLE_JOIN (extrusion_join_style & TUBE_JN_ANGLE)
+#define __TUBE_ROUND_JOIN (extrusion_join_style & TUBE_JN_ROUND)
+
+/* ======================= END OF FILE ========================== */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Headers/vvector.h	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,1339 @@
+
+/*
+ * vvector.h
+ *
+ * FUNCTION:
+ * This file contains a number of utilities useful for handling
+ * 3D vectors
+ * 
+ * HISTORY:
+ * Written by Linas Vepstas, August 1991
+ * Added 2D code, March 1993
+ * Added Outer products, C++ proofed, Linas Vepstas October 1993
+ */
+
+#ifndef __GUTIL_VECTOR_H__
+#define __GUTIL_VECTOR_H__
+
+#if defined(__cplusplus) || defined(c_plusplus)
+extern "C" {
+#endif
+
+
+#include <math.h>
+#include "port.h"
+
+/* ========================================================== */
+/* Zero out a 2D vector */
+
+#define VEC_ZERO_2(a)				\
+{						\
+   (a)[0] = (a)[1] = 0.0;			\
+}
+
+/* ========================================================== */
+/* Zero out a 3D vector */
+
+#define VEC_ZERO(a)				\
+{						\
+   (a)[0] = (a)[1] = (a)[2] = 0.0;		\
+}
+
+/* ========================================================== */
+/* Zero out a 4D vector */
+
+#define VEC_ZERO_4(a)				\
+{						\
+   (a)[0] = (a)[1] = (a)[2] = (a)[3] = 0.0;	\
+}
+
+/* ========================================================== */
+/* Vector copy */
+
+#define VEC_COPY_2(b,a)				\
+{						\
+   (b)[0] = (a)[0];				\
+   (b)[1] = (a)[1];				\
+}
+
+/* ========================================================== */
+/* Copy 3D vector */
+
+#define VEC_COPY(b,a)				\
+{						\
+   (b)[0] = (a)[0];				\
+   (b)[1] = (a)[1];				\
+   (b)[2] = (a)[2];				\
+}
+
+/* ========================================================== */
+/* Copy 4D vector */
+
+#define VEC_COPY_4(b,a)				\
+{						\
+   (b)[0] = (a)[0];				\
+   (b)[1] = (a)[1];				\
+   (b)[2] = (a)[2];				\
+   (b)[3] = (a)[3];				\
+}
+
+/* ========================================================== */
+/* Vector difference */
+
+#define VEC_DIFF_2(v21,v2,v1)			\
+{						\
+   (v21)[0] = (v2)[0] - (v1)[0];		\
+   (v21)[1] = (v2)[1] - (v1)[1];		\
+}
+
+/* ========================================================== */
+/* Vector difference */
+
+#define VEC_DIFF(v21,v2,v1)			\
+{						\
+   (v21)[0] = (v2)[0] - (v1)[0];		\
+   (v21)[1] = (v2)[1] - (v1)[1];		\
+   (v21)[2] = (v2)[2] - (v1)[2];		\
+}
+
+/* ========================================================== */
+/* Vector difference */
+
+#define VEC_DIFF_4(v21,v2,v1)			\
+{						\
+   (v21)[0] = (v2)[0] - (v1)[0];		\
+   (v21)[1] = (v2)[1] - (v1)[1];		\
+   (v21)[2] = (v2)[2] - (v1)[2];		\
+   (v21)[3] = (v2)[3] - (v1)[3];		\
+}
+
+/* ========================================================== */
+/* Vector sum */
+
+#define VEC_SUM_2(v21,v2,v1)			\
+{						\
+   (v21)[0] = (v2)[0] + (v1)[0];		\
+   (v21)[1] = (v2)[1] + (v1)[1];		\
+}
+
+/* ========================================================== */
+/* Vector sum */
+
+#define VEC_SUM(v21,v2,v1)			\
+{						\
+   (v21)[0] = (v2)[0] + (v1)[0];		\
+   (v21)[1] = (v2)[1] + (v1)[1];		\
+   (v21)[2] = (v2)[2] + (v1)[2];		\
+}
+
+/* ========================================================== */
+/* Vector sum */
+
+#define VEC_SUM_4(v21,v2,v1)			\
+{						\
+   (v21)[0] = (v2)[0] + (v1)[0];		\
+   (v21)[1] = (v2)[1] + (v1)[1];		\
+   (v21)[2] = (v2)[2] + (v1)[2];		\
+   (v21)[3] = (v2)[3] + (v1)[3];		\
+}
+
+/* ========================================================== */
+/* scalar times vector */
+
+#define VEC_SCALE_2(c,a,b)			\
+{						\
+   (c)[0] = (a)*(b)[0];				\
+   (c)[1] = (a)*(b)[1];				\
+}
+
+/* ========================================================== */
+/* scalar times vector */
+
+#define VEC_SCALE(c,a,b)			\
+{						\
+   (c)[0] = (a)*(b)[0];				\
+   (c)[1] = (a)*(b)[1];				\
+   (c)[2] = (a)*(b)[2];				\
+}
+
+/* ========================================================== */
+/* scalar times vector */
+
+#define VEC_SCALE_4(c,a,b)			\
+{						\
+   (c)[0] = (a)*(b)[0];				\
+   (c)[1] = (a)*(b)[1];				\
+   (c)[2] = (a)*(b)[2];				\
+   (c)[3] = (a)*(b)[3];				\
+}
+
+/* ========================================================== */
+/* accumulate scaled vector */
+
+#define VEC_ACCUM_2(c,a,b)			\
+{						\
+   (c)[0] += (a)*(b)[0];			\
+   (c)[1] += (a)*(b)[1];			\
+}
+
+/* ========================================================== */
+/* accumulate scaled vector */
+
+#define VEC_ACCUM(c,a,b)			\
+{						\
+   (c)[0] += (a)*(b)[0];			\
+   (c)[1] += (a)*(b)[1];			\
+   (c)[2] += (a)*(b)[2];			\
+}
+
+/* ========================================================== */
+/* accumulate scaled vector */
+
+#define VEC_ACCUM_4(c,a,b)			\
+{						\
+   (c)[0] += (a)*(b)[0];			\
+   (c)[1] += (a)*(b)[1];			\
+   (c)[2] += (a)*(b)[2];			\
+   (c)[3] += (a)*(b)[3];			\
+}
+
+/* ========================================================== */
+/* Vector dot product */
+
+#define VEC_DOT_PRODUCT_2(c,a,b)			\
+{							\
+   c = (a)[0]*(b)[0] + (a)[1]*(b)[1];			\
+}
+
+/* ========================================================== */
+/* Vector dot product */
+
+#define VEC_DOT_PRODUCT(c,a,b)				\
+{							\
+   c = (a)[0]*(b)[0] + (a)[1]*(b)[1] + (a)[2]*(b)[2];	\
+}
+
+/* ========================================================== */
+/* Vector dot product */
+
+#define VEC_DOT_PRODUCT_4(c,a,b)			\
+{							\
+   c = (a)[0]*(b)[0] + (a)[1]*(b)[1] + (a)[2]*(b)[2] + (a)[3]*(b)[3] ;	\
+}
+
+/* ========================================================== */
+/* vector impact parameter (squared) */
+
+#define VEC_IMPACT_SQ(bsq,direction,position)		\
+{							\
+   gleDouble vlen, llel;					\
+   VEC_DOT_PRODUCT (vlen, position, position);		\
+   VEC_DOT_PRODUCT (llel, direction, position);		\
+   bsq = vlen - llel*llel;				\
+}
+
+/* ========================================================== */
+/* vector impact parameter */
+
+#define VEC_IMPACT(bsq,direction,position)		\
+{							\
+   VEC_IMPACT_SQ(bsq,direction,position);		\
+   bsq = sqrt (bsq);					\
+}
+
+/* ========================================================== */
+/* Vector length */
+
+#define VEC_LENGTH_2(vlen,a)			\
+{						\
+   vlen = a[0]*a[0] + a[1]*a[1];			\
+   vlen = sqrt (vlen);				\
+}
+
+/* ========================================================== */
+/* Vector length */
+
+#define VEC_LENGTH(vlen,a)			\
+{						\
+   vlen = (a)[0]*(a)[0] + (a)[1]*(a)[1];		\
+   vlen += (a)[2]*(a)[2];			\
+   vlen = sqrt (vlen);				\
+}
+
+/* ========================================================== */
+/* Vector length */
+
+#define VEC_LENGTH_4(vlen,a)			\
+{						\
+   vlen = (a)[0]*(a)[0] + (a)[1]*(a)[1];		\
+   vlen += (a)[2]*(a)[2];			\
+   vlen += (a)[3] * (a)[3];			\
+   vlen = sqrt (vlen);				\
+}
+
+/* ========================================================== */
+/* distance between two points */
+
+#define VEC_DISTANCE(vlen,va,vb)			\
+{						\
+    gleDouble tmp[4];				\
+    VEC_DIFF (tmp, vb, va);			\
+    VEC_LENGTH (vlen, tmp);			\
+}
+
+/* ========================================================== */
+/* Vector length */
+
+#define VEC_CONJUGATE_LENGTH(vlen,a)		\
+{						\
+   vlen = 1.0 - a[0]*a[0] - a[1]*a[1] - a[2]*a[2];\
+   vlen = sqrt (vlen);				\
+}
+
+/* ========================================================== */
+/* Vector length */
+
+#define VEC_NORMALIZE(a)			\
+{						\
+   double vlen;					\
+   VEC_LENGTH (vlen,a);				\
+   if (vlen != 0.0) {				\
+      vlen = 1.0 / vlen;				\
+      a[0] *= vlen;				\
+      a[1] *= vlen;				\
+      a[2] *= vlen;				\
+   }						\
+}
+
+/* ========================================================== */
+/* Vector length */
+
+#define VEC_RENORMALIZE(a,newlen)		\
+{						\
+   double vlen;					\
+   VEC_LENGTH (vlen,a);				\
+   if (vlen != 0.0) {				\
+      vlen = newlen / vlen;				\
+      a[0] *= vlen;				\
+      a[1] *= vlen;				\
+      a[2] *= vlen;				\
+   }						\
+}
+
+/* ========================================================== */
+/* 3D Vector cross product yeilding vector */
+
+#define VEC_CROSS_PRODUCT(c,a,b)		\
+{						\
+   c[0] = (a)[1] * (b)[2] - (a)[2] * (b)[1];	\
+   c[1] = (a)[2] * (b)[0] - (a)[0] * (b)[2];	\
+   c[2] = (a)[0] * (b)[1] - (a)[1] * (b)[0];	\
+}
+
+/* ========================================================== */
+/* Vector perp -- assumes that n is of unit length 
+ * accepts vector v, subtracts out any component parallel to n */
+
+#define VEC_PERP(vp,v,n)			\
+{						\
+   double vdot;					\
+						\
+   VEC_DOT_PRODUCT (vdot, v, n);			\
+   vp[0] = (v)[0] - (vdot) * (n)[0];		\
+   vp[1] = (v)[1] - (vdot) * (n)[1];		\
+   vp[2] = (v)[2] - (vdot) * (n)[2];		\
+}
+
+/* ========================================================== */
+/* Vector parallel -- assumes that n is of unit length 
+ * accepts vector v, subtracts out any component perpendicular to n */
+
+#define VEC_PARALLEL(vp,v,n)			\
+{						\
+   double vdot;					\
+						\
+   VEC_DOT_PRODUCT (vdot, v, n);			\
+   vp[0] = (vdot) * (n)[0];			\
+   vp[1] = (vdot) * (n)[1];			\
+   vp[2] = (vdot) * (n)[2];			\
+}
+
+/* ========================================================== */
+/* Vector reflection -- assumes n is of unit length */
+/* Takes vector v, reflects it against reflector n, and returns vr */
+
+#define VEC_REFLECT(vr,v,n)			\
+{						\
+   double vdot;					\
+						\
+   VEC_DOT_PRODUCT (vdot, v, n);			\
+   vr[0] = (v)[0] - 2.0 * (vdot) * (n)[0];	\
+   vr[1] = (v)[1] - 2.0 * (vdot) * (n)[1];	\
+   vr[2] = (v)[2] - 2.0 * (vdot) * (n)[2];	\
+}
+
+/* ========================================================== */
+/* Vector blending */
+/* Takes two vectors a, b, blends them together */ 
+
+#define VEC_BLEND(vr,sa,a,sb,b)			\
+{						\
+						\
+   vr[0] = (sa) * (a)[0] + (sb) * (b)[0];	\
+   vr[1] = (sa) * (a)[1] + (sb) * (b)[1];	\
+   vr[2] = (sa) * (a)[2] + (sb) * (b)[2];	\
+}
+
+/* ========================================================== */
+/* Vector print */
+
+#define VEC_PRINT_2(a)					\
+{							\
+   double vlen;						\
+   VEC_LENGTH_2 (vlen, a);					\
+   printf (" a is %f %f length of a is %f \n", a[0], a[1], vlen); \
+}
+
+/* ========================================================== */
+/* Vector print */
+
+#define VEC_PRINT(a)					\
+{							\
+   double vlen;						\
+   VEC_LENGTH (vlen, (a));				\
+   printf (" a is %f %f %f length of a is %f \n", (a)[0], (a)[1], (a)[2], vlen); \
+}
+
+/* ========================================================== */
+/* Vector print */
+
+#define VEC_PRINT_4(a)					\
+{							\
+   double vlen;						\
+   VEC_LENGTH_4 (vlen, (a));				\
+   printf (" a is %f %f %f %f length of a is %f \n",	\
+       (a)[0], (a)[1], (a)[2], (a)[3], vlen);		\
+}
+
+/* ========================================================== */
+/* print matrix */
+
+#define MAT_PRINT_4X4(mmm) {				\
+   int i,j;						\
+   printf ("matrix mmm is \n");				\
+   if (mmm == NULL) {					\
+      printf (" Null \n");				\
+   } else {						\
+      for (i=0; i<4; i++) {				\
+         for (j=0; j<4; j++) {				\
+            printf ("%f ", mmm[i][j]);			\
+         }						\
+         printf (" \n");				\
+      }							\
+   }							\
+}
+
+/* ========================================================== */
+/* print matrix */
+
+#define MAT_PRINT_3X3(mmm) {				\
+   int i,j;						\
+   printf ("matrix mmm is \n");				\
+   if (mmm == NULL) {					\
+      printf (" Null \n");				\
+   } else {						\
+      for (i=0; i<3; i++) {				\
+         for (j=0; j<3; j++) {				\
+            printf ("%f ", mmm[i][j]);			\
+         }						\
+         printf (" \n");				\
+      }							\
+   }							\
+}
+
+/* ========================================================== */
+/* print matrix */
+
+#define MAT_PRINT_2X3(mmm) {				\
+   int i,j;						\
+   printf ("matrix mmm is \n");				\
+   if (mmm == NULL) {					\
+      printf (" Null \n");				\
+   } else {						\
+      for (i=0; i<2; i++) {				\
+         for (j=0; j<3; j++) {				\
+            printf ("%f ", mmm[i][j]);			\
+         }						\
+         printf (" \n");				\
+      }							\
+   }							\
+}
+
+/* ========================================================== */
+/* initialize matrix */
+
+#define IDENTIFY_MATRIX_3X3(m)			\
+{						\
+   m[0][0] = 1.0;				\
+   m[0][1] = 0.0;				\
+   m[0][2] = 0.0;				\
+						\
+   m[1][0] = 0.0;				\
+   m[1][1] = 1.0;				\
+   m[1][2] = 0.0;				\
+						\
+   m[2][0] = 0.0;				\
+   m[2][1] = 0.0;				\
+   m[2][2] = 1.0;				\
+}
+
+/* ========================================================== */
+/* initialize matrix */
+
+#define IDENTIFY_MATRIX_4X4(m)			\
+{						\
+   m[0][0] = 1.0;				\
+   m[0][1] = 0.0;				\
+   m[0][2] = 0.0;				\
+   m[0][3] = 0.0;				\
+						\
+   m[1][0] = 0.0;				\
+   m[1][1] = 1.0;				\
+   m[1][2] = 0.0;				\
+   m[1][3] = 0.0;				\
+						\
+   m[2][0] = 0.0;				\
+   m[2][1] = 0.0;				\
+   m[2][2] = 1.0;				\
+   m[2][3] = 0.0;				\
+						\
+   m[3][0] = 0.0;				\
+   m[3][1] = 0.0;				\
+   m[3][2] = 0.0;				\
+   m[3][3] = 1.0;				\
+}
+
+/* ========================================================== */
+/* matrix copy */
+
+#define COPY_MATRIX_2X2(b,a)	\
+{				\
+   b[0][0] = a[0][0];		\
+   b[0][1] = a[0][1];		\
+				\
+   b[1][0] = a[1][0];		\
+   b[1][1] = a[1][1];		\
+				\
+}
+
+/* ========================================================== */
+/* matrix copy */
+
+#define COPY_MATRIX_2X3(b,a)	\
+{				\
+   b[0][0] = a[0][0];		\
+   b[0][1] = a[0][1];		\
+   b[0][2] = a[0][2];		\
+				\
+   b[1][0] = a[1][0];		\
+   b[1][1] = a[1][1];		\
+   b[1][2] = a[1][2];		\
+}
+
+/* ========================================================== */
+/* matrix copy */
+
+#define COPY_MATRIX_3X3(b,a)	\
+{				\
+   b[0][0] = a[0][0];		\
+   b[0][1] = a[0][1];		\
+   b[0][2] = a[0][2];		\
+				\
+   b[1][0] = a[1][0];		\
+   b[1][1] = a[1][1];		\
+   b[1][2] = a[1][2];		\
+				\
+   b[2][0] = a[2][0];		\
+   b[2][1] = a[2][1];		\
+   b[2][2] = a[2][2];		\
+}
+
+/* ========================================================== */
+/* matrix copy */
+
+#define COPY_MATRIX_4X4(b,a)	\
+{				\
+   b[0][0] = a[0][0];		\
+   b[0][1] = a[0][1];		\
+   b[0][2] = a[0][2];		\
+   b[0][3] = a[0][3];		\
+				\
+   b[1][0] = a[1][0];		\
+   b[1][1] = a[1][1];		\
+   b[1][2] = a[1][2];		\
+   b[1][3] = a[1][3];		\
+				\
+   b[2][0] = a[2][0];		\
+   b[2][1] = a[2][1];		\
+   b[2][2] = a[2][2];		\
+   b[2][3] = a[2][3];		\
+				\
+   b[3][0] = a[3][0];		\
+   b[3][1] = a[3][1];		\
+   b[3][2] = a[3][2];		\
+   b[3][3] = a[3][3];		\
+}
+
+/* ========================================================== */
+/* matrix transpose */
+
+#define TRANSPOSE_MATRIX_2X2(b,a)	\
+{				\
+   b[0][0] = a[0][0];		\
+   b[0][1] = a[1][0];		\
+				\
+   b[1][0] = a[0][1];		\
+   b[1][1] = a[1][1];		\
+}
+
+/* ========================================================== */
+/* matrix transpose */
+
+#define TRANSPOSE_MATRIX_3X3(b,a)	\
+{				\
+   b[0][0] = a[0][0];		\
+   b[0][1] = a[1][0];		\
+   b[0][2] = a[2][0];		\
+				\
+   b[1][0] = a[0][1];		\
+   b[1][1] = a[1][1];		\
+   b[1][2] = a[2][1];		\
+				\
+   b[2][0] = a[0][2];		\
+   b[2][1] = a[1][2];		\
+   b[2][2] = a[2][2];		\
+}
+
+/* ========================================================== */
+/* matrix transpose */
+
+#define TRANSPOSE_MATRIX_4X4(b,a)	\
+{				\
+   b[0][0] = a[0][0];		\
+   b[0][1] = a[1][0];		\
+   b[0][2] = a[2][0];		\
+   b[0][3] = a[3][0];		\
+				\
+   b[1][0] = a[0][1];		\
+   b[1][1] = a[1][1];		\
+   b[1][2] = a[2][1];		\
+   b[1][3] = a[3][1];		\
+				\
+   b[2][0] = a[0][2];		\
+   b[2][1] = a[1][2];		\
+   b[2][2] = a[2][2];		\
+   b[2][3] = a[3][2];		\
+				\
+   b[3][0] = a[0][3];		\
+   b[3][1] = a[1][3];		\
+   b[3][2] = a[2][3];		\
+   b[3][3] = a[3][3];		\
+}
+
+/* ========================================================== */
+/* multiply matrix by scalar */
+
+#define SCALE_MATRIX_2X2(b,s,a)		\
+{					\
+   b[0][0] = (s) * a[0][0];		\
+   b[0][1] = (s) * a[0][1];		\
+					\
+   b[1][0] = (s) * a[1][0];		\
+   b[1][1] = (s) * a[1][1];		\
+}
+
+/* ========================================================== */
+/* multiply matrix by scalar */
+
+#define SCALE_MATRIX_3X3(b,s,a)		\
+{					\
+   b[0][0] = (s) * a[0][0];		\
+   b[0][1] = (s) * a[0][1];		\
+   b[0][2] = (s) * a[0][2];		\
+					\
+   b[1][0] = (s) * a[1][0];		\
+   b[1][1] = (s) * a[1][1];		\
+   b[1][2] = (s) * a[1][2];		\
+					\
+   b[2][0] = (s) * a[2][0];		\
+   b[2][1] = (s) * a[2][1];		\
+   b[2][2] = (s) * a[2][2];		\
+}
+
+/* ========================================================== */
+/* multiply matrix by scalar */
+
+#define SCALE_MATRIX_4X4(b,s,a)		\
+{					\
+   b[0][0] = (s) * a[0][0];		\
+   b[0][1] = (s) * a[0][1];		\
+   b[0][2] = (s) * a[0][2];		\
+   b[0][3] = (s) * a[0][3];		\
+					\
+   b[1][0] = (s) * a[1][0];		\
+   b[1][1] = (s) * a[1][1];		\
+   b[1][2] = (s) * a[1][2];		\
+   b[1][3] = (s) * a[1][3];		\
+					\
+   b[2][0] = (s) * a[2][0];		\
+   b[2][1] = (s) * a[2][1];		\
+   b[2][2] = (s) * a[2][2];		\
+   b[2][3] = (s) * a[2][3];		\
+					\
+   b[3][0] = s * a[3][0];		\
+   b[3][1] = s * a[3][1];		\
+   b[3][2] = s * a[3][2];		\
+   b[3][3] = s * a[3][3];		\
+}
+
+/* ========================================================== */
+/* multiply matrix by scalar */
+
+#define ACCUM_SCALE_MATRIX_2X2(b,s,a)		\
+{					\
+   b[0][0] += (s) * a[0][0];		\
+   b[0][1] += (s) * a[0][1];		\
+					\
+   b[1][0] += (s) * a[1][0];		\
+   b[1][1] += (s) * a[1][1];		\
+}
+
+/* +========================================================== */
+/* multiply matrix by scalar */
+
+#define ACCUM_SCALE_MATRIX_3X3(b,s,a)		\
+{					\
+   b[0][0] += (s) * a[0][0];		\
+   b[0][1] += (s) * a[0][1];		\
+   b[0][2] += (s) * a[0][2];		\
+					\
+   b[1][0] += (s) * a[1][0];		\
+   b[1][1] += (s) * a[1][1];		\
+   b[1][2] += (s) * a[1][2];		\
+					\
+   b[2][0] += (s) * a[2][0];		\
+   b[2][1] += (s) * a[2][1];		\
+   b[2][2] += (s) * a[2][2];		\
+}
+
+/* +========================================================== */
+/* multiply matrix by scalar */
+
+#define ACCUM_SCALE_MATRIX_4X4(b,s,a)		\
+{					\
+   b[0][0] += (s) * a[0][0];		\
+   b[0][1] += (s) * a[0][1];		\
+   b[0][2] += (s) * a[0][2];		\
+   b[0][3] += (s) * a[0][3];		\
+					\
+   b[1][0] += (s) * a[1][0];		\
+   b[1][1] += (s) * a[1][1];		\
+   b[1][2] += (s) * a[1][2];		\
+   b[1][3] += (s) * a[1][3];		\
+					\
+   b[2][0] += (s) * a[2][0];		\
+   b[2][1] += (s) * a[2][1];		\
+   b[2][2] += (s) * a[2][2];		\
+   b[2][3] += (s) * a[2][3];		\
+					\
+   b[3][0] += (s) * a[3][0];		\
+   b[3][1] += (s) * a[3][1];		\
+   b[3][2] += (s) * a[3][2];		\
+   b[3][3] += (s) * a[3][3];		\
+}
+
+/* +========================================================== */
+/* matrix product */
+/* c[x][y] = a[x][0]*b[0][y]+a[x][1]*b[1][y]+a[x][2]*b[2][y]+a[x][3]*b[3][y];*/
+
+#define MATRIX_PRODUCT_2X2(c,a,b)		\
+{						\
+   c[0][0] = a[0][0]*b[0][0]+a[0][1]*b[1][0];	\
+   c[0][1] = a[0][0]*b[0][1]+a[0][1]*b[1][1];	\
+						\
+   c[1][0] = a[1][0]*b[0][0]+a[1][1]*b[1][0];	\
+   c[1][1] = a[1][0]*b[0][1]+a[1][1]*b[1][1];	\
+						\
+}
+
+/* ========================================================== */
+/* matrix product */
+/* c[x][y] = a[x][0]*b[0][y]+a[x][1]*b[1][y]+a[x][2]*b[2][y]+a[x][3]*b[3][y];*/
+
+#define MATRIX_PRODUCT_3X3(c,a,b)				\
+{								\
+   c[0][0] = a[0][0]*b[0][0]+a[0][1]*b[1][0]+a[0][2]*b[2][0];	\
+   c[0][1] = a[0][0]*b[0][1]+a[0][1]*b[1][1]+a[0][2]*b[2][1];	\
+   c[0][2] = a[0][0]*b[0][2]+a[0][1]*b[1][2]+a[0][2]*b[2][2];	\
+								\
+   c[1][0] = a[1][0]*b[0][0]+a[1][1]*b[1][0]+a[1][2]*b[2][0];	\
+   c[1][1] = a[1][0]*b[0][1]+a[1][1]*b[1][1]+a[1][2]*b[2][1];	\
+   c[1][2] = a[1][0]*b[0][2]+a[1][1]*b[1][2]+a[1][2]*b[2][2];	\
+								\
+   c[2][0] = a[2][0]*b[0][0]+a[2][1]*b[1][0]+a[2][2]*b[2][0];	\
+   c[2][1] = a[2][0]*b[0][1]+a[2][1]*b[1][1]+a[2][2]*b[2][1];	\
+   c[2][2] = a[2][0]*b[0][2]+a[2][1]*b[1][2]+a[2][2]*b[2][2];	\
+}
+
+/* ========================================================== */
+/* matrix product */
+/* c[x][y] = a[x][0]*b[0][y]+a[x][1]*b[1][y]+a[x][2]*b[2][y]+a[x][3]*b[3][y];*/
+
+#define MATRIX_PRODUCT_4X4(c,a,b)		\
+{						\
+   c[0][0] = a[0][0]*b[0][0]+a[0][1]*b[1][0]+a[0][2]*b[2][0]+a[0][3]*b[3][0];\
+   c[0][1] = a[0][0]*b[0][1]+a[0][1]*b[1][1]+a[0][2]*b[2][1]+a[0][3]*b[3][1];\
+   c[0][2] = a[0][0]*b[0][2]+a[0][1]*b[1][2]+a[0][2]*b[2][2]+a[0][3]*b[3][2];\
+   c[0][3] = a[0][0]*b[0][3]+a[0][1]*b[1][3]+a[0][2]*b[2][3]+a[0][3]*b[3][3];\
+						\
+   c[1][0] = a[1][0]*b[0][0]+a[1][1]*b[1][0]+a[1][2]*b[2][0]+a[1][3]*b[3][0];\
+   c[1][1] = a[1][0]*b[0][1]+a[1][1]*b[1][1]+a[1][2]*b[2][1]+a[1][3]*b[3][1];\
+   c[1][2] = a[1][0]*b[0][2]+a[1][1]*b[1][2]+a[1][2]*b[2][2]+a[1][3]*b[3][2];\
+   c[1][3] = a[1][0]*b[0][3]+a[1][1]*b[1][3]+a[1][2]*b[2][3]+a[1][3]*b[3][3];\
+						\
+   c[2][0] = a[2][0]*b[0][0]+a[2][1]*b[1][0]+a[2][2]*b[2][0]+a[2][3]*b[3][0];\
+   c[2][1] = a[2][0]*b[0][1]+a[2][1]*b[1][1]+a[2][2]*b[2][1]+a[2][3]*b[3][1];\
+   c[2][2] = a[2][0]*b[0][2]+a[2][1]*b[1][2]+a[2][2]*b[2][2]+a[2][3]*b[3][2];\
+   c[2][3] = a[2][0]*b[0][3]+a[2][1]*b[1][3]+a[2][2]*b[2][3]+a[2][3]*b[3][3];\
+						\
+   c[3][0] = a[3][0]*b[0][0]+a[3][1]*b[1][0]+a[3][2]*b[2][0]+a[3][3]*b[3][0];\
+   c[3][1] = a[3][0]*b[0][1]+a[3][1]*b[1][1]+a[3][2]*b[2][1]+a[3][3]*b[3][1];\
+   c[3][2] = a[3][0]*b[0][2]+a[3][1]*b[1][2]+a[3][2]*b[2][2]+a[3][3]*b[3][2];\
+   c[3][3] = a[3][0]*b[0][3]+a[3][1]*b[1][3]+a[3][2]*b[2][3]+a[3][3]*b[3][3];\
+}
+
+/* ========================================================== */
+/* matrix times vector */
+
+#define MAT_DOT_VEC_2X2(p,m,v)					\
+{								\
+   p[0] = m[0][0]*v[0] + m[0][1]*v[1];				\
+   p[1] = m[1][0]*v[0] + m[1][1]*v[1];				\
+}
+
+/* ========================================================== */
+/* matrix times vector */
+
+#define MAT_DOT_VEC_3X3(p,m,v)					\
+{								\
+   p[0] = m[0][0]*v[0] + m[0][1]*v[1] + m[0][2]*v[2];		\
+   p[1] = m[1][0]*v[0] + m[1][1]*v[1] + m[1][2]*v[2];		\
+   p[2] = m[2][0]*v[0] + m[2][1]*v[1] + m[2][2]*v[2];		\
+}
+
+/* ========================================================== */
+/* matrix times vector */
+
+#define MAT_DOT_VEC_4X4(p,m,v)					\
+{								\
+   p[0] = m[0][0]*v[0] + m[0][1]*v[1] + m[0][2]*v[2] + m[0][3]*v[3];	\
+   p[1] = m[1][0]*v[0] + m[1][1]*v[1] + m[1][2]*v[2] + m[1][3]*v[3];	\
+   p[2] = m[2][0]*v[0] + m[2][1]*v[1] + m[2][2]*v[2] + m[2][3]*v[3];	\
+   p[3] = m[3][0]*v[0] + m[3][1]*v[1] + m[3][2]*v[2] + m[3][3]*v[3];	\
+}
+
+/* ========================================================== */
+/* vector transpose times matrix */
+/* p[j] = v[0]*m[0][j] + v[1]*m[1][j] + v[2]*m[2][j]; */
+
+#define VEC_DOT_MAT_3X3(p,v,m)					\
+{								\
+   p[0] = v[0]*m[0][0] + v[1]*m[1][0] + v[2]*m[2][0];		\
+   p[1] = v[0]*m[0][1] + v[1]*m[1][1] + v[2]*m[2][1];		\
+   p[2] = v[0]*m[0][2] + v[1]*m[1][2] + v[2]*m[2][2];		\
+}
+
+/* ========================================================== */
+/* affine matrix times vector */
+/* The matrix is assumed to be an affine matrix, with last two 
+ * entries representing a translation */
+
+#define MAT_DOT_VEC_2X3(p,m,v)					\
+{								\
+   p[0] = m[0][0]*v[0] + m[0][1]*v[1] + m[0][2];		\
+   p[1] = m[1][0]*v[0] + m[1][1]*v[1] + m[1][2];		\
+}
+
+/* ========================================================== */
+/* inverse transpose of matrix times vector
+ *
+ * This macro computes inverse transpose of matrix m, 
+ * and multiplies vector v into it, to yeild vector p
+ *
+ * DANGER !!! Do Not use this on normal vectors!!!
+ * It will leave normals the wrong length !!!
+ * See macro below for use on normals.
+ */
+
+#define INV_TRANSP_MAT_DOT_VEC_2X2(p,m,v)			\
+{								\
+   gleDouble det;						\
+								\
+   det = m[0][0]*m[1][1] - m[0][1]*m[1][0];			\
+   p[0] = m[1][1]*v[0] - m[1][0]*v[1];				\
+   p[1] = - m[0][1]*v[0] + m[0][0]*v[1];			\
+								\
+   /* if matrix not singular, and not orthonormal, then renormalize */ \
+   if ((det!=1.0) && (det != 0.0)) {				\
+      det = 1.0 / det;						\
+      p[0] *= det;						\
+      p[1] *= det;						\
+   }								\
+}
+
+/* ========================================================== */
+/* transform normal vector by inverse transpose of matrix 
+ * and then renormalize the vector 
+ *
+ * This macro computes inverse transpose of matrix m, 
+ * and multiplies vector v into it, to yeild vector p
+ * Vector p is then normalized.
+ */
+
+
+#define NORM_XFORM_2X2(p,m,v)					\
+{								\
+   double mlen;							\
+								\
+   /* do nothing if off-diagonals are zero and diagonals are 	\
+    * equal */							\
+   if ((m[0][1] != 0.0) || (m[1][0] != 0.0) || (m[0][0] != m[1][1])) { \
+      p[0] = m[1][1]*v[0] - m[1][0]*v[1];			\
+      p[1] = - m[0][1]*v[0] + m[0][0]*v[1];			\
+								\
+      mlen = p[0]*p[0] + p[1]*p[1];				\
+      mlen = 1.0 / sqrt (mlen);					\
+      p[0] *= mlen;						\
+      p[1] *= mlen;						\
+   } else {							\
+      VEC_COPY_2 (p, v);					\
+   }								\
+}
+
+/* ========================================================== */
+/* outer product of vector times vector transpose 
+ *
+ * The outer product of vector v and vector transpose t yeilds 
+ * dyadic matrix m.
+ */
+
+#define OUTER_PRODUCT_2X2(m,v,t)				\
+{								\
+   m[0][0] = v[0] * t[0];					\
+   m[0][1] = v[0] * t[1];					\
+								\
+   m[1][0] = v[1] * t[0];					\
+   m[1][1] = v[1] * t[1];					\
+}
+
+/* ========================================================== */
+/* outer product of vector times vector transpose 
+ *
+ * The outer product of vector v and vector transpose t yeilds 
+ * dyadic matrix m.
+ */
+
+#define OUTER_PRODUCT_3X3(m,v,t)				\
+{								\
+   m[0][0] = v[0] * t[0];					\
+   m[0][1] = v[0] * t[1];					\
+   m[0][2] = v[0] * t[2];					\
+								\
+   m[1][0] = v[1] * t[0];					\
+   m[1][1] = v[1] * t[1];					\
+   m[1][2] = v[1] * t[2];					\
+								\
+   m[2][0] = v[2] * t[0];					\
+   m[2][1] = v[2] * t[1];					\
+   m[2][2] = v[2] * t[2];					\
+}
+
+/* ========================================================== */
+/* outer product of vector times vector transpose 
+ *
+ * The outer product of vector v and vector transpose t yeilds 
+ * dyadic matrix m.
+ */
+
+#define OUTER_PRODUCT_4X4(m,v,t)				\
+{								\
+   m[0][0] = v[0] * t[0];					\
+   m[0][1] = v[0] * t[1];					\
+   m[0][2] = v[0] * t[2];					\
+   m[0][3] = v[0] * t[3];					\
+								\
+   m[1][0] = v[1] * t[0];					\
+   m[1][1] = v[1] * t[1];					\
+   m[1][2] = v[1] * t[2];					\
+   m[1][3] = v[1] * t[3];					\
+								\
+   m[2][0] = v[2] * t[0];					\
+   m[2][1] = v[2] * t[1];					\
+   m[2][2] = v[2] * t[2];					\
+   m[2][3] = v[2] * t[3];					\
+								\
+   m[3][0] = v[3] * t[0];					\
+   m[3][1] = v[3] * t[1];					\
+   m[3][2] = v[3] * t[2];					\
+   m[3][3] = v[3] * t[3];					\
+}
+
+/* +========================================================== */
+/* outer product of vector times vector transpose 
+ *
+ * The outer product of vector v and vector transpose t yeilds 
+ * dyadic matrix m.
+ */
+
+#define ACCUM_OUTER_PRODUCT_2X2(m,v,t)				\
+{								\
+   m[0][0] += v[0] * t[0];					\
+   m[0][1] += v[0] * t[1];					\
+								\
+   m[1][0] += v[1] * t[0];					\
+   m[1][1] += v[1] * t[1];					\
+}
+
+/* +========================================================== */
+/* outer product of vector times vector transpose 
+ *
+ * The outer product of vector v and vector transpose t yeilds 
+ * dyadic matrix m.
+ */
+
+#define ACCUM_OUTER_PRODUCT_3X3(m,v,t)				\
+{								\
+   m[0][0] += v[0] * t[0];					\
+   m[0][1] += v[0] * t[1];					\
+   m[0][2] += v[0] * t[2];					\
+								\
+   m[1][0] += v[1] * t[0];					\
+   m[1][1] += v[1] * t[1];					\
+   m[1][2] += v[1] * t[2];					\
+								\
+   m[2][0] += v[2] * t[0];					\
+   m[2][1] += v[2] * t[1];					\
+   m[2][2] += v[2] * t[2];					\
+}
+
+/* +========================================================== */
+/* outer product of vector times vector transpose 
+ *
+ * The outer product of vector v and vector transpose t yeilds 
+ * dyadic matrix m.
+ */
+
+#define ACCUM_OUTER_PRODUCT_4X4(m,v,t)				\
+{								\
+   m[0][0] += v[0] * t[0];					\
+   m[0][1] += v[0] * t[1];					\
+   m[0][2] += v[0] * t[2];					\
+   m[0][3] += v[0] * t[3];					\
+								\
+   m[1][0] += v[1] * t[0];					\
+   m[1][1] += v[1] * t[1];					\
+   m[1][2] += v[1] * t[2];					\
+   m[1][3] += v[1] * t[3];					\
+								\
+   m[2][0] += v[2] * t[0];					\
+   m[2][1] += v[2] * t[1];					\
+   m[2][2] += v[2] * t[2];					\
+   m[2][3] += v[2] * t[3];					\
+								\
+   m[3][0] += v[3] * t[0];					\
+   m[3][1] += v[3] * t[1];					\
+   m[3][2] += v[3] * t[2];					\
+   m[3][3] += v[3] * t[3];					\
+}
+
+/* +========================================================== */
+/* determinant of matrix
+ *
+ * Computes determinant of matrix m, returning d
+ */
+
+#define DETERMINANT_2X2(d,m)					\
+{								\
+   d = m[0][0] * m[1][1] - m[0][1] * m[1][0];			\
+}
+
+/* ========================================================== */
+/* determinant of matrix
+ *
+ * Computes determinant of matrix m, returning d
+ */
+
+#define DETERMINANT_3X3(d,m)					\
+{								\
+   d = m[0][0] * (m[1][1]*m[2][2] - m[1][2] * m[2][1]);		\
+   d -= m[0][1] * (m[1][0]*m[2][2] - m[1][2] * m[2][0]);	\
+   d += m[0][2] * (m[1][0]*m[2][1] - m[1][1] * m[2][0]);	\
+}
+
+/* ========================================================== */
+/* i,j,th cofactor of a 4x4 matrix
+ *
+ */
+
+#define COFACTOR_4X4_IJ(fac,m,i,j) 				\
+{								\
+   int ii[4], jj[4], k;						\
+								\
+   /* compute which row, columnt to skip */			\
+   for (k=0; k<i; k++) ii[k] = k;				\
+   for (k=i; k<3; k++) ii[k] = k+1;				\
+   for (k=0; k<j; k++) jj[k] = k;				\
+   for (k=j; k<3; k++) jj[k] = k+1;				\
+								\
+   (fac) = m[ii[0]][jj[0]] * (m[ii[1]][jj[1]]*m[ii[2]][jj[2]] 	\
+                            - m[ii[1]][jj[2]]*m[ii[2]][jj[1]]); \
+   (fac) -= m[ii[0]][jj[1]] * (m[ii[1]][jj[0]]*m[ii[2]][jj[2]]	\
+                             - m[ii[1]][jj[2]]*m[ii[2]][jj[0]]);\
+   (fac) += m[ii[0]][jj[2]] * (m[ii[1]][jj[0]]*m[ii[2]][jj[1]]	\
+                             - m[ii[1]][jj[1]]*m[ii[2]][jj[0]]);\
+								\
+   /* compute sign */						\
+   k = i+j;							\
+   if ( k != (k/2)*2) {						\
+      (fac) = -(fac);						\
+   }								\
+}
+
+/* ========================================================== */
+/* determinant of matrix
+ *
+ * Computes determinant of matrix m, returning d
+ */
+
+#define DETERMINANT_4X4(d,m)					\
+{								\
+   double cofac;						\
+   COFACTOR_4X4_IJ (cofac, m, 0, 0);				\
+   d = m[0][0] * cofac;						\
+   COFACTOR_4X4_IJ (cofac, m, 0, 1);				\
+   d += m[0][1] * cofac;					\
+   COFACTOR_4X4_IJ (cofac, m, 0, 2);				\
+   d += m[0][2] * cofac;					\
+   COFACTOR_4X4_IJ (cofac, m, 0, 3);				\
+   d += m[0][3] * cofac;					\
+}
+
+/* ========================================================== */
+/* cofactor of matrix
+ *
+ * Computes cofactor of matrix m, returning a
+ */
+
+#define COFACTOR_2X2(a,m)					\
+{								\
+   a[0][0] = (m)[1][1];						\
+   a[0][1] = - (m)[1][0];						\
+   a[1][0] = - (m)[0][1];						\
+   a[1][1] = (m)[0][0];						\
+}
+
+/* ========================================================== */
+/* cofactor of matrix
+ *
+ * Computes cofactor of matrix m, returning a
+ */
+
+#define COFACTOR_3X3(a,m)					\
+{								\
+   a[0][0] = m[1][1]*m[2][2] - m[1][2]*m[2][1];			\
+   a[0][1] = - (m[1][0]*m[2][2] - m[2][0]*m[1][2]);		\
+   a[0][2] = m[1][0]*m[2][1] - m[1][1]*m[2][0];			\
+   a[1][0] = - (m[0][1]*m[2][2] - m[0][2]*m[2][1]);		\
+   a[1][1] = m[0][0]*m[2][2] - m[0][2]*m[2][0];			\
+   a[1][2] = - (m[0][0]*m[2][1] - m[0][1]*m[2][0]);		\
+   a[2][0] = m[0][1]*m[1][2] - m[0][2]*m[1][1];			\
+   a[2][1] = - (m[0][0]*m[1][2] - m[0][2]*m[1][0]);		\
+   a[2][2] = m[0][0]*m[1][1] - m[0][1]*m[1][0]);		\
+}
+
+/* ========================================================== */
+/* cofactor of matrix
+ *
+ * Computes cofactor of matrix m, returning a
+ */
+
+#define COFACTOR_4X4(a,m)					\
+{								\
+   int i,j;							\
+								\
+   for (i=0; i<4; i++) {					\
+      for (j=0; j<4; j++) {					\
+         COFACTOR_4X4_IJ (a[i][j], m, i, j);			\
+      }								\
+   }								\
+}
+
+/* ========================================================== */
+/* adjoint of matrix
+ *
+ * Computes adjoint of matrix m, returning a
+ * (Note that adjoint is just the transpose of the cofactor matrix)
+ */
+
+#define ADJOINT_2X2(a,m)					\
+{								\
+   a[0][0] = (m)[1][1];						\
+   a[1][0] = - (m)[1][0];						\
+   a[0][1] = - (m)[0][1];						\
+   a[1][1] = (m)[0][0];						\
+}
+
+/* ========================================================== */
+/* adjoint of matrix
+ *
+ * Computes adjoint of matrix m, returning a
+ * (Note that adjoint is just the transpose of the cofactor matrix)
+ */
+
+
+#define ADJOINT_3X3(a,m)					\
+{								\
+   a[0][0] = m[1][1]*m[2][2] - m[1][2]*m[2][1];			\
+   a[1][0] = - (m[1][0]*m[2][2] - m[2][0]*m[1][2]);		\
+   a[2][0] = m[1][0]*m[2][1] - m[1][1]*m[2][0];			\
+   a[0][1] = - (m[0][1]*m[2][2] - m[0][2]*m[2][1]);		\
+   a[1][1] = m[0][0]*m[2][2] - m[0][2]*m[2][0];			\
+   a[2][1] = - (m[0][0]*m[2][1] - m[0][1]*m[2][0]);		\
+   a[0][2] = m[0][1]*m[1][2] - m[0][2]*m[1][1];			\
+   a[1][2] = - (m[0][0]*m[1][2] - m[0][2]*m[1][0]);		\
+   a[2][2] = m[0][0]*m[1][1] - m[0][1]*m[1][0]);		\
+}
+
+/* ========================================================== */
+/* adjoint of matrix
+ *
+ * Computes adjoint of matrix m, returning a
+ * (Note that adjoint is just the transpose of the cofactor matrix)
+ */
+
+#define ADJOINT_4X4(a,m)					\
+{								\
+   int i,j;							\
+								\
+   for (i=0; i<4; i++) {					\
+      for (j=0; j<4; j++) {					\
+         COFACTOR_4X4_IJ (a[j][i], m, i, j);			\
+      }								\
+   }								\
+}
+
+/* ========================================================== */
+/* compute adjoint of matrix and scale
+ *
+ * Computes adjoint of matrix m, scales it by s, returning a
+ */
+
+#define SCALE_ADJOINT_2X2(a,s,m)				\
+{								\
+   a[0][0] = (s) * m[1][1];					\
+   a[1][0] = - (s) * m[1][0];					\
+   a[0][1] = - (s) * m[0][1];					\
+   a[1][1] = (s) * m[0][0];					\
+}
+
+/* ========================================================== */
+/* compute adjoint of matrix and scale
+ *
+ * Computes adjoint of matrix m, scales it by s, returning a
+ */
+
+#define SCALE_ADJOINT_3X3(a,s,m)				\
+{								\
+   a[0][0] = (s) * (m[1][1] * m[2][2] - m[1][2] * m[2][1]);	\
+   a[1][0] = (s) * (m[1][2] * m[2][0] - m[1][0] * m[2][2]);	\
+   a[2][0] = (s) * (m[1][0] * m[2][1] - m[1][1] * m[2][0]);	\
+								\
+   a[0][1] = (s) * (m[0][2] * m[2][1] - m[0][1] * m[2][2]);	\
+   a[1][1] = (s) * (m[0][0] * m[2][2] - m[0][2] * m[2][0]);	\
+   a[2][1] = (s) * (m[0][1] * m[2][0] - m[0][0] * m[2][1]);	\
+								\
+   a[0][2] = (s) * (m[0][1] * m[1][2] - m[0][2] * m[1][1]);	\
+   a[1][2] = (s) * (m[0][2] * m[1][0] - m[0][0] * m[1][2]);	\
+   a[2][2] = (s) * (m[0][0] * m[1][1] - m[0][1] * m[1][0]);	\
+}
+
+/* ========================================================== */
+/* compute adjoint of matrix and scale
+ *
+ * Computes adjoint of matrix m, scales it by s, returning a
+ */
+
+#define SCALE_ADJOINT_4X4(a,s,m)				\
+{								\
+   int i,j;							\
+								\
+   for (i=0; i<4; i++) {					\
+      for (j=0; j<4; j++) {					\
+         COFACTOR_4X4_IJ (a[j][i], m, i, j);			\
+         a[j][i] *= s;						\
+      }								\
+   }								\
+}
+
+/* ========================================================== */
+/* inverse of matrix 
+ *
+ * Compute inverse of matrix a, returning determinant m and 
+ * inverse b
+ */
+
+#define INVERT_2X2(b,det,a)			\
+{						\
+   double tmp;					\
+   DETERMINANT_2X2 (det, a);			\
+   tmp = 1.0 / (det);				\
+   SCALE_ADJOINT_2X2 (b, tmp, a);		\
+}
+
+/* ========================================================== */
+/* inverse of matrix 
+ *
+ * Compute inverse of matrix a, returning determinant m and 
+ * inverse b
+ */
+
+#define INVERT_3X3(b,det,a)			\
+{						\
+   double tmp;					\
+   DETERMINANT_3X3 (det, a);			\
+   tmp = 1.0 / (det);				\
+   SCALE_ADJOINT_3X3 (b, tmp, a);		\
+}
+
+/* ========================================================== */
+/* inverse of matrix 
+ *
+ * Compute inverse of matrix a, returning determinant m and 
+ * inverse b
+ */
+
+#define INVERT_4X4(b,det,a)			\
+{						\
+   double tmp;					\
+   DETERMINANT_4X4 (det, a);			\
+   tmp = 1.0 / (det);				\
+   SCALE_ADJOINT_4X4 (b, tmp, a);		\
+}
+
+/* ========================================================== */
+#if defined(__cplusplus) || defined(c_plusplus)
+}
+#endif
+
+#endif /* __GUTIL_VECTOR_H__ */
+/* ===================== END OF FILE ======================== */
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Resources/Caution.tiff has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Resources/English.lproj/GLUT.nib/classes.nib	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,55 @@
+{
+    IBClasses = (
+        {
+            ACTIONS = {save = id; saveAs = id; }; 
+            CLASS = FirstResponder; 
+            LANGUAGE = ObjC; 
+            SUPERCLASS = NSObject; 
+        }, 
+        {
+            ACTIONS = {timerAction = id; }; 
+            CLASS = GLUTApplication; 
+            LANGUAGE = ObjC; 
+            OUTLETS = {
+                "_aboutMenuItem" = NSMenuItem; 
+                "_hideMenuItem" = NSMenuItem; 
+                "_quitMenuItem" = NSMenuItem; 
+            }; 
+            SUPERCLASS = NSApplication; 
+        }, 
+        {
+            ACTIONS = {toggleWindow = id; }; 
+            CLASS = GLUTClipboardController; 
+            LANGUAGE = ObjC; 
+            OUTLETS = {"_infoText" = id; "_scrollView" = id; }; 
+            SUPERCLASS = NSWindowController; 
+        }, 
+        {
+            ACTIONS = {
+                assign = id; 
+                cancel = id; 
+                inputMenu = id; 
+                invertInput = id; 
+                mouseMatrix = id; 
+                mousePreset = id; 
+                ok = id; 
+                setDefault = id; 
+            }; 
+            CLASS = GLUTPreferencesController; 
+            LANGUAGE = ObjC; 
+            OUTLETS = {
+                assignPrompt = NSTextField; 
+                assignText = NSTextField; 
+                inputMenu = NSPopUpButton; 
+                inverted = NSButton; 
+                mbConfigMenu = NSPopUpButton; 
+                mbConfigWarningIcon = NSImageView; 
+                mbConfigWarningText = NSTextField; 
+                middleButtonMatrix = NSMatrix; 
+                rightButtonMatrix = NSMatrix; 
+            }; 
+            SUPERCLASS = NSWindowController; 
+        }
+    ); 
+    IBVersion = 1; 
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Resources/English.lproj/GLUT.nib/info.nib	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>IBDocumentLocation</key>
+	<string>4 104 410 240 0 0 1152 848 </string>
+	<key>IBEditorPositions</key>
+	<dict>
+		<key>29</key>
+		<string>19 615 246 44 0 0 1152 848 </string>
+	</dict>
+	<key>IBFramework Version</key>
+	<string>291.0</string>
+	<key>IBGroupedObjects</key>
+	<dict/>
+	<key>IBLastGroupID</key>
+	<string>1</string>
+	<key>IBOpenObjects</key>
+	<array>
+		<integer>29</integer>
+	</array>
+	<key>IBSystem Version</key>
+	<string>6I32</string>
+</dict>
+</plist>
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Resources/English.lproj/GLUT.nib/objects.nib has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Resources/English.lproj/GLUTClipboard.nib/classes.nib	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,13 @@
+{
+    IBClasses = (
+        {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, 
+        {
+            ACTIONS = {toggleWindow = id; }; 
+            CLASS = GLUTClipboardController; 
+            LANGUAGE = ObjC; 
+            OUTLETS = {_infoText = id; _scrollView = id; }; 
+            SUPERCLASS = NSWindowController; 
+        }
+    ); 
+    IBVersion = 1; 
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Resources/English.lproj/GLUTClipboard.nib/info.nib	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist SYSTEM "file://localhost/System/Library/DTDs/PropertyList.dtd">
+<plist version="0.9">
+<dict>
+	<key>IBDocumentLocation</key>
+	<string>63 221 356 240 0 0 1600 1178 </string>
+	<key>IBFramework Version</key>
+	<string>263.2</string>
+	<key>IBSystem Version</key>
+	<string>5S41</string>
+</dict>
+</plist>
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Resources/English.lproj/GLUTClipboard.nib/objects.nib has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Resources/English.lproj/GLUTPreferences.nib/classes.nib	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,73 @@
+{
+    IBClasses = (
+        {
+            ACTIONS = {save = id; saveAs = id; }; 
+            CLASS = FirstResponder; 
+            LANGUAGE = ObjC; 
+            SUPERCLASS = NSObject; 
+        }, 
+        {
+            ACTIONS = {
+                cancel = id; 
+                joyAssign = id; 
+                joyDevice = id; 
+                joyElement = id; 
+                joyInvert = id; 
+                launchDebugMode = id; 
+                launchGamemodeCaptureSingle = id; 
+                launchIconic = id; 
+                launchUseCurrWD = id; 
+                launchUseExtDesktop = id; 
+                launchUseMacOSCoords = id; 
+                mouseEanbleEmulation = id; 
+                mouseMiddleMenu = id; 
+                mouseRightMenu = id; 
+                ok = id; 
+                spaceAssign = id; 
+                spaceDevice = id; 
+                spaceElement = id; 
+                spaceInvert = id; 
+            }; 
+            CLASS = GLUTPreferencesController; 
+            LANGUAGE = ObjC; 
+            OUTLETS = {
+                joyAssign = NSButton; 
+                joyAssignNote = NSTextField; 
+                joyAssignWarningIcon = NSImageView; 
+                joyDeviceMenu = NSPopUpButton; 
+                joyElement = NSTextField; 
+                joyInputMenu = NSPopUpButton; 
+                joyInverted = NSButton; 
+                launchDebugMode = NSButton; 
+                launchFadeTime = NSTextField; 
+                launchGamemodeCaptureSingle = NSButton; 
+                launchIconic = NSButton; 
+                launchInitHeight = NSTextField; 
+                launchInitWidth = NSTextField; 
+                launchInitX = NSTextField; 
+                launchInitY = NSTextField; 
+                launchMenuIdle = NSTextField; 
+                launchSyncToVBL = NSButton; 
+                launchUseCurrWD = NSButton; 
+                launchUseExtendedDesktop = NSButton; 
+                launchUseMacOSXCoords = NSButton; 
+                mouseAssignWarningIcon = NSImageView; 
+                mouseAssignWarningText = NSTextField; 
+                mouseDetected = NSTextField; 
+                mouseEmulation = NSButton; 
+                mouseMiddleConfigMenu = NSPopUpButton; 
+                mouseRightConfigMenu = NSPopUpButton; 
+                prefsTabView = NSTabView; 
+                spaceAssign = NSButton; 
+                spaceAssignNote = NSTextField; 
+                spaceAssignWarningIcon = NSImageView; 
+                spaceDeviceMenu = NSPopUpButton; 
+                spaceElement = NSTextField; 
+                spaceInputMenu = NSPopUpButton; 
+                spaceInverted = NSButton; 
+            }; 
+            SUPERCLASS = NSWindowController; 
+        }
+    ); 
+    IBVersion = 1; 
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Resources/English.lproj/GLUTPreferences.nib/info.nib	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>IBDocumentLocation</key>
+	<string>16 329 410 240 0 0 1920 1178 </string>
+	<key>IBFramework Version</key>
+	<string>439.0</string>
+	<key>IBOpenObjects</key>
+	<array>
+		<integer>205</integer>
+	</array>
+	<key>IBSystem Version</key>
+	<string>8G32</string>
+</dict>
+</plist>
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Resources/English.lproj/GLUTPreferences.nib/objects.nib has changed
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Resources/English.lproj/GLUTUI.strings has changed
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Resources/English.lproj/InfoPlist.strings has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Resources/Info.plist	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>CFBundleDevelopmentRegion</key>
+	<string>English</string>
+	<key>CFBundleExecutable</key>
+	<string>GLUT</string>
+	<key>CFBundleGetInfoString</key>
+	<string>3.4.0, Copyright (c) 2001-2008 Apple Inc., All Rights Reserved</string>
+	<key>CFBundleIdentifier</key>
+	<string>com.apple.glut</string>
+	<key>CFBundleInfoDictionaryVersion</key>
+	<string>6.0</string>
+	<key>CFBundlePackageType</key>
+	<string>FMWK</string>
+	<key>CFBundleShortVersionString</key>
+	<string>3.4.0</string>
+	<key>CFBundleSignature</key>
+	<string>????</string>
+	<key>CFBundleVersion</key>
+	<string>GLUT-3.4.0</string>
+</dict>
+</plist>
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Resources/blankCursor.tiff has changed
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Resources/bottomCursor.tiff has changed
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Resources/bottomleftCursor.tiff has changed
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Resources/bottomrightCursor.tiff has changed
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Resources/crossCursor.tiff has changed
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Resources/cycleCursor.tiff has changed
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Resources/destroyCursor.tiff has changed
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Resources/fingerCursor.tiff has changed
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Resources/helpCursor.tiff has changed
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Resources/leftCursor.tiff has changed
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Resources/leftRightCursor.tiff has changed
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Resources/rightArrowCursor.tiff has changed
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Resources/rightCursor.tiff has changed
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Resources/sprayCursor.tiff has changed
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Resources/topCursor.tiff has changed
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Resources/topleftCursor.tiff has changed
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Resources/toprightCursor.tiff has changed
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Resources/upDownCursor.tiff has changed
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/A/Resources/waitCursor.tiff has changed
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/GLUT has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Headers/copy.h	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,18 @@
+
+/*
+ *
+ * Written By Linas Vepstas November 1991 
+ */
+
+
+#define COPY_THREE_WORDS(A,B) {						\
+	struct three_words { int a, b, c, };				\
+	*(struct three_words *) (A) = *(struct three_words *) (B);	\
+}
+
+#define COPY_FOUR_WORDS(A,B) {						\
+	struct four_words { int a, b, c, d, };				\
+	*(struct four_words *) (A) = *(struct four_words *) (B);	\
+}
+
+/* ============================================================= */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Headers/extrude.h	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,96 @@
+
+/*
+ * extrude.h
+ *
+ * FUNCTION:
+ * prototypes for privately used subroutines for the tubing library
+ *
+ * HISTORY:
+ * Linas Vepstas 1991
+ */
+ 
+#include "port.h" /* for gleDouble */
+
+#ifndef M_PI
+#define M_PI  3.14159265358979323846
+#endif
+
+/* ============================================================ */
+/* 
+ * Provides choice of calling subroutine, vs. invoking macro.
+ * Basically, inlines the source, or not.
+ * Trades performance for executable size.
+ */
+
+#define INLINE_INTERSECT
+#ifdef INLINE_INTERSECT
+#define INNERSECT(sect,p,n,v1,v2) { INTERSECT(sect,p,n,v1,v2); }
+#else
+#define INNERSECT(sect,p,n,v1,v2) intersect(sect,p,n,v1,v2)
+#endif /* INLINE_INTERSECT */
+
+/* ============================================================ */
+/* The folowing defines give a kludgy way of accessing the qmesh primitive */
+
+/*
+#define bgntmesh _emu_qmesh_bgnqmesh
+#define endtmesh _emu_qmesh_endqmesh
+#define c3f _emu_qmesh_c3f
+#define n3f _emu_qmesh_n3f
+#define v3f _emu_qmesh_v3f
+*/
+
+/* ============================================================ */
+
+extern void up_sanity_check (gleDouble up[3],      /* up vector for contour */
+                      int npoints,              /* numpoints in poly-line */
+                      gleDouble point_array[][3]);   /* polyline */
+
+
+extern void draw_raw_style_end_cap (int ncp,     /* number of contour points */
+                             gleDouble contour[][2],     /* 2D contour */
+                             gleDouble zval,             /* where to draw cap */
+                             int frontwards);    /* front or back cap */
+
+extern void draw_round_style_cap_callback (int iloop,
+                                  double cap[][3],
+                                  float face_color[3],
+                                  gleDouble cut_vector[3],
+                                  gleDouble bisect_vector[3],
+                                  double norms[][3],
+                                  int frontwards);
+
+extern void draw_angle_style_front_cap (int ncp,
+                           gleDouble bi[3],
+                           gleDouble point_array[][3]);
+
+extern void extrusion_raw_join (int ncp,        /* number of contour points */
+                         gleDouble contour[][2],    /* 2D contour */
+                         gleDouble cont_normal[][2],/* 2D contour normal vecs */
+                         gleDouble up[3],           /* up vector for contour */
+                         int npoints,           /* numpoints in poly-line */
+                         gleDouble point_array[][3],        /* polyline */
+                         float color_array[][3],        /* color of polyline */
+                         gleDouble xform_array[][2][3]);  /* 2D contour xforms */
+
+
+extern void extrusion_round_or_cut_join (int ncp, /* number of contour points */
+                         gleDouble contour[][2],    /* 2D contour */
+                         gleDouble cont_normal[][2],/* 2D contour normal vecs */
+                           gleDouble up[3],         /* up vector for contour */
+                           int npoints,         /* numpoints in poly-line */
+                           gleDouble point_array[][3],      /* polyline */
+                           float color_array[][3],      /* color of polyline */
+                           gleDouble xform_array[][2][3]);  /* 2D contour xforms */
+
+
+extern void extrusion_angle_join (int ncp,      /* number of contour points */
+                         gleDouble contour[][2],    /* 2D contour */
+                         gleDouble cont_normal[][2],/* 2D contour normal vecs */
+                           gleDouble up[3],         /* up vector for contour */
+                           int npoints,         /* numpoints in poly-line */
+                           gleDouble point_array[][3],      /* polyline */
+                           float color_array[][3],      /* color of polyline */
+                           gleDouble xform_array[][2][3]);  /* 2D contour xforms */
+
+/* -------------------------- end of file -------------------------------- */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Headers/glsmap.h	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,137 @@
+#ifndef __glsmap_h__
+#define __glsmap_h__
+
+/* Copyright (c) Mark J. Kilgard, 1998.  */
+
+/* This program is freely distributable without licensing fees
+   and is provided without guarantee or warrantee expressed or
+   implied. This program is -not- in the public domain. */
+
+#if defined(_WIN32)
+
+/* Try hard to avoid including <windows.h> to avoid name space pollution,
+   but Win32's <GL/gl.h> needs APIENTRY and WINGDIAPI defined properly. */
+# if 0
+#  define  WIN32_LEAN_AND_MEAN
+#  include <windows.h>
+# else
+   /* XXX This is from Win32's <windef.h> */
+#  ifndef APIENTRY
+#   if (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED)
+#    define APIENTRY    __stdcall
+#   else
+#    define APIENTRY
+#   endif
+#  endif
+#  ifndef CALLBACK
+    /* XXX This is from Win32's <winnt.h> */
+#   if (defined(_M_MRX000) || defined(_M_IX86) || defined(_M_ALPHA) || defined(_M_PPC)) && !defined(MIDL_PASS)
+#    define CALLBACK __stdcall
+#   else
+#    define CALLBACK
+#   endif
+#  endif
+   /* XXX This is from Win32's <wingdi.h> and <winnt.h> */
+#  ifndef WINGDIAPI
+#   define WINGDIAPI __declspec(dllimport)
+#  endif
+   /* XXX This is from Win32's <ctype.h> */
+#  ifndef _WCHAR_T_DEFINED
+typedef unsigned short wchar_t;
+#   define _WCHAR_T_DEFINED
+#  endif
+# endif
+
+#pragma warning (disable:4244)	/* Disable bogus conversion warnings. */
+#pragma warning (disable:4305)  /* VC++ 5.0 version of above warning. */
+
+#endif /* _WIN32 */
+
+#include <OpenGL/gl.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef enum {
+        SMAP_CLEAR_SMAP_TEXTURE = 0x1,
+        SMAP_GENERATE_VIEW_MIPMAPS = 0x2,
+        SMAP_GENERATE_SMAP_MIPMAPS = 0x4,
+        SMAP_GENERATE_MIPMAPS = 0x6  /* both of above */
+} SphereMapFlags;
+
+/* Cube view enumerants. */
+enum {
+	SMAP_FRONT = 0,
+	SMAP_TOP = 1,
+	SMAP_BOTTOM = 2,
+	SMAP_LEFT = 3,
+	SMAP_RIGHT = 4,
+	SMAP_BACK = 5
+};
+
+typedef struct _SphereMap SphereMap;
+
+extern SphereMap *smapCreateSphereMap(SphereMap *shareSmap);
+extern void smapDestroySphereMap(SphereMap *smap);
+
+extern void smapConfigureSphereMapMesh(SphereMap *smap, int steps, int rings, int edgeExtend);
+
+extern void smapSetSphereMapTexObj(SphereMap *smap, GLuint texobj);
+extern void smapSetViewTexObj(SphereMap *smap, GLuint texobj);
+extern void smapSetViewTexObjs(SphereMap *smap, GLuint texobjs[6]);
+extern void smapGetSphereMapTexObj(SphereMap *smap, GLuint *texobj);
+extern void smapGetViewTexObj(SphereMap *smap, GLuint *texobj);
+extern void smapGetViewTexObjs(SphereMap *smap, GLuint texobjs[6]);
+
+extern void smapSetFlags(SphereMap *smap, SphereMapFlags flags);
+extern void smapGetFlags(SphereMap *smap, SphereMapFlags *flags);
+
+extern void smapSetViewOrigin(SphereMap *smap, GLint x, GLint y);
+extern void smapSetSphereMapOrigin(SphereMap *smap, GLint x, GLint y);
+extern void smapGetViewOrigin(SphereMap *smap, GLint *x, GLint *y);
+extern void smapGetSphereMapOrigin(SphereMap *smap, GLint *x, GLint *y);
+
+extern void smapSetEye(SphereMap *smap, GLfloat eyex, GLfloat eyey,	GLfloat eyez);
+extern void smapSetEyeVector(SphereMap *smap, GLfloat *eye);
+extern void smapSetUp(SphereMap *smap, GLfloat upx, GLfloat upy, GLfloat upz);
+extern void smapSetUpVector(SphereMap *smap, GLfloat *up);
+extern void smapSetObject(SphereMap *smap, GLfloat objx, GLfloat objy, GLfloat objz);
+extern void smapSetObjectVector(SphereMap *smap, GLfloat *obj);
+extern void smapGetEye(SphereMap *smap, GLfloat *eyex, GLfloat *eyey, GLfloat *eyez);
+extern void smapGetEyeVector(SphereMap *smap, GLfloat *eye);
+extern void smapGetUp(SphereMap *smap, GLfloat *upx, GLfloat *upy, GLfloat *upz);
+extern void smapGetUpVector(SphereMap *smap, GLfloat *up);
+extern void smapGetObject(SphereMap *smap, GLfloat *objx, GLfloat *objy, GLfloat *objz);
+extern void smapGetObjectVector(SphereMap *smap, GLfloat *obj);
+
+extern void smapSetNearFar(SphereMap *smap, GLfloat viewNear, GLfloat viewFar);
+extern void smapGetNearFar(SphereMap *smap, GLfloat *viewNear, GLfloat *viewFar);
+
+extern void smapSetSphereMapTexDim(SphereMap *smap, GLsizei texdim);
+extern void smapSetViewTexDim(SphereMap *smap, GLsizei texdim);
+extern void smapGetSphereMapTexDim(SphereMap *smap, GLsizei *texdim);
+extern void smapGetViewTexDim(SphereMap *smap, GLsizei *texdim);
+
+extern void smapSetContextData(SphereMap *smap, void *context);
+extern void smapGetContextData(SphereMap *smap, void **context);
+
+extern void smapSetPositionLightsFunc(SphereMap *smap, void (*positionLights)(int view, void *context));
+extern void smapSetDrawViewFunc(SphereMap *smap, void (*drawView)(int view, void *context));
+extern void smapGetPositionLightsFunc(SphereMap *smap, void (**positionLights)(int view, void *context));
+extern void smapGetDrawViewFunc(SphereMap *smap, void (**drawView)(int view, void *context));
+
+extern void smapGenViewTex(SphereMap *smap, int view);
+extern void smapGenViewTexs(SphereMap *smap);
+extern void smapGenSphereMapFromViewTexs(SphereMap *smap);
+extern void smapGenSphereMap(SphereMap *smap);
+extern void smapGenSphereMapWithOneViewTex(SphereMap *smap);
+
+extern int smapRvecToSt(float rvec[3], float st[2]);
+extern void smapStToRvec(float *st, float *rvec);
+
+#ifdef __cplusplus
+}
+
+#endif
+#endif /* __glsmap_h__ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Headers/glsmapint.h	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,102 @@
+#ifndef __glsmapint_h__
+#define __glsmapint_h__
+
+/* Copyright (c) Mark J. Kilgard, 1998. */
+
+/* This program is freely distributable without licensing fees 
+   and is provided without guarantee or warrantee expressed or 
+   implied. This program is -not- in the public domain. */
+
+#include "glsmap.h"
+
+enum { X = 0, Y = 1, Z = 2 };
+
+#define INITFACE(mesh) \
+	int steps = mesh->steps; \
+	int sqsteps = mesh->steps * mesh->steps
+
+#define FACE(side,y,x) \
+	mesh->face[(side)*sqsteps + (y)*steps + (x)]
+
+#define FACExy(side,i,j) \
+	(&FACE(side,i,j).x)
+
+#define FACEst(side,i,j) \
+	(&FACE(side,i,j).s)
+
+#define INITBACK(mesh) \
+	int allrings = mesh->rings + mesh->edgeExtend; \
+	int ringedspokes = allrings * mesh->steps
+
+#define BACK(edge,ring,spoke) \
+	mesh->back[(edge)*ringedspokes + (ring)*mesh->steps + (spoke)]
+
+#define BACKxy(edge,ring,spoke) \
+	(&BACK(edge,ring,spoke).x)
+
+#define BACKst(edge,ring,spoke) \
+	(&BACK(edge,ring,spoke).s)
+
+typedef struct _STXY {
+	GLfloat s, t;
+	GLfloat x, y;
+} STXY;
+
+typedef struct _SphereMapMesh {
+
+	int refcnt;
+
+	int steps;
+	int rings;
+	int edgeExtend;
+
+	STXY *face;
+	STXY *back;
+
+} SphereMapMesh;
+
+struct _SphereMap {
+
+	/* Shared sphere map mesh vertex data. */
+	SphereMapMesh *mesh;
+
+	/* Texture object ids. */
+	GLuint smapTexObj;
+	GLuint viewTexObjs[6];
+	GLuint viewTexObj;
+
+        /* Flags */
+        SphereMapFlags flags;
+
+	/* Texture dimensions must be a power of two. */
+	int viewTexDim;  /* view texture dimension */
+	int smapTexDim;  /* sphere map texture dimension */
+
+	/* Viewport origins for view and sphere map rendering. */
+	int viewOrigin[2];
+	int smapOrigin[2];
+
+	/* Viewing vectors. */
+	GLfloat eye[3];
+	GLfloat up[3];
+	GLfloat obj[3];
+
+	/* Projection parameters. */
+	GLfloat viewNear;
+	GLfloat viewFar;
+
+	/* Rendering callbacks. */
+	void (*positionLights)(int view, void *context);
+	void (*drawView)(int view, void *context);
+
+	/* Application specified callback data. */
+	void *context;
+
+};
+
+/* Library internal routines. */
+extern void __smapDrawSphereMapMeshSide(SphereMapMesh *mesh, int side);
+extern void __smapDrawSphereMapMeshBack(SphereMapMesh *mesh);
+extern void __smapValidateSphereMapMesh(SphereMapMesh *mesh);
+
+#endif /* __glsmapint_h__ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Headers/glut.h	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,644 @@
+#ifndef __glut_h__
+#define __glut_h__
+
+/* Copyright (c) Mark J. Kilgard, 1994, 1995, 1996, 1998. */
+
+/* This program is freely distributable without licensing fees  and is
+   provided without guarantee or warrantee expressed or  implied. This
+   program is -not- in the public domain. */
+
+#if defined(_WIN32)
+
+/* GLUT 3.7 now tries to avoid including <windows.h>
+   to avoid name space pollution, but Win32's <GL/gl.h> 
+   needs APIENTRY and WINGDIAPI defined properly. */
+# if 0
+#  define  WIN32_LEAN_AND_MEAN
+#  include <windows.h>
+# else
+   /* XXX This is from Win32's <windef.h> */
+#  ifndef APIENTRY
+#   define GLUT_APIENTRY_DEFINED
+#   if (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED)
+#    define APIENTRY    __stdcall
+#   else
+#    define APIENTRY
+#   endif
+#  endif
+   /* XXX This is from Win32's <winnt.h> */
+#  ifndef CALLBACK
+#   if (defined(_M_MRX000) || defined(_M_IX86) || defined(_M_ALPHA) || defined(_M_PPC)) && !defined(MIDL_PASS)
+#    define CALLBACK __stdcall
+#   else
+#    define CALLBACK
+#   endif
+#  endif
+   /* XXX This is from Win32's <wingdi.h> and <winnt.h> */
+#  ifndef WINGDIAPI
+#   define GLUT_WINGDIAPI_DEFINED
+#   define WINGDIAPI __declspec(dllimport)
+#  endif
+   /* XXX This is from Win32's <ctype.h> */
+#  ifndef _WCHAR_T_DEFINED
+typedef unsigned short wchar_t;
+#   define _WCHAR_T_DEFINED
+#  endif
+# endif
+
+#pragma comment (lib, "winmm.lib")     /* link with Windows MultiMedia lib */
+#pragma comment (lib, "opengl32.lib")  /* link with Microsoft OpenGL lib */
+#pragma comment (lib, "glu32.lib")     /* link with OpenGL Utility lib */
+#pragma comment (lib, "glut32.lib")    /* link with Win32 GLUT lib */
+
+#pragma warning (disable:4244)	/* Disable bogus conversion warnings. */
+#pragma warning (disable:4305)  /* VC++ 5.0 version of above warning. */
+
+#endif
+
+#if defined(__APPLE__) || defined(MACOSX)
+#include <AvailabilityMacros.h>
+#include <OpenGL/gl.h>
+#include <OpenGL/glu.h>
+#else
+#include <GL/gl.h>
+#include <GL/glu.h>
+#endif
+
+/* define APIENTRY and CALLBACK to null string if we aren't on Win32 */
+#if !defined(_WIN32)
+#define APIENTRY
+#define GLUT_APIENTRY_DEFINED
+#define CALLBACK
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ GLUT API revision history:
+ 
+ GLUT_API_VERSION is updated to reflect incompatible GLUT
+ API changes (interface changes, semantic changes, deletions,
+ or additions).
+ 
+ GLUT_API_VERSION=1  First public release of GLUT.  11/29/94
+
+ GLUT_API_VERSION=2  Added support for OpenGL/GLX multisampling,
+ extension.  Supports new input devices like tablet, dial and button
+ box, and Spaceball.  Easy to query OpenGL extensions.
+
+ GLUT_API_VERSION=3  glutMenuStatus added.
+
+ GLUT_API_VERSION=4  glutInitDisplayString, glutWarpPointer,
+ glutBitmapLength, glutStrokeLength, glutWindowStatusFunc, dynamic
+ video resize subAPI, glutPostWindowRedisplay, glutKeyboardUpFunc,
+ glutSpecialUpFunc, glutIgnoreKeyRepeat, glutSetKeyRepeat,
+ glutJoystickFunc, glutForceJoystickFunc (NOT FINALIZED!).
+
+ GLUT_API_VERSION=5  glutGetProcAddress (added by BrianP)
+**/
+#ifndef GLUT_API_VERSION  /* allow this to be overriden */
+#define GLUT_API_VERSION		5
+#endif
+
+/**
+ GLUT implementation revision history:
+ 
+ GLUT_XLIB_IMPLEMENTATION is updated to reflect both GLUT
+ API revisions and implementation revisions (ie, bug fixes).
+
+ GLUT_XLIB_IMPLEMENTATION=1  mjk's first public release of
+ GLUT Xlib-based implementation.  11/29/94
+
+ GLUT_XLIB_IMPLEMENTATION=2  mjk's second public release of
+ GLUT Xlib-based implementation providing GLUT version 2 
+ interfaces.
+
+ GLUT_XLIB_IMPLEMENTATION=3  mjk's GLUT 2.2 images. 4/17/95
+
+ GLUT_XLIB_IMPLEMENTATION=4  mjk's GLUT 2.3 images. 6/?/95
+
+ GLUT_XLIB_IMPLEMENTATION=5  mjk's GLUT 3.0 images. 10/?/95
+
+ GLUT_XLIB_IMPLEMENTATION=7  mjk's GLUT 3.1+ with glutWarpPoitner.  7/24/96
+
+ GLUT_XLIB_IMPLEMENTATION=8  mjk's GLUT 3.1+ with glutWarpPoitner
+ and video resize.  1/3/97
+
+ GLUT_XLIB_IMPLEMENTATION=9 mjk's GLUT 3.4 release with early GLUT 4 routines.
+
+ GLUT_XLIB_IMPLEMENTATION=11 Mesa 2.5's GLUT 3.6 release.
+
+ GLUT_XLIB_IMPLEMENTATION=12 mjk's GLUT 3.6 release with early GLUT 4 routines + signal handling.
+
+ GLUT_XLIB_IMPLEMENTATION=13 mjk's GLUT 3.7 beta with GameGLUT support.
+
+ GLUT_XLIB_IMPLEMENTATION=14 mjk's GLUT 3.7 beta with f90gl friend interface.
+
+ GLUT_XLIB_IMPLEMENTATION=15 mjk's GLUT 3.7 beta sync'ed with Mesa <GL/glut.h>
+**/
+#ifndef GLUT_XLIB_IMPLEMENTATION  /* Allow this to be overriden. */
+#define GLUT_XLIB_IMPLEMENTATION	15
+#endif
+
+/**
+ MacOS X GLUT implementation revision history:
+ 
+ GLUT_MACOSX_IMPLEMENTATION is updated to reflect MacOS X
+ specific GLUT API revisions and implementation revisions
+ (ie, bug fixes).
+
+ GLUT_MACOSX_IMPLEMENTATION=1  glutSurfaceTexture.
+
+ GLUT_MACOSX_IMPLEMENTATION=2  glutWMCloseFunc, glutCheckLoop.
+  
+**/
+#ifndef GLUT_MACOSX_IMPLEMENTATION  /* Allow this to be overriden. */
+#define GLUT_MACOSX_IMPLEMENTATION	2
+#endif
+
+/* Display mode bit masks. */
+#define GLUT_RGB			0
+#define GLUT_RGBA			GLUT_RGB
+#define GLUT_INDEX			1
+#define GLUT_SINGLE			0
+#define GLUT_DOUBLE			2
+#define GLUT_ACCUM			4
+#define GLUT_ALPHA			8
+#define GLUT_DEPTH			16
+#define GLUT_STENCIL			32
+#if (GLUT_API_VERSION >= 2)
+#define GLUT_MULTISAMPLE		128
+#define GLUT_STEREO			256
+#endif
+#if (GLUT_API_VERSION >= 3)
+#define GLUT_LUMINANCE			512
+#endif
+#define GLUT_NO_RECOVERY    1024
+
+/* Mouse buttons. */
+#define GLUT_LEFT_BUTTON		0
+#define GLUT_MIDDLE_BUTTON		1
+#define GLUT_RIGHT_BUTTON		2
+
+/* Mouse button  state. */
+#define GLUT_DOWN			0
+#define GLUT_UP				1
+
+#if (GLUT_API_VERSION >= 2)
+/* function keys */
+#define GLUT_KEY_F1			1
+#define GLUT_KEY_F2			2
+#define GLUT_KEY_F3			3
+#define GLUT_KEY_F4			4
+#define GLUT_KEY_F5			5
+#define GLUT_KEY_F6			6
+#define GLUT_KEY_F7			7
+#define GLUT_KEY_F8			8
+#define GLUT_KEY_F9			9
+#define GLUT_KEY_F10			10
+#define GLUT_KEY_F11			11
+#define GLUT_KEY_F12			12
+/* directional keys */
+#define GLUT_KEY_LEFT			100
+#define GLUT_KEY_UP			101
+#define GLUT_KEY_RIGHT			102
+#define GLUT_KEY_DOWN			103
+#define GLUT_KEY_PAGE_UP		104
+#define GLUT_KEY_PAGE_DOWN		105
+#define GLUT_KEY_HOME			106
+#define GLUT_KEY_END			107
+#define GLUT_KEY_INSERT			108
+#endif
+
+/* Entry/exit  state. */
+#define GLUT_LEFT			0
+#define GLUT_ENTERED			1
+
+/* Menu usage  state. */
+#define GLUT_MENU_NOT_IN_USE		0
+#define GLUT_MENU_IN_USE		1
+
+/* Visibility  state. */
+#define GLUT_NOT_VISIBLE		0
+#define GLUT_VISIBLE			1
+
+/* Window status  state. */
+#define GLUT_HIDDEN			0
+#define GLUT_FULLY_RETAINED		1
+#define GLUT_PARTIALLY_RETAINED		2
+#define GLUT_FULLY_COVERED		3
+
+/* Color index component selection values. */
+#define GLUT_RED			0
+#define GLUT_GREEN			1
+#define GLUT_BLUE			2
+
+/* Layers for use. */
+#define GLUT_NORMAL			0
+#define GLUT_OVERLAY			1
+
+#if defined(_WIN32)
+/* Stroke font constants (use these in GLUT program). */
+#define GLUT_STROKE_ROMAN		((void*)0)
+#define GLUT_STROKE_MONO_ROMAN		((void*)1)
+
+/* Bitmap font constants (use these in GLUT program). */
+#define GLUT_BITMAP_9_BY_15		((void*)2)
+#define GLUT_BITMAP_8_BY_13		((void*)3)
+#define GLUT_BITMAP_TIMES_ROMAN_10	((void*)4)
+#define GLUT_BITMAP_TIMES_ROMAN_24	((void*)5)
+#if (GLUT_API_VERSION >= 3)
+#define GLUT_BITMAP_HELVETICA_10	((void*)6)
+#define GLUT_BITMAP_HELVETICA_12	((void*)7)
+#define GLUT_BITMAP_HELVETICA_18	((void*)8)
+#endif
+#else
+/* Stroke font opaque addresses (use constants instead in source code). */
+extern void *glutStrokeRoman;
+extern void *glutStrokeMonoRoman;
+
+/* Stroke font constants (use these in GLUT program). */
+#define GLUT_STROKE_ROMAN		(&glutStrokeRoman)
+#define GLUT_STROKE_MONO_ROMAN		(&glutStrokeMonoRoman)
+
+/* Bitmap font opaque addresses (use constants instead in source code). */
+extern void *glutBitmap9By15;
+extern void *glutBitmap8By13;
+extern void *glutBitmapTimesRoman10;
+extern void *glutBitmapTimesRoman24;
+extern void *glutBitmapHelvetica10;
+extern void *glutBitmapHelvetica12;
+extern void *glutBitmapHelvetica18;
+
+/* Bitmap font constants (use these in GLUT program). */
+#define GLUT_BITMAP_9_BY_15		(&glutBitmap9By15)
+#define GLUT_BITMAP_8_BY_13		(&glutBitmap8By13)
+#define GLUT_BITMAP_TIMES_ROMAN_10	(&glutBitmapTimesRoman10)
+#define GLUT_BITMAP_TIMES_ROMAN_24	(&glutBitmapTimesRoman24)
+#if (GLUT_API_VERSION >= 3)
+#define GLUT_BITMAP_HELVETICA_10	(&glutBitmapHelvetica10)
+#define GLUT_BITMAP_HELVETICA_12	(&glutBitmapHelvetica12)
+#define GLUT_BITMAP_HELVETICA_18	(&glutBitmapHelvetica18)
+#endif
+#endif
+
+/* glutGet parameters. */
+#define GLUT_WINDOW_X			100
+#define GLUT_WINDOW_Y			101
+#define GLUT_WINDOW_WIDTH		102
+#define GLUT_WINDOW_HEIGHT		103
+#define GLUT_WINDOW_BUFFER_SIZE		104
+#define GLUT_WINDOW_STENCIL_SIZE	105
+#define GLUT_WINDOW_DEPTH_SIZE		106
+#define GLUT_WINDOW_RED_SIZE		107
+#define GLUT_WINDOW_GREEN_SIZE		108
+#define GLUT_WINDOW_BLUE_SIZE		109
+#define GLUT_WINDOW_ALPHA_SIZE		110
+#define GLUT_WINDOW_ACCUM_RED_SIZE	111
+#define GLUT_WINDOW_ACCUM_GREEN_SIZE	112
+#define GLUT_WINDOW_ACCUM_BLUE_SIZE	113
+#define GLUT_WINDOW_ACCUM_ALPHA_SIZE	114
+#define GLUT_WINDOW_DOUBLEBUFFER	115
+#define GLUT_WINDOW_RGBA		116
+#define GLUT_WINDOW_PARENT		117
+#define GLUT_WINDOW_NUM_CHILDREN	118
+#define GLUT_WINDOW_COLORMAP_SIZE	119
+#if (GLUT_API_VERSION >= 2)
+#define GLUT_WINDOW_NUM_SAMPLES		120
+#define GLUT_WINDOW_STEREO		121
+#endif
+#if (GLUT_API_VERSION >= 3)
+#define GLUT_WINDOW_CURSOR		122
+#endif
+#define GLUT_SCREEN_WIDTH		200
+#define GLUT_SCREEN_HEIGHT		201
+#define GLUT_SCREEN_WIDTH_MM		202
+#define GLUT_SCREEN_HEIGHT_MM		203
+#define GLUT_MENU_NUM_ITEMS		300
+#define GLUT_DISPLAY_MODE_POSSIBLE	400
+#define GLUT_INIT_WINDOW_X		500
+#define GLUT_INIT_WINDOW_Y		501
+#define GLUT_INIT_WINDOW_WIDTH		502
+#define GLUT_INIT_WINDOW_HEIGHT		503
+#define GLUT_INIT_DISPLAY_MODE		504
+#if (GLUT_API_VERSION >= 2)
+#define GLUT_ELAPSED_TIME		700
+#endif
+#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 13)
+#define GLUT_WINDOW_FORMAT_ID		123
+#endif
+
+#if (GLUT_API_VERSION >= 2)
+/* glutDeviceGet parameters. */
+#define GLUT_HAS_KEYBOARD		600
+#define GLUT_HAS_MOUSE			601
+#define GLUT_HAS_SPACEBALL		602
+#define GLUT_HAS_DIAL_AND_BUTTON_BOX	603
+#define GLUT_HAS_TABLET			604
+#define GLUT_NUM_MOUSE_BUTTONS		605
+#define GLUT_NUM_SPACEBALL_BUTTONS	606
+#define GLUT_NUM_BUTTON_BOX_BUTTONS	607
+#define GLUT_NUM_DIALS			608
+#define GLUT_NUM_TABLET_BUTTONS		609
+#endif
+#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 13)
+#define GLUT_DEVICE_IGNORE_KEY_REPEAT   610
+#define GLUT_DEVICE_KEY_REPEAT          611
+#define GLUT_HAS_JOYSTICK		612
+#define GLUT_OWNS_JOYSTICK		613
+#define GLUT_JOYSTICK_BUTTONS		614
+#define GLUT_JOYSTICK_AXES		615
+#define GLUT_JOYSTICK_POLL_RATE		616
+#endif
+
+#if (GLUT_API_VERSION >= 3)
+/* glutLayerGet parameters. */
+#define GLUT_OVERLAY_POSSIBLE           800
+#define GLUT_LAYER_IN_USE		801
+#define GLUT_HAS_OVERLAY		802
+#define GLUT_TRANSPARENT_INDEX		803
+#define GLUT_NORMAL_DAMAGED		804
+#define GLUT_OVERLAY_DAMAGED		805
+
+#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9)
+/* glutVideoResizeGet parameters. */
+#define GLUT_VIDEO_RESIZE_POSSIBLE	900
+#define GLUT_VIDEO_RESIZE_IN_USE	901
+#define GLUT_VIDEO_RESIZE_X_DELTA	902
+#define GLUT_VIDEO_RESIZE_Y_DELTA	903
+#define GLUT_VIDEO_RESIZE_WIDTH_DELTA	904
+#define GLUT_VIDEO_RESIZE_HEIGHT_DELTA	905
+#define GLUT_VIDEO_RESIZE_X		906
+#define GLUT_VIDEO_RESIZE_Y		907
+#define GLUT_VIDEO_RESIZE_WIDTH		908
+#define GLUT_VIDEO_RESIZE_HEIGHT	909
+#endif
+
+/* glutUseLayer parameters. */
+#define GLUT_NORMAL			0
+#define GLUT_OVERLAY			1
+
+/* glutGetModifiers return mask. */
+#define GLUT_ACTIVE_SHIFT               1
+#define GLUT_ACTIVE_CTRL                2
+#define GLUT_ACTIVE_ALT                 4
+
+/* glutSetCursor parameters. */
+/* Basic arrows. */
+#define GLUT_CURSOR_RIGHT_ARROW		0
+#define GLUT_CURSOR_LEFT_ARROW		1
+/* Symbolic cursor shapes. */
+#define GLUT_CURSOR_INFO		2
+#define GLUT_CURSOR_DESTROY		3
+#define GLUT_CURSOR_HELP		4
+#define GLUT_CURSOR_CYCLE		5
+#define GLUT_CURSOR_SPRAY		6
+#define GLUT_CURSOR_WAIT		7
+#define GLUT_CURSOR_TEXT		8
+#define GLUT_CURSOR_CROSSHAIR		9
+/* Directional cursors. */
+#define GLUT_CURSOR_UP_DOWN		10
+#define GLUT_CURSOR_LEFT_RIGHT		11
+/* Sizing cursors. */
+#define GLUT_CURSOR_TOP_SIDE		12
+#define GLUT_CURSOR_BOTTOM_SIDE		13
+#define GLUT_CURSOR_LEFT_SIDE		14
+#define GLUT_CURSOR_RIGHT_SIDE		15
+#define GLUT_CURSOR_TOP_LEFT_CORNER	16
+#define GLUT_CURSOR_TOP_RIGHT_CORNER	17
+#define GLUT_CURSOR_BOTTOM_RIGHT_CORNER	18
+#define GLUT_CURSOR_BOTTOM_LEFT_CORNER	19
+/* Inherit from parent window. */
+#define GLUT_CURSOR_INHERIT		100
+/* Blank cursor. */
+#define GLUT_CURSOR_NONE		101
+/* Fullscreen crosshair (if available). */
+#define GLUT_CURSOR_FULL_CROSSHAIR	102
+#endif
+
+/* GLUT initialization sub-API. */
+extern void APIENTRY glutInit(int *argcp, char **argv);
+extern void APIENTRY glutInitDisplayMode(unsigned int mode);
+#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9)
+extern void APIENTRY glutInitDisplayString(const char *string);
+#endif
+extern void APIENTRY glutInitWindowPosition(int x, int y);
+extern void APIENTRY glutInitWindowSize(int width, int height);
+extern void APIENTRY glutMainLoop(void);
+
+/* GLUT window sub-API. */
+extern int APIENTRY glutCreateWindow(const char *title);
+extern int APIENTRY glutCreateSubWindow(int win, int x, int y, int width, int height);
+extern void APIENTRY glutDestroyWindow(int win);
+extern void APIENTRY glutPostRedisplay(void);
+#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 11)
+extern void APIENTRY glutPostWindowRedisplay(int win);
+#endif
+extern void APIENTRY glutSwapBuffers(void);
+extern int APIENTRY glutGetWindow(void);
+extern void APIENTRY glutSetWindow(int win);
+extern void APIENTRY glutSetWindowTitle(const char *title);
+extern void APIENTRY glutSetIconTitle(const char *title);
+extern void APIENTRY glutPositionWindow(int x, int y);
+extern void APIENTRY glutReshapeWindow(int width, int height);
+extern void APIENTRY glutPopWindow(void);
+extern void APIENTRY glutPushWindow(void);
+extern void APIENTRY glutIconifyWindow(void);
+extern void APIENTRY glutShowWindow(void);
+extern void APIENTRY glutHideWindow(void);
+#if (GLUT_API_VERSION >= 3)
+extern void APIENTRY glutFullScreen(void);
+extern void APIENTRY glutSetCursor(int cursor);
+#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9)
+extern void APIENTRY glutWarpPointer(int x, int y);
+#if (GLUT_MACOSX_IMPLEMENTATION >= 1)
+/* surface texturing API Mac OS X specific
+*  Note:
+*	glutSurfaceTexture has been deprecated, use GL_EXT_framebuffer_object
+*/
+#ifdef MAC_OS_X_VERSION_10_5
+extern void APIENTRY glutSurfaceTexture (GLenum target, GLenum internalformat, int surfacewin); AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_5
+#else
+extern void APIENTRY glutSurfaceTexture (GLenum target, GLenum internalformat, int surfacewin);
+#endif
+#endif
+#if (GLUT_MACOSX_IMPLEMENTATION >= 2)
+/* Mac OS X specific API */
+extern void APIENTRY glutWMCloseFunc(void (*func)(void));
+extern void APIENTRY glutCheckLoop(void);
+#endif
+#endif
+
+/* GLUT overlay sub-API. */
+extern void APIENTRY glutEstablishOverlay(void);
+extern void APIENTRY glutRemoveOverlay(void);
+extern void APIENTRY glutUseLayer(GLenum layer);
+extern void APIENTRY glutPostOverlayRedisplay(void);
+#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 11)
+extern void APIENTRY glutPostWindowOverlayRedisplay(int win);
+#endif
+extern void APIENTRY glutShowOverlay(void);
+extern void APIENTRY glutHideOverlay(void);
+#endif
+
+/* GLUT menu sub-API. */
+extern int APIENTRY glutCreateMenu(void (*)(int));
+extern void APIENTRY glutDestroyMenu(int menu);
+extern int APIENTRY glutGetMenu(void);
+extern void APIENTRY glutSetMenu(int menu);
+extern void APIENTRY glutAddMenuEntry(const char *label, int value);
+extern void APIENTRY glutAddSubMenu(const char *label, int submenu);
+extern void APIENTRY glutChangeToMenuEntry(int item, const char *label, int value);
+extern void APIENTRY glutChangeToSubMenu(int item, const char *label, int submenu);
+extern void APIENTRY glutRemoveMenuItem(int item);
+extern void APIENTRY glutAttachMenu(int button);
+extern void APIENTRY glutDetachMenu(int button);
+
+/* GLUT window callback sub-API. */
+extern void APIENTRY glutDisplayFunc(void (*func)(void));
+extern void APIENTRY glutReshapeFunc(void (*func)(int width, int height));
+extern void APIENTRY glutKeyboardFunc(void (*func)(unsigned char key, int x, int y));
+extern void APIENTRY glutMouseFunc(void (*func)(int button, int state, int x, int y));
+extern void APIENTRY glutMotionFunc(void (*func)(int x, int y));
+extern void APIENTRY glutPassiveMotionFunc(void (*func)(int x, int y));
+extern void APIENTRY glutEntryFunc(void (*func)(int state));
+extern void APIENTRY glutVisibilityFunc(void (*func)(int state));
+extern void APIENTRY glutIdleFunc(void (*func)(void));
+extern void APIENTRY glutTimerFunc(unsigned int millis, void (*func)(int value), int value);
+extern void APIENTRY glutMenuStateFunc(void (*func)(int state));
+#if (GLUT_API_VERSION >= 2)
+extern void APIENTRY glutSpecialFunc(void (*func)(int key, int x, int y));
+extern void APIENTRY glutSpaceballMotionFunc(void (*func)(int x, int y, int z));
+extern void APIENTRY glutSpaceballRotateFunc(void (*func)(int x, int y, int z));
+extern void APIENTRY glutSpaceballButtonFunc(void (*func)(int button, int state));
+extern void APIENTRY glutButtonBoxFunc(void (*func)(int button, int state));
+extern void APIENTRY glutDialsFunc(void (*func)(int dial, int value));
+extern void APIENTRY glutTabletMotionFunc(void (*func)(int x, int y));
+extern void APIENTRY glutTabletButtonFunc(void (*func)(int button, int state, int x, int y));
+#if (GLUT_API_VERSION >= 3)
+extern void APIENTRY glutMenuStatusFunc(void (*func)(int status, int x, int y));
+extern void APIENTRY glutOverlayDisplayFunc(void (*func)(void));
+#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9)
+extern void APIENTRY glutWindowStatusFunc(void (*func)(int state));
+#endif
+#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 13)
+extern void APIENTRY glutKeyboardUpFunc(void (*func)(unsigned char key, int x, int y));
+extern void APIENTRY glutSpecialUpFunc(void (*func)(int key, int x, int y));
+extern void APIENTRY glutJoystickFunc(void (*func)(unsigned int buttonMask, int x, int y, int z), int pollInterval);
+#endif
+#endif
+#endif
+
+/* GLUT color index sub-API. */
+extern void APIENTRY glutSetColor(int, GLfloat red, GLfloat green, GLfloat blue);
+extern GLfloat APIENTRY glutGetColor(int ndx, int component);
+extern void APIENTRY glutCopyColormap(int win);
+
+/* GLUT state retrieval sub-API. */
+extern int APIENTRY glutGet(GLenum type);
+extern int APIENTRY glutDeviceGet(GLenum type);
+#if (GLUT_API_VERSION >= 2)
+/* GLUT extension support sub-API */
+extern int APIENTRY glutExtensionSupported(const char *name);
+#endif
+#if (GLUT_API_VERSION >= 3)
+extern int APIENTRY glutGetModifiers(void);
+extern int APIENTRY glutLayerGet(GLenum type);
+#endif
+#if (GLUT_API_VERSION >= 5)
+extern void * APIENTRY glutGetProcAddress(const char *procName);
+#endif
+
+/* GLUT font sub-API */
+extern void APIENTRY glutBitmapCharacter(void *font, int character);
+extern int APIENTRY glutBitmapWidth(void *font, int character);
+extern void APIENTRY glutStrokeCharacter(void *font, int character);
+extern int APIENTRY glutStrokeWidth(void *font, int character);
+#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9)
+extern int APIENTRY glutBitmapLength(void *font, const unsigned char *string);
+extern int APIENTRY glutStrokeLength(void *font, const unsigned char *string);
+#endif
+
+/* GLUT pre-built models sub-API */
+extern void APIENTRY glutWireSphere(GLdouble radius, GLint slices, GLint stacks);
+extern void APIENTRY glutSolidSphere(GLdouble radius, GLint slices, GLint stacks);
+extern void APIENTRY glutWireCone(GLdouble base, GLdouble height, GLint slices, GLint stacks);
+extern void APIENTRY glutSolidCone(GLdouble base, GLdouble height, GLint slices, GLint stacks);
+extern void APIENTRY glutWireCube(GLdouble size);
+extern void APIENTRY glutSolidCube(GLdouble size);
+extern void APIENTRY glutWireTorus(GLdouble innerRadius, GLdouble outerRadius, GLint sides, GLint rings);
+extern void APIENTRY glutSolidTorus(GLdouble innerRadius, GLdouble outerRadius, GLint sides, GLint rings);
+extern void APIENTRY glutWireDodecahedron(void);
+extern void APIENTRY glutSolidDodecahedron(void);
+extern void APIENTRY glutWireTeapot(GLdouble size);
+extern void APIENTRY glutSolidTeapot(GLdouble size);
+extern void APIENTRY glutWireOctahedron(void);
+extern void APIENTRY glutSolidOctahedron(void);
+extern void APIENTRY glutWireTetrahedron(void);
+extern void APIENTRY glutSolidTetrahedron(void);
+extern void APIENTRY glutWireIcosahedron(void);
+extern void APIENTRY glutSolidIcosahedron(void);
+
+#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9)
+/* GLUT video resize sub-API. */
+extern int APIENTRY glutVideoResizeGet(GLenum param);
+extern void APIENTRY glutSetupVideoResizing(void);
+extern void APIENTRY glutStopVideoResizing(void);
+extern void APIENTRY glutVideoResize(int x, int y, int width, int height);
+extern void APIENTRY glutVideoPan(int x, int y, int width, int height);
+
+/* GLUT debugging sub-API. */
+extern void APIENTRY glutReportErrors(void);
+#endif
+
+#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 13)
+/* GLUT device control sub-API. */
+/* glutSetKeyRepeat modes. */
+#define GLUT_KEY_REPEAT_OFF		0
+#define GLUT_KEY_REPEAT_ON		1
+#define GLUT_KEY_REPEAT_DEFAULT		2
+
+/* Joystick button masks. */
+#define GLUT_JOYSTICK_BUTTON_A		1
+#define GLUT_JOYSTICK_BUTTON_B		2
+#define GLUT_JOYSTICK_BUTTON_C		4
+#define GLUT_JOYSTICK_BUTTON_D		8
+
+extern void APIENTRY glutIgnoreKeyRepeat(int ignore);
+extern void APIENTRY glutSetKeyRepeat(int repeatMode);
+extern void APIENTRY glutForceJoystickFunc(void);
+
+/* GLUT game mode sub-API. */
+/* glutGameModeGet. */
+#define GLUT_GAME_MODE_ACTIVE           0
+#define GLUT_GAME_MODE_POSSIBLE         1
+#define GLUT_GAME_MODE_WIDTH            2
+#define GLUT_GAME_MODE_HEIGHT           3
+#define GLUT_GAME_MODE_PIXEL_DEPTH      4
+#define GLUT_GAME_MODE_REFRESH_RATE     5
+#define GLUT_GAME_MODE_DISPLAY_CHANGED  6
+
+extern void APIENTRY glutGameModeString(const char *string);
+extern int APIENTRY glutEnterGameMode(void);
+extern void APIENTRY glutLeaveGameMode(void);
+extern int APIENTRY glutGameModeGet(GLenum mode);
+#endif
+
+#ifdef __cplusplus
+}
+
+#endif
+
+#ifdef GLUT_APIENTRY_DEFINED
+# undef GLUT_APIENTRY_DEFINED
+# undef APIENTRY
+#endif
+
+#ifdef GLUT_WINGDIAPI_DEFINED
+# undef GLUT_WINGDIAPI_DEFINED
+# undef WINGDIAPI
+#endif
+
+#endif                  /* __glut_h__ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Headers/glutbitmap.h	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,30 @@
+#ifndef __glutbitmap_h__
+#define __glutbitmap_h__
+
+/* Copyright (c) Mark J. Kilgard, 1994. */
+
+/* This program is freely distributable without licensing fees 
+   and is provided without guarantee or warrantee expressed or 
+   implied. This program is -not- in the public domain. */
+
+#include "glut.h"
+
+typedef struct {
+  const GLsizei width;
+  const GLsizei height;
+  const GLfloat xorig;
+  const GLfloat yorig;
+  const GLfloat advance;
+  const GLubyte *bitmap;
+} BitmapCharRec, *BitmapCharPtr;
+
+typedef struct {
+  const char *name;
+  const int num_chars;
+  const int first;
+  const BitmapCharRec * const *ch;
+} BitmapFontRec, *BitmapFontPtr;
+
+typedef void *GLUTbitmapFont;
+
+#endif /* __glutbitmap_h__ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Headers/glutf90.h	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,90 @@
+#ifndef __glutf90_h__
+#define __glutf90_h__
+
+/* Copyright (c) Mark J. Kilgard & Willam F. Mitchell, 1998. */
+
+/* This program is freely distributable without licensing fees 
+   and is provided without guarantee or warrantee expressed or 
+   implied. This program is -not- in the public domain. */
+
+/* This header provides the binding interface for William Mitchell's
+   f90gl Fortran 90 GLUT binding.  Other GLUT language bindings
+   can and should use this interace. */
+
+/* I appreciate the guidance from William Mitchell
+   (mitchell@cam.nist.gov) in developing this friend interface
+   for use by the f90gl package.  See ../../README.fortran */
+
+#include <GLUT/glut.h>
+
+#ifndef GLUTCALLBACK
+	#define GLUTCALLBACK
+#endif
+#ifndef APIENTRY
+	#define APIENTRY
+#endif
+
+/* Which callback enumerants for the __glutSetFCB/__glutGetFCB routines. */
+/* NOTE These values are part of a binary interface for the f90gl Fortran
+   90 binding and so must NOT changes (additions are allowed). */
+
+/* GLUTwindow callbacks. */
+#define GLUT_FCB_DISPLAY         0    /* GLUTdisplayFCB */
+#define GLUT_FCB_RESHAPE         1    /* GLUTreshapeFCB */
+#define GLUT_FCB_MOUSE           2    /* GLUTmouseFCB */
+#define GLUT_FCB_MOTION          3    /* GLUTmotionFCB */
+#define GLUT_FCB_PASSIVE         4    /* GLUTpassiveFCB */
+#define GLUT_FCB_ENTRY           5    /* GLUTentryFCB */
+#define GLUT_FCB_KEYBOARD        6    /* GLUTkeyboardFCB */
+#define GLUT_FCB_KEYBOARD_UP     7    /* GLUTkeyboardFCB */
+#define GLUT_FCB_WINDOW_STATUS   8    /* GLUTwindowStatusFCB */
+#define GLUT_FCB_VISIBILITY      9    /* GLUTvisibilityFCB */
+#define GLUT_FCB_SPECIAL         10   /* GLUTspecialFCB */
+#define GLUT_FCB_SPECIAL_UP      11   /* GLUTspecialFCB */
+#define GLUT_FCB_BUTTON_BOX      12   /* GLUTbuttonBoxFCB */
+#define GLUT_FCB_DIALS           13   /* GLUTdialsFCB */
+#define GLUT_FCB_SPACE_MOTION    14   /* GLUTspaceMotionFCB */
+#define GLUT_FCB_SPACE_ROTATE    15   /* GLUTspaceRotateFCB */
+#define GLUT_FCB_SPACE_BUTTON    16   /* GLUTspaceButtonFCB */
+#define GLUT_FCB_TABLET_MOTION   17   /* GLUTtabletMotionFCB */
+#define GLUT_FCB_TABLET_BUTTON   18   /* GLUTtabletButtonFCB */
+#define GLUT_FCB_JOYSTICK        19   /* GLUTjoystickFCB */
+#define GLUT_FCB_WMCLOSE         20   /* GLUTwmcloseFCB */
+/* Non-GLUTwindow callbacks. */
+#define GLUT_FCB_OVERLAY_DISPLAY 100  /* GLUTdisplayFCB */
+#define GLUT_FCB_SELECT          101  /* GLUTselectFCB */
+#define GLUT_FCB_TIMER           102  /* GLUTtimerFCB */
+
+/* GLUT Fortran callback function types. */
+typedef void (GLUTCALLBACK *GLUTdisplayFCB) (void);
+typedef void (GLUTCALLBACK *GLUTwmcloseFCB) (void);
+typedef void (GLUTCALLBACK *GLUTreshapeFCB) (int *, int *);
+/* NOTE the pressed key is int, not unsigned char for Fortran! */
+typedef void (GLUTCALLBACK *GLUTkeyboardFCB) (int *, int *, int *);
+typedef void (GLUTCALLBACK *GLUTmouseFCB) (int *, int *, int *, int *);
+typedef void (GLUTCALLBACK *GLUTmotionFCB) (int *, int *);
+typedef void (GLUTCALLBACK *GLUTpassiveFCB) (int *, int *);
+typedef void (GLUTCALLBACK *GLUTentryFCB) (int *);
+typedef void (GLUTCALLBACK *GLUTwindowStatusFCB) (int *);
+typedef void (GLUTCALLBACK *GLUTvisibilityFCB) (int *);
+typedef void (GLUTCALLBACK *GLUTspecialFCB) (int *, int *, int *);
+typedef void (GLUTCALLBACK *GLUTbuttonBoxFCB) (int *, int *);
+typedef void (GLUTCALLBACK *GLUTdialsFCB) (int *, int *);
+typedef void (GLUTCALLBACK *GLUTspaceMotionFCB) (int *, int *, int *);
+typedef void (GLUTCALLBACK *GLUTspaceRotateFCB) (int *, int *, int *);
+typedef void (GLUTCALLBACK *GLUTspaceButtonFCB) (int *, int *);
+typedef void (GLUTCALLBACK *GLUTtabletMotionFCB) (int *, int *);
+typedef void (GLUTCALLBACK *GLUTtabletButtonFCB) (int *, int *, int *, int *);
+typedef void (GLUTCALLBACK *GLUTjoystickFCB) (unsigned int *buttonMask, int *x, int *y, int *z);
+
+typedef void (GLUTCALLBACK *GLUTselectFCB) (int *);
+typedef void (GLUTCALLBACK *GLUTtimerFCB) (int *);
+typedef void (GLUTCALLBACK *GLUTmenuStateFCB) (int *);  /* DEPRICATED. */
+typedef void (GLUTCALLBACK *GLUTmenuStatusFCB) (int *, int *, int *);
+typedef void (GLUTCALLBACK *GLUTidleFCB) (void);
+
+/* Functions that set and return Fortran callback functions. */
+extern void* APIENTRY __glutGetFCB(int which);
+extern void APIENTRY __glutSetFCB(int which, void *func);
+
+#endif  /* __glutf90_h__ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Headers/glutstroke.h	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,42 @@
+#ifndef __glutstroke_h__
+#define __glutstroke_h__
+
+/* Copyright (c) Mark J. Kilgard, 1994. */
+
+/* This program is freely distributable without licensing fees 
+   and is provided without guarantee or warrantee expressed or 
+   implied. This program is -not- in the public domain. */
+
+#if defined(_WIN32)
+#pragma warning (disable:4244)  /* disable bogus conversion warnings */
+#pragma warning (disable:4305)  /* VC++ 5.0 version of above warning. */
+#endif
+
+typedef struct {
+  float x;
+  float y;
+} CoordRec, *CoordPtr;
+
+typedef struct {
+  int num_coords;
+  const CoordRec *coord;
+} StrokeRec, *StrokePtr;
+
+typedef struct {
+  int num_strokes;
+  const StrokeRec *stroke;
+  float center;
+  float right;
+} StrokeCharRec, *StrokeCharPtr;
+
+typedef struct {
+  const char *name;
+  int num_chars;
+  const StrokeCharRec *ch;
+  float top;
+  float bottom;
+} StrokeFontRec, *StrokeFontPtr;
+
+typedef void *GLUTstrokeFont;
+
+#endif /* __glutstroke_h__ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Headers/gutil.h	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,89 @@
+
+/*
+ * gutil.h
+ *
+ * FUNCTION:
+ * Provide utilities that allow rotation to occur 
+ * around any axis.
+ * 
+ * HISTORY:
+ * created by Linas Vepstas  1990
+ * added single & double precision, June 1991, Linas Vepstas
+ */
+
+#ifndef __GUTIL_H__
+#define __GUTIL_H__
+
+#ifdef __GUTIL_DOUBLE
+#define gutDouble double
+#else
+#define gutDouble float  
+#endif
+
+
+#ifdef _NO_PROTO		/* NO ANSI C PROTOTYPING */
+
+/* Rotation Utilities */
+extern void rot_axis_f ();
+extern void rot_about_axis_f ();
+extern void rot_omega_f ();
+extern void urot_axis_f ();
+extern void urot_about_axis_f ();
+extern void urot_omega_f ();
+
+/* double-precision versions */
+extern void rot_axis_d ();
+extern void rot_about_axis_d ();
+extern void rot_omega_d ();
+extern void urot_axis_d ();
+extern void urot_about_axis_d ();
+extern void urot_omega_d ();
+
+/* viewpoint functions */
+extern void uview_direction_d ();
+extern void uview_direction_f ();
+extern void uviewpoint_d ();
+extern void uviewpoint_f ();
+
+#else /* _NO_PROTO */		/* ANSI C PROTOTYPING */
+
+/* Rotation Utilities */
+extern void rot_axis_f (float omega, float axis[3]);
+extern void rot_about_axis_f (float angle, float axis[3]);
+extern void rot_omega_f (float axis[3]);
+extern void urot_axis_f (float m[4][4], float omega, float axis[3]);
+extern void urot_about_axis_f (float m[4][4], float angle, float axis[3]);
+extern void urot_omega_f (float m[4][4], float axis[3]);
+
+/* double-precision versions */
+extern void rot_axis_d (double omega, double axis[3]);
+extern void rot_about_axis_d (double angle, double axis[3]);
+extern void rot_omega_d (double axis[3]);
+extern void urot_axis_d (double m[4][4], double omega, double axis[3]);
+extern void urot_about_axis_d (double m[4][4], double angle, double axis[3]);
+extern void urot_omega_d (double m[4][4], double axis[3]);
+
+/* viewpoint functions */
+extern void uview_direction_d (double m[4][4],		/* returned */
+                        double v21[3],		/* input */
+                        double up[3]);		/* input */
+
+extern void uview_direction_f (float m[4][4],		/* returned */
+                        float v21[3],		/* input */
+                        float up[3]);		/* input */
+
+extern void uviewpoint_d (double m[4][4],		/* returned */
+                   double v1[3],		/* input */
+                   double v2[3],		/* input */
+                   double up[3]);		/* input */
+
+extern void uviewpoint_f (float m[4][4],		/* returned */
+                   float v1[3],		/* input */
+                   float v2[3],		/* input */
+                   float up[3]);		/* input */
+
+#endif /* _NO_PROTO */
+
+#endif /* _GUTIL_H__ */
+
+/* ------------------- end of file ---------------------- */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Headers/intersect.h	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,391 @@
+/*
+ * FUNCTION:
+ * This file contains a number of utilities useful to 3D graphics in
+ * general, and to the generation of tubing and extrusions in particular
+ * 
+ * HISTORY:
+ * Written by Linas Vepstas, August 1991
+ * Updated to correctly handle degenerate cases, Linas,  February 1993 
+ */
+
+#include <math.h>
+#include "port.h"
+#include "vvector.h"
+
+#define BACKWARDS_INTERSECT (2)
+
+/* ========================================================== */
+/*
+ * the Degenerate_Tolerance token represents the greatest amount by
+ * which different scales in a graphics environment can differ before
+ * they should be considered "degenerate".   That is, when one vector is
+ * a million times longer than another, changces are that the second will
+ * be less than a pixel int, and therefore was probably meant to be
+ * degenerate (by the CAD package, etc.)  But what should this tolerance
+ * be?  At least 1 in onethousand (since screen sizes are 1K pixels), but
+ * les than 1 in 4 million (since this is the limit of single-precision
+ * floating point accuracy).  Of course, if double precision were used,
+ * then the tolerance could be increased.
+ * 
+ * Potentially, this naive assumption could cause problems if the CAD
+ * package attempts to zoom in on small details, and turns out, certain
+ * points should not hvae been degenerate.  The problem presented here
+ * is that the tolerance could run out before single-precision ran
+ * out, and so the CAD packages would perceive this as a "bug".
+ * One alternative is to fiddle around & try to tighten the tolerance.
+ * However, the right alternative is to code the graphics pipeline in
+ * double-precision (and tighten the tolerance).
+ *
+ * By the way, note that Degernate Tolerance is a "dimensionless"
+ * quantitiy -- it has no units -- it does not measure feet, inches,
+ * millimeters or pixels.  It is used only in the computations of ratios
+ * and relative lengths.
+ */
+
+/* 
+ * Right now, the tolerance is set to 2 parts in a million, which
+ * corresponds to a 19-bit distinction of mantissas. Note that
+ * single-precsion numbers have 24 bit mantissas.
+ */
+
+#define DEGENERATE_TOLERANCE   (0.000002)
+
+/* ========================================================== */
+/* 
+ * The macro and subroutine INTERSECT are designed to compute the
+ * intersection of a line (defined by the points v1 and v2) and a plane
+ * (defined as plane which is normal to the vector n, and contains the
+ * point p).  Both return the point sect, which is the point of
+ * interesection.
+ *
+ * This MACRO attemps to be fairly robust by checking for a divide by
+ * zero.
+ */
+
+/* ========================================================== */
+/*
+ * HACK ALERT
+ * The intersection parameter t has the nice property that if t>1,
+ * then the intersection is "in front of" p1, and if t<0, then the
+ * intersection is "behind" p2. Unfortunately, as the intersecting plane
+ * and the line become parallel, t wraps through infinity -- i.e. t can
+ * become so large that t becomes "greater than infinity" and comes back 
+ * as a negative number (i.e. winding number hopped by one unit).  We 
+ * have no way of detecting this situation without adding gazzillions 
+ * of lines of code of topological algebra to detect the winding number;
+ * and this would be incredibly difficult, and ruin performance.
+ * 
+ * Thus, we've installed a cheap hack for use by the "cut style" drawing
+ * routines. If t proves to be a large negative number (more negative
+ * than -5), then we assume that t was positive and wound through
+ * infinity.  This makes most cuts look good, without introducing bogus
+ * cuts at infinity.
+ */
+/* ========================================================== */
+
+#define INTERSECT(sect,p,n,v1,v2)			\
+{							\
+   gleDouble deno, numer, t, omt;			\
+							\
+   deno = (v1[0] - v2[0]) * n[0];			\
+   deno += (v1[1] - v2[1]) * n[1];			\
+   deno += (v1[2] - v2[2]) * n[2];			\
+   							\
+   if (deno == 0.0) {					\
+      VEC_COPY (n, v1);					\
+      /* printf ("Intersect: Warning: line is coplanar with plane \n"); */ \
+   } else {						\
+							\
+      numer = (p[0] - v2[0]) * n[0];			\
+      numer += (p[1] - v2[1]) * n[1];			\
+      numer += (p[2] - v2[2]) * n[2];			\
+							\
+      t = numer / deno;					\
+      omt = 1.0 - t;					\
+							\
+      sect[0] = t * v1[0] + omt * v2[0];		\
+      sect[1] = t * v1[1] + omt * v2[1];		\
+      sect[2] = t * v1[2] + omt * v2[2];		\
+   }							\
+}
+
+/* ========================================================== */
+/* 
+ * The macro and subroutine BISECTING_PLANE compute a normal vector that
+ * describes the bisecting plane between three points (v1, v2 and v3).  
+ * This bisecting plane has the following properties:
+ * 1) it contains the point v2
+ * 2) the angle it makes with v21 == v2 - v1 is equal to the angle it 
+ *    makes with v32 == v3 - v2 
+ * 3) it is perpendicular to the plane defined by v1, v2, v3.
+ *
+ * Having input v1, v2, and v3, it returns a unit vector n.
+ *
+ * In some cases, the user may specify degenerate points, and still
+ * expect "reasonable" or "obvious" behaviour.  The "expected"
+ * behaviour for these degenerate cases is:
+ *
+ * 1) if v1 == v2 == v3, then return n=0
+ * 2) if v1 == v2, then return v32 (normalized).
+ * 3) if v2 == v3, then return v21 (normalized).
+ * 4) if v1, v2 and v3 co-linear, then return v21 (normalized).
+ *
+ * Mathematically, these special cases "make sense" -- we just have to
+ * code around potential divide-by-zero's in the code below.
+ */
+
+/* ========================================================== */
+
+#define BISECTING_PLANE(valid,n,v1,v2,v3)			\
+{								\
+   double v21[3], v32[3];					\
+   double len21, len32;						\
+   double vdot;							\
+								\
+   VEC_DIFF (v21, v2, v1);					\
+   VEC_DIFF (v32, v3, v2);					\
+								\
+   VEC_LENGTH (len21, v21);					\
+   VEC_LENGTH (len32, v32);					\
+								\
+   if (len21 <= DEGENERATE_TOLERANCE * len32) {			\
+								\
+      if (len32 == 0.0) {					\
+         /* all three points lie ontop of one-another */	\
+         VEC_ZERO (n);						\
+         valid = FALSE;						\
+      } else {							\
+         /* return a normalized copy of v32 as bisector */	\
+         len32 = 1.0 / len32;					\
+         VEC_SCALE (n, len32, v32);				\
+         valid = TRUE;						\
+      }								\
+								\
+   } else {							\
+								\
+      valid = TRUE;						\
+								\
+      if (len32 <= DEGENERATE_TOLERANCE * len21) {		\
+         /* return a normalized copy of v21 as bisector */	\
+         len21 = 1.0 / len21;					\
+         VEC_SCALE (n, len21, v21);				\
+								\
+      } else {							\
+								\
+         /* normalize v21 to be of unit length */		\
+         len21 = 1.0 / len21;					\
+         VEC_SCALE (v21, len21, v21);				\
+								\
+         /* normalize v32 to be of unit length */		\
+         len32 = 1.0 / len32;					\
+         VEC_SCALE (v32, len32, v32);				\
+								\
+         VEC_DOT_PRODUCT (vdot, v32, v21);			\
+								\
+         /* if vdot == 1 or -1, then points are colinear */	\
+         if ((vdot >= (1.0-DEGENERATE_TOLERANCE)) || 		\
+             (vdot <= (-1.0+DEGENERATE_TOLERANCE))) {		\
+            VEC_COPY (n, v21);					\
+         } else {						\
+   								\
+            /* go do the full computation */ 			\
+            n[0] = vdot * (v32[0] + v21[0]) - v32[0] - v21[0];	\
+            n[1] = vdot * (v32[1] + v21[1]) - v32[1] - v21[1];	\
+            n[2] = vdot * (v32[2] + v21[2]) - v32[2] - v21[2];	\
+								\
+            /* if above if-test's passed, 			\
+             * n should NEVER be of zero length */		\
+            VEC_NORMALIZE (n);					\
+         } 							\
+      } 							\
+   } 								\
+}
+
+/* ========================================================== */
+/*
+ * The block of code below is ifdef'd out, and is here for reference
+ * purposes only.  It performs the "mathematically right thing" for
+ * computing a bisecting plane, but is, unfortunately, subject ot noise
+ * in the presence of near degenerate points.  Since computer graphics,
+ * due to sloppy coding, laziness, or correctness, is filled with
+ * degenerate points, we can't really use this version.  The code above
+ * is far more appropriate for graphics.
+ */
+
+#ifdef MATHEMATICALLY_EXACT_GRAPHICALLY_A_KILLER
+#define BISECTING_PLANE(n,v1,v2,v3)				\
+{								\
+   double v21[3], v32[3];					\
+   double len21, len32;						\
+   double vdot;							\
+								\
+   VEC_DIFF (v21, v2, v1);					\
+   VEC_DIFF (v32, v3, v2);					\
+								\
+   VEC_LENGTH (len21, v21);					\
+   VEC_LENGTH (len32, v32);					\
+								\
+   if (len21 == 0.0) {						\
+								\
+      if (len32 == 0.0) {					\
+         /* all three points lie ontop of one-another */	\
+         VEC_ZERO (n);						\
+         valid = FALSE;						\
+      } else {							\
+         /* return a normalized copy of v32 as bisector */	\
+         len32 = 1.0 / len32;					\
+         VEC_SCALE (n, len32, v32);				\
+      }								\
+								\
+   } else {							\
+								\
+      /* normalize v21 to be of unit length */			\
+      len21 = 1.0 / len21;					\
+      VEC_SCALE (v21, len21, v21);				\
+								\
+      if (len32 == 0.0) {					\
+         /* return a normalized copy of v21 as bisector */	\
+         VEC_COPY (n, v21);					\
+      } else {							\
+								\
+         /* normalize v32 to be of unit length */		\
+         len32 = 1.0 / len32;					\
+         VEC_SCALE (v32, len32, v32);				\
+								\
+         VEC_DOT_PRODUCT (vdot, v32, v21);			\
+								\
+         /* if vdot == 1 or -1, then points are colinear */	\
+         if ((vdot == 1.0) || (vdot == -1.0)) {			\
+            VEC_COPY (n, v21);					\
+         } else {						\
+   								\
+            /* go do the full computation */ 			\
+            n[0] = vdot * (v32[0] + v21[0]) - v32[0] - v21[0];	\
+            n[1] = vdot * (v32[1] + v21[1]) - v32[1] - v21[1];	\
+            n[2] = vdot * (v32[2] + v21[2]) - v32[2] - v21[2];	\
+								\
+            /* if above if-test's passed, 			\
+             * n should NEVER be of zero length */		\
+            VEC_NORMALIZE (n);					\
+         } 							\
+      } 							\
+   } 								\
+}
+#endif
+
+/* ========================================================== */
+/*
+ * This macro computes the plane perpendicular to the the plane
+ * defined by three points, and whose normal vector is givven as the
+ * difference between the two vectors ...
+ * 
+ * (See way below for the "math" model if you want to understand this.
+ * The comments about relative errors above apply here.)
+ */
+
+#define CUTTING_PLANE(valid,n,v1,v2,v3)				\
+{								\
+   double v21[3], v32[3];					\
+   double len21, len32;						\
+   double lendiff;						\
+								\
+   VEC_DIFF (v21, v2, v1);					\
+   VEC_DIFF (v32, v3, v2);					\
+								\
+   VEC_LENGTH (len21, v21);					\
+   VEC_LENGTH (len32, v32);					\
+								\
+   if (len21 <= DEGENERATE_TOLERANCE * len32) {			\
+								\
+      if (len32 == 0.0) {					\
+         /* all three points lie ontop of one-another */	\
+         VEC_ZERO (n);						\
+         valid = FALSE;						\
+      } else {							\
+         /* return a normalized copy of v32 as cut-vector */	\
+         len32 = 1.0 / len32;					\
+         VEC_SCALE (n, len32, v32);				\
+         valid = TRUE;						\
+      }								\
+								\
+   } else {							\
+								\
+      valid = TRUE;						\
+								\
+      if (len32 <= DEGENERATE_TOLERANCE * len21) {		\
+         /* return a normalized copy of v21 as cut vector */	\
+         len21 = 1.0 / len21;					\
+         VEC_SCALE (n, len21, v21);				\
+      } else {							\
+								\
+         /* normalize v21 to be of unit length */		\
+         len21 = 1.0 / len21;					\
+         VEC_SCALE (v21, len21, v21);				\
+								\
+         /* normalize v32 to be of unit length */		\
+         len32 = 1.0 / len32;					\
+         VEC_SCALE (v32, len32, v32);				\
+								\
+         VEC_DIFF (n, v21, v32);				\
+         VEC_LENGTH (lendiff, n);				\
+								\
+         /* if the perp vector is very small, then the two 	\
+          * vectors are darn near collinear, and the cut 	\
+          * vector is probably poorly defined. */		\
+         if (lendiff < DEGENERATE_TOLERANCE) {			\
+            VEC_ZERO (n);					\
+            valid = FALSE;					\
+         } else {						\
+            lendiff = 1.0 / lendiff;				\
+            VEC_SCALE (n, lendiff, n);				\
+         } 							\
+      } 							\
+   } 								\
+}
+
+/* ========================================================== */
+
+#ifdef MATHEMATICALLY_EXACT_GRAPHICALLY_A_KILLER
+#define CUTTING_PLANE(n,v1,v2,v3)		\
+{						\
+   double v21[3], v32[3];			\
+						\
+   VEC_DIFF (v21, v2, v1);			\
+   VEC_DIFF (v32, v3, v2);			\
+						\
+   VEC_NORMALIZE (v21);				\
+   VEC_NORMALIZE (v32);				\
+						\
+   VEC_DIFF (n, v21, v32);			\
+   VEC_NORMALIZE (n);				\
+}
+#endif
+
+
+/* ============================================================ */
+/* This macro is used in several places to cycle through a series of
+ * points to find the next non-degenerate point in a series */
+
+#define FIND_NON_DEGENERATE_POINT(inext,npoints,len,diff,point_array)   \
+{                                                                       \
+   gleDouble slen;							\
+   gleDouble summa[3];							\
+   									\
+   do {                                                                 \
+      /* get distance to next point */                                  \
+      VEC_DIFF (diff, point_array[inext+1], point_array[inext]);        \
+      VEC_LENGTH (len, diff);                                           \
+      VEC_SUM (summa, point_array[inext+1], point_array[inext]);        \
+      VEC_LENGTH (slen, summa);                                         \
+      slen *= DEGENERATE_TOLERANCE;					\
+      inext ++;                                                         \
+   } while ((len <= slen) && (inext < npoints-1));                      \
+}
+
+/* ========================================================== */
+
+extern int bisecting_plane (gleDouble n[3],    /* returned */
+                      gleDouble v1[3],  /* input */
+                      gleDouble v2[3],  /* input */
+                      gleDouble v3[3]);  /* input */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Headers/port.h	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,298 @@
+
+/*
+ * port.h 
+ *
+ * FUNCTION:
+ * This file contains defines for porting the tubing toolkit from GL to
+ * OpenGL to some callback scheme.
+ *
+ * HISTORY:
+ * Created by Linas Vepstas --  February 1993
+ * Added auto texture coord generation hacks, Linas April 1994 
+ */
+
+#ifndef __GLE_PORT_H__
+#define __GLE_PORT_H__
+
+
+#ifndef TRUE
+#define TRUE 1
+#endif
+
+#ifndef FALSE
+#define FALSE 0
+#endif
+
+#ifndef M_PI
+#define M_PI 3.14159265358979323846
+#endif
+
+/* ====================================================== */
+/* Some compilers can't handle multiply-subscripted array's */
+
+#ifdef FUNKY_C
+typedef gleDouble gleVector;
+#define AVAL(arr,n,i,j)  arr(6*n+3*i+j)
+#define VVAL(arr,n,i)  arr(3*n+i)
+
+#else  /* FUNKY_C */
+typedef double gleVector[3];
+typedef double glePoint[2];
+#define AVAL(arr,n,i,j)  arr[n][i][j]
+#define VVAL(arr,n,i)  arr[n][i];
+
+#endif /* FUNKY_C */
+
+/* ====================================================== */
+/* These are used to convey info about topography to the 
+ * texture mapping routines */
+
+#define FRONT 		1
+#define BACK 		2
+#define FRONT_CAP 	3
+#define BACK_CAP	4
+#define FILLET		5
+
+/* ====================================================== */
+
+#define __GLE_DOUBLE
+
+/* ====================================================== */
+
+#ifdef __GLE_DOUBLE
+#ifndef gleDouble
+    #define gleDouble 		double
+#endif
+#define urot_axis(a,b,c) 	urot_axis_d(a,b,c)
+#define uview_direction(a,b,c) 	uview_direction_d(a,b,c)
+#define uviewpoint(a,b,c,d) 	uviewpoint_d(a,b,c,d)
+#define MULTMATRIX(m)		MULTMATRIX_D(m)
+#define LOADMATRIX(m)		LOADMATRIX_D(m)
+#define V3F(x,j,id)		V3F_D(x,j,id)
+#define N3F(x)			N3F_D(x)
+#define T2F(x,y)		T2F_D(x,y)
+#else 
+#define gleDouble 		float
+#define urot_axis(a,b,c) 	urot_axis_f(a,b,c)
+#define uview_direction(a,b,c) 	uview_direction_f(a,b,c)
+#define uviewpoint(a,b,c,d) 	uviewpoint_f(a,b,c,d)
+#define MULTMATRIX(m)		MULTMATRIX_F(m)
+#define LOADMATRIX(m)		LOADMATRIX_F(m)
+#define V3F(x,j,id)		V3F_F(x,j,id)
+#define N3F(x)			N3F_F(x)
+#define T2F(x,y)		T2F_F(x,y)
+#endif 
+
+/* ====================================================== */
+
+#if (defined DEBUG_GL_32 || DEBUG_OPENGL_10)
+#undef GL_32
+#undef OPENGL_10
+
+#define BGNTMESH(i,len)	printf ("bgntmesh() \n");
+#define ENDTMESH()      printf ("endtmesh() \n");
+#define BGNPOLYGON()	printf ("bgnpolygon() \n");
+#define ENDPOLYGON()	printf ("endpolygon() \n");
+#define V3F_F(x,j,id)	printf ("v3f(x)		%f %f %f \n", x[0], x[1], x[2]);
+#define V3F_D(x,j,id)	printf ("v3d(x) 	%f %f %f \n", x[0], x[1], x[2]);
+#define	N3F_F(x)	printf ("n3f(x) 	%f %f %f \n", x[0], x[1], x[2]);
+#define	N3F_D(x)	printf ("n3d(x)		%f %f %f \n", x[0], x[1], x[2]);
+#define	C3F(x)		printf ("c3f(x) 	%f %f %f \n", x[0], x[1], x[2]);
+
+#define	POPMATRIX()	printf ("popmatrix () \n");
+#define	PUSHMATRIX()	printf ("pushmatrix() \n");
+#define	MULTMATRIX_F(x)	MULTMATRIX_D(x)
+#define	LOADMATRIX_F(x)	LOADMATRIX_D(x)
+
+
+#define LOADMATRIX_D(x) {				\
+   int i, j; 						\
+   printf ("loadmatrix (x) \n");			\
+   for (i=0; i<4; i++) {				\
+      for (j=0; j<4; j++) {				\
+         printf ( "%f ", x[i][j]);			\
+      }							\
+      printf (" \n");					\
+   }							\
+}
+
+#define MULTMATRIX_D(x) {				\
+   int i, j; 						\
+   printf ("multmatrix (x) \n");			\
+   for (i=0; i<4; i++) {				\
+      for (j=0; j<4; j++) {				\
+         printf ( "%f ", x[i][j]);			\
+      }							\
+      printf (" \n");					\
+   }							\
+}
+
+#define __IS_LIGHTING_ON  (1)
+
+#endif
+
+/* ====================================================== */
+
+#ifdef GL_32
+
+#include <gl/gl.h>
+
+#define BGNTMESH(i,len)	bgntmesh()
+#define ENDTMESH()	endtmesh()
+#define BGNPOLYGON()	bgnpolygon()
+#define ENDPOLYGON()	endpolygon()
+#define V3F_F(x,j,id)	v3f(x)
+#define V3F_D(x,j,id)	v3d(x)
+#define	N3F_F(x)	n3f(x)
+#define	T2F_F(x,y)
+#define	T2F_D(x,y)
+#define	C3F(x)		c3f(x)
+
+#define	POPMATRIX()	popmatrix ()
+#define	PUSHMATRIX()	pushmatrix()
+#define	MULTMATRIX_F(x)	multmatrix (x)
+#define	LOADMATRIX_F(x)	loadmatrix (x)
+
+#define	N3F_D(x) {					\
+   float nnn[3];					\
+   nnn[0] = (float) x[0]; 				\
+   nnn[1] = (float) x[1]; 				\
+   nnn[2] = (float) x[2]; 				\
+   n3f (nnn);						\
+}
+
+#define LOADMATRIX_D(x) {				\
+   int i, j; 						\
+   float mmm[4][4];					\
+   for (i=0; i<4; i++) {				\
+      for (j=0; j<4; j++) {				\
+         mmm[i][j] = (float) x[i][j];			\
+      }							\
+   }							\
+   loadmatrix(mmm);					\
+}
+
+#define MULTMATRIX_D(x) {				\
+   int i, j; 						\
+   float mmm[4][4];					\
+   for (i=0; i<4; i++) {				\
+      for (j=0; j<4; j++) {				\
+         mmm[i][j] = (float) x[i][j];			\
+      }							\
+   }							\
+   multmatrix(mmm);					\
+}
+
+/* #define __IS_LIGHTING_ON  (MSINGLE == getmmode()) */
+#define __IS_LIGHTING_ON  (extrusion_join_style & TUBE_LIGHTING_ON)
+
+#endif /* GL_32 */
+
+/* ====================================================== */
+#ifdef OPENGL_10
+
+#if defined(_WIN32)
+#include <windows.h>
+#pragma warning (disable:4244)          /* disable bogus conversion warnings */
+#endif
+#include <OpenGL/gl.h>
+#include <OpenGL/glu.h>
+
+/*
+#define	N3F_F(x) {					\
+   float nnn[3];					\
+   nnn[0] = - (float) x[0]; 				\
+   nnn[1] = - (float) x[1]; 				\
+   nnn[2] = - (float) x[2]; 				\
+   glNormal3fv (nnn);						\
+}
+#define	N3F_D(x) {					\
+   float nnn[3];					\
+   nnn[0] = - (float) x[0]; 				\
+   nnn[1] = - (float) x[1]; 				\
+   nnn[2] = - (float) x[2]; 				\
+   glNormal3fv (nnn);						\
+}
+*/
+
+#define	C3F(x)		glColor3fv(x)
+#define	T2F_F(x,y)	glTexCoord2f(x,y)
+#define	T2F_D(x,y)	glTexCoord2d(x,y)
+
+#define	POPMATRIX()	glPopMatrix()
+#define	PUSHMATRIX()	glPushMatrix()
+
+#define	MULTMATRIX_F(x)	glMultMatrixf ((const GLfloat *)x)
+#define	LOADMATRIX_F(x)	glLoadMatrixf ((const GLfloat *)x)
+
+#define	MULTMATRIX_D(x)	glMultMatrixd ((const GLdouble *)x)
+#define	LOADMATRIX_D(x)	glLoadMatrixd ((const GLdouble *)x)
+
+#define __IS_LIGHTING_ON  (glIsEnabled(GL_LIGHTING))
+
+/* ====================================================== */
+#ifdef AUTO_TEXTURE
+
+#define BGNTMESH(i,len) { 					\
+	if(_gle_gc -> bgn_gen_texture) (*(_gle_gc -> bgn_gen_texture))(i,len);\
+	glBegin (GL_TRIANGLE_STRIP); 			\
+}
+
+#define BGNPOLYGON() { 					\
+	if(_gle_gc -> bgn_gen_texture) (*(_gle_gc -> bgn_gen_texture))();\
+	glBegin (GL_POLYGON);				\
+}
+
+#define N3F_F(x) { 					\
+	if(_gle_gc -> n3f_gen_texture) (*(_gle_gc -> n3f_gen_texture))(x); \
+	glNormal3fv(x); 				\
+}
+
+#define N3F_D(x) { 					\
+	if(_gle_gc -> n3d_gen_texture) (*(_gle_gc -> n3d_gen_texture))(x); \
+	glNormal3dv(x); 				\
+}
+
+#define V3F_F(x,j,id) { 					\
+	if(_gle_gc -> v3f_gen_texture) (*(_gle_gc -> v3f_gen_texture))(x,j,id);\
+	glVertex3fv(x); 				\
+}
+
+#define V3F_D(x,j,id) { 					\
+	if(_gle_gc -> v3d_gen_texture) (*(_gle_gc -> v3d_gen_texture))(x,j,id); \
+	glVertex3dv(x); 				\
+}
+
+#define ENDTMESH() {					\
+	if(_gle_gc -> end_gen_texture) (*(_gle_gc -> end_gen_texture))(); \
+	glEnd ();					\
+}
+
+#define ENDPOLYGON() {					\
+	if(_gle_gc -> end_gen_texture) (*(_gle_gc -> end_gen_texture))(); \
+	glEnd ();					\
+}
+
+/* ====================================================== */
+#else /* AUTO_TEXTURE */
+
+#define BGNTMESH(i,len)	glBegin (GL_TRIANGLE_STRIP);
+#define BGNPOLYGON() 	glBegin (GL_POLYGON);
+
+#define	N3F_F(x)	glNormal3fv(x)
+#define	N3F_D(x)	glNormal3dv(x)
+#define V3F_F(x,j,id)	glVertex3fv(x);
+#define V3F_D(x,j,id)	glVertex3dv(x);
+
+#define ENDTMESH()	glEnd ()
+#define ENDPOLYGON()	glEnd()
+
+#endif /* AUTO_TEXTURE */
+
+#endif /* OPENGL_10 */
+
+/* ====================================================== */
+
+
+#endif /* __GLE_PORT_H__ */
+/* ================== END OF FILE ======================= */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Headers/rot.h	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,98 @@
+
+/*
+ * rot.h
+ *
+ * FUNCTION:
+ * rotation matrix utilities
+ *
+ * HISTORY:
+ * Linas Vepstas Aug 1990
+ */
+
+/* ========================================================== */
+/* 
+ * The MACROS below generate and return more traditional rotation
+ * matrices -- matrices for rotations about principal axes.
+ */
+/* ========================================================== */
+
+#define ROTX_CS(m,cosine,sine)		\
+{					\
+   /* rotation about the x-axis */	\
+					\
+   m[0][0] = 1.0;			\
+   m[0][1] = 0.0;			\
+   m[0][2] = 0.0;			\
+   m[0][3] = 0.0;			\
+					\
+   m[1][0] = 0.0;			\
+   m[1][1] = (cosine);			\
+   m[1][2] = (sine);			\
+   m[1][3] = 0.0;			\
+					\
+   m[2][0] = 0.0;			\
+   m[2][1] = -(sine);			\
+   m[2][2] = (cosine);			\
+   m[2][3] = 0.0;			\
+					\
+   m[3][0] = 0.0;			\
+   m[3][1] = 0.0;			\
+   m[3][2] = 0.0;			\
+   m[3][3] = 1.0;			\
+}				
+
+/* ========================================================== */
+
+#define ROTY_CS(m,cosine,sine)		\
+{					\
+   /* rotation about the y-axis */	\
+					\
+   m[0][0] = (cosine);			\
+   m[0][1] = 0.0;			\
+   m[0][2] = -(sine);			\
+   m[0][3] = 0.0;			\
+					\
+   m[1][0] = 0.0;			\
+   m[1][1] = 1.0;			\
+   m[1][2] = 0.0;			\
+   m[1][3] = 0.0;			\
+					\
+   m[2][0] = (sine);			\
+   m[2][1] = 0.0;			\
+   m[2][2] = (cosine);			\
+   m[2][3] = 0.0;			\
+					\
+   m[3][0] = 0.0;			\
+   m[3][1] = 0.0;			\
+   m[3][2] = 0.0;			\
+   m[3][3] = 1.0;			\
+}
+
+/* ========================================================== */
+
+#define ROTZ_CS(m,cosine,sine)		\
+{					\
+   /* rotation about the z-axis */	\
+					\
+   m[0][0] = (cosine);			\
+   m[0][1] = (sine);			\
+   m[0][2] = 0.0;			\
+   m[0][3] = 0.0;			\
+					\
+   m[1][0] = -(sine);			\
+   m[1][1] = (cosine);			\
+   m[1][2] = 0.0;			\
+   m[1][3] = 0.0;			\
+					\
+   m[2][0] = 0.0;			\
+   m[2][1] = 0.0;			\
+   m[2][2] = 1.0;			\
+   m[2][3] = 0.0;			\
+					\
+   m[3][0] = 0.0;			\
+   m[3][1] = 0.0;			\
+   m[3][2] = 0.0;			\
+   m[3][3] = 1.0;			\
+}
+
+/* ========================================================== */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Headers/segment.h	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,98 @@
+
+/*
+ * MODULE: segment.h
+ *
+ * FUNCTION:
+ * Contains function prototypes for segment drawing subroutines.
+ * These are used only internally, and are not to be exported to
+ * the user.
+ *
+ * HISTORY:
+ * Create by Linas Vepstas
+ * Added tube.h include to define gleDouble, tad February 2002
+ */
+
+/* ============================================================ */
+
+#include "tube.h"
+
+extern void draw_segment_plain (int ncp,       /* number of contour points */
+                           gleDouble front_contour[][3],
+                           gleDouble back_contour[][3],
+                           int inext, double len);
+
+extern void draw_segment_color (int ncp,       /* number of contour points */
+                           gleDouble front_contour[][3],
+                           gleDouble back_contour[][3],
+                           float color_last[3],
+                           float color_next[3],
+                           int inext, double len);
+
+extern void draw_segment_edge_n (int ncp,      /* number of contour points */
+                           gleDouble front_contour[][3],
+                           gleDouble back_contour[][3],
+                           double norm_cont[][3],
+                           int inext, double len);
+
+extern void draw_segment_c_and_edge_n (int ncp,   
+                           gleDouble front_contour[][3],
+                           gleDouble back_contour[][3],
+                           double norm_cont[][3],
+                           float color_last[3],
+                           float color_next[3],
+                           int inext, double len);
+
+extern void draw_segment_facet_n (int ncp,     
+                           gleDouble front_contour[][3],
+                           gleDouble back_contour[][3],
+                           double norm_cont[][3],
+                           int inext, double len);
+
+extern void draw_segment_c_and_facet_n (int ncp,    
+                           gleDouble front_contour[][3],
+                           gleDouble back_contour[][3],
+                           double norm_cont[][3],
+                           float color_last[3],
+                           float color_next[3],
+                           int inext, double len);
+
+/* ============================================================ */
+
+extern void draw_binorm_segment_edge_n (int ncp,  
+                           double front_contour[][3],
+                           double back_contour[][3],
+                           double front_norm[][3],
+                           double back_norm[][3],
+                           int inext, double len);
+
+extern void draw_binorm_segment_c_and_edge_n (int ncp,   
+                           double front_contour[][3],
+                           double back_contour[][3],
+                           double front_norm[][3],
+                           double back_norm[][3],
+                           float color_last[3],
+                           float color_next[3],
+                           int inext, double len);
+
+extern void draw_binorm_segment_facet_n (int ncp, 
+                           double front_contour[][3],
+                           double back_contour[][3],
+                           double front_norm[][3],
+                           double back_norm[][3],
+                           int inext, double len);
+
+extern void draw_binorm_segment_c_and_facet_n (int ncp,    
+                           double front_contour[][3],
+                           double back_contour[][3],
+                           double front_norm[][3],
+                           double back_norm[][3],
+                           float color_last[3],
+                           float color_next[3],
+                           int inext, double len);
+
+extern void draw_angle_style_back_cap (int ncp,        /* number of contour points */
+                           gleDouble bi[3],             /* biscetor */
+                           gleDouble point_array[][3]);  /* polyline */
+
+/* -------------------------- end of file -------------------------------- */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Headers/tube.h	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,203 @@
+/* 
+ * tube.h
+ *
+ * FUNCTION:
+ * Tubing and Extrusion header file.
+ * This file provides protypes and defines for the extrusion 
+ * and tubing primitives.
+ *
+ * HISTORY:
+ * Linas Vepstas 1990, 1991
+ */
+
+#ifndef __TUBE_H__
+#define __TUBE_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ GLE API revision history:
+ 
+ GLE_API_VERSION is updated to reflect GLE API changes (interface
+ changes, semantic changes, deletions, or additions).
+ 
+ GLE_API_VERSION=228  GLUT 3.7 release of GLE.
+**/
+#ifndef GLE_API_VERSION  /* allow this to be overriden */
+#define GLE_API_VERSION                228
+#endif
+
+/* some types */
+#ifndef gleDouble
+    #define gleDouble double
+#endif
+typedef gleDouble gleAffine[2][3];
+
+/* ====================================================== */
+
+/* defines for tubing join styles */
+#define TUBE_JN_RAW          0x1
+#define TUBE_JN_ANGLE        0x2
+#define TUBE_JN_CUT          0x3
+#define TUBE_JN_ROUND        0x4
+#define TUBE_JN_MASK         0xf    /* mask bits */
+#define TUBE_JN_CAP          0x10
+
+/* determine how normal vectors are to be handled */
+#define TUBE_NORM_FACET      0x100
+#define TUBE_NORM_EDGE       0x200
+#define TUBE_NORM_PATH_EDGE  0x400 /* for spiral, lathe, helix primitives */
+#define TUBE_NORM_MASK       0xf00    /* mask bits */
+
+/* closed or open countours */
+#define TUBE_CONTOUR_CLOSED	0x1000
+
+#define GLE_TEXTURE_ENABLE	0x10000
+#define GLE_TEXTURE_STYLE_MASK	0xff
+#define GLE_TEXTURE_VERTEX_FLAT		1
+#define GLE_TEXTURE_NORMAL_FLAT		2
+#define GLE_TEXTURE_VERTEX_CYL		3
+#define GLE_TEXTURE_NORMAL_CYL		4
+#define GLE_TEXTURE_VERTEX_SPH		5
+#define GLE_TEXTURE_NORMAL_SPH		6
+#define GLE_TEXTURE_VERTEX_MODEL_FLAT	7
+#define GLE_TEXTURE_NORMAL_MODEL_FLAT	8
+#define GLE_TEXTURE_VERTEX_MODEL_CYL	9
+#define GLE_TEXTURE_NORMAL_MODEL_CYL	10
+#define GLE_TEXTURE_VERTEX_MODEL_SPH	11
+#define GLE_TEXTURE_NORMAL_MODEL_SPH	12
+
+#ifdef GL_32
+/* HACK for GL 3.2 -- needed because no way to tell if lighting is on.  */
+#define TUBE_LIGHTING_ON	0x80000000
+
+#define gleExtrusion		extrusion
+#define gleSetJoinStyle		setjoinstyle
+#define gleGetJoinStyle		getjoinstyle
+#define glePolyCone		polycone
+#define glePolyCylinder		polycylinder
+#define	gleSuperExtrusion	super_extrusion
+#define	gleTwistExtrusion	twist_extrusion
+#define	gleSpiral		spiral
+#define	gleLathe		lathe
+#define	gleHelicoid		helicoid
+#define	gleToroid		toroid
+#define	gleScrew		screw
+
+#endif /* GL_32 */
+
+extern int gleGetJoinStyle (void);
+extern void gleSetJoinStyle (int style);	/* bitwise OR of flags */
+extern int gleGetNumSlices(void);
+extern void gleSetNumSlices(int slices);
+
+/* draw polyclinder, specified as a polyline */
+extern void glePolyCylinder (int npoints,	/* num points in polyline */
+                   gleDouble point_array[][3],	/* polyline vertces */
+                   float color_array[][3],	/* colors at polyline verts */
+                   gleDouble radius);		/* radius of polycylinder */
+
+/* draw polycone, specified as a polyline with radii */
+extern void glePolyCone (int npoints,	 /* numpoints in poly-line */
+                   gleDouble point_array[][3],	/* polyline vertices */
+                   float color_array[][3],	/* colors at polyline verts */
+                   gleDouble radius_array[]); /* cone radii at polyline verts */
+
+/* extrude arbitrary 2D contour along arbitrary 3D path */
+extern void gleExtrusion (int ncp,         /* number of contour points */
+                gleDouble contour[][2],     /* 2D contour */
+                gleDouble cont_normal[][2], /* 2D contour normals */
+                gleDouble up[3],            /* up vector for contour */
+                int npoints,            /* numpoints in poly-line */
+                gleDouble point_array[][3], /* polyline vertices */
+                float color_array[][3]); /* colors at polyline verts */
+
+/* extrude 2D contour, specifying local rotations (twists) */
+extern void gleTwistExtrusion (int ncp,         /* number of contour points */
+                gleDouble contour[][2],    /* 2D contour */
+                gleDouble cont_normal[][2], /* 2D contour normals */
+                gleDouble up[3],           /* up vector for contour */
+                int npoints,           /* numpoints in poly-line */
+                gleDouble point_array[][3],        /* polyline vertices */
+                float color_array[][3],        /* color at polyline verts */
+                gleDouble twist_array[]);   /* countour twists (in degrees) */
+
+/* extrude 2D contour, specifying local affine tranformations */
+extern void gleSuperExtrusion (int ncp,  /* number of contour points */
+                gleDouble contour[][2],    /* 2D contour */
+                gleDouble cont_normal[][2], /* 2D contour normals */
+                gleDouble up[3],           /* up vector for contour */
+                int npoints,           /* numpoints in poly-line */
+                gleDouble point_array[][3],        /* polyline vertices */
+                float color_array[][3],        /* color at polyline verts */
+                gleDouble xform_array[][2][3]);   /* 2D contour xforms */
+
+/* spiral moves contour along helical path by parallel transport */
+extern void gleSpiral (int ncp,        /* number of contour points */
+             gleDouble contour[][2],    /* 2D contour */
+             gleDouble cont_normal[][2], /* 2D contour normals */
+             gleDouble up[3],           /* up vector for contour */
+             gleDouble startRadius,	/* spiral starts in x-y plane */
+             gleDouble drdTheta,        /* change in radius per revolution */
+             gleDouble startZ,		/* starting z value */
+             gleDouble dzdTheta,        /* change in Z per revolution */
+             gleDouble startXform[2][3], /* starting contour affine xform */
+             gleDouble dXformdTheta[2][3], /* tangent change xform per revoln */
+             gleDouble startTheta,	/* start angle in x-y plane */
+             gleDouble sweepTheta);	/* degrees to spiral around */
+
+/* lathe moves contour along helical path by helically shearing 3D space */
+extern void gleLathe (int ncp,        /* number of contour points */
+             gleDouble contour[][2],    /* 2D contour */
+             gleDouble cont_normal[][2], /* 2D contour normals */
+             gleDouble up[3],           /* up vector for contour */
+             gleDouble startRadius,	/* spiral starts in x-y plane */
+             gleDouble drdTheta,        /* change in radius per revolution */
+             gleDouble startZ,		/* starting z value */
+             gleDouble dzdTheta,        /* change in Z per revolution */
+             gleDouble startXform[2][3], /* starting contour affine xform */
+             gleDouble dXformdTheta[2][3], /* tangent change xform per revoln */
+             gleDouble startTheta,	/* start angle in x-y plane */
+             gleDouble sweepTheta);	/* degrees to spiral around */
+
+/* similar to spiral, except contour is a circle */
+extern void gleHelicoid (gleDouble rToroid, /* circle contour (torus) radius */
+             gleDouble startRadius,	/* spiral starts in x-y plane */
+             gleDouble drdTheta,        /* change in radius per revolution */
+             gleDouble startZ,		/* starting z value */
+             gleDouble dzdTheta,        /* change in Z per revolution */
+             gleDouble startXform[2][3], /* starting contour affine xform */
+             gleDouble dXformdTheta[2][3], /* tangent change xform per revoln */
+             gleDouble startTheta,	/* start angle in x-y plane */
+             gleDouble sweepTheta);	/* degrees to spiral around */
+
+/* similar to lathe, except contour is a circle */
+extern void gleToroid (gleDouble rToroid, /* circle contour (torus) radius */
+             gleDouble startRadius,	/* spiral starts in x-y plane */
+             gleDouble drdTheta,        /* change in radius per revolution */
+             gleDouble startZ,		/* starting z value */
+             gleDouble dzdTheta,        /* change in Z per revolution */
+             gleDouble startXform[2][3], /* starting contour affine xform */
+             gleDouble dXformdTheta[2][3], /* tangent change xform per revoln */
+             gleDouble startTheta,	/* start angle in x-y plane */
+             gleDouble sweepTheta);	/* degrees to spiral around */
+
+/* draws a screw shape */
+extern void gleScrew (int ncp,          /* number of contour points */
+             gleDouble contour[][2],    /* 2D contour */
+             gleDouble cont_normal[][2], /* 2D contour normals */
+             gleDouble up[3],           /* up vector for contour */
+             gleDouble startz,          /* start of segment */
+             gleDouble endz,            /* end of segment */
+             gleDouble twist);          /* number of rotations */
+
+extern void gleTextureMode (int mode);
+
+#ifdef __cplusplus
+}
+
+#endif
+#endif /* __TUBE_H__ */
+/* ================== END OF FILE ======================= */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Headers/tube_gc.h	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,78 @@
+
+/*
+ * tube_gc.h
+ *
+ * FUNCTION:
+ * This file allows for easy changes to changes in the way the extrusion
+ * library handles state info (i.e. context).
+ *
+ * HISTORY:
+ * Linas Vepstas --- February 1993
+ * Added auto texture coord generation hacks, Linas April 1994
+ * Added tube.h include to define gleDouble, tad February 2002
+ */
+
+#include "tube.h"
+#include "port.h" /* for gleVector */
+
+typedef float gleColor[3];
+typedef double gleTwoVec[2];
+
+typedef struct {
+
+   /* public methods */
+   void (*bgn_gen_texture) (int, double);
+   void (*n3f_gen_texture) (float *);
+   void (*n3d_gen_texture) (double *);
+   void (*v3f_gen_texture) (float *, int, int);
+   void (*v3d_gen_texture) (double *, int, int);
+   void (*end_gen_texture) (void);
+
+   /* protected members -- "general knowledge" stuff */
+   int join_style;
+
+   /* arguments passed into extrusion code */ 
+   int ncp;     /* number of contour points */
+   gleTwoVec *contour;    /* 2D contour */
+   gleTwoVec *cont_normal;  /* 2D contour normals */
+   gleDouble *up;               /* up vector */
+   int npoints;  /* number of points in polyline */
+   gleVector *point_array;     /* path */
+   gleColor *color_array;         /* path colors */
+   gleAffine *xform_array;  /* contour xforms */
+
+   /* private members, used by texturing code */
+   int num_vert;
+   int segment_number;
+   double segment_length;
+   double accum_seg_len;
+   double prev_x;
+   double prev_y;
+
+   void (*save_bgn_gen_texture) (int, double);
+   void (*save_n3f_gen_texture) (float *);
+   void (*save_n3d_gen_texture) (double *);
+   void (*save_v3f_gen_texture) (float *, int, int);
+   void (*save_v3d_gen_texture) (double *, int, int);
+   void (*save_end_gen_texture) (void);
+
+} gleGC;
+
+extern gleGC *_gle_gc;
+extern gleGC * gleCreateGC (void);
+
+#define INIT_GC() {if (!_gle_gc) _gle_gc = gleCreateGC(); }
+#define extrusion_join_style (_gle_gc->join_style)
+
+#define __TUBE_CLOSE_CONTOUR (extrusion_join_style & TUBE_CONTOUR_CLOSED)
+#define __TUBE_DRAW_CAP (extrusion_join_style & TUBE_JN_CAP)
+#define __TUBE_DRAW_FACET_NORMALS (extrusion_join_style & TUBE_NORM_FACET)
+#define __TUBE_DRAW_PATH_EDGE_NORMALS (extrusion_join_style & TUBE_NORM_PATH_EDGE)
+
+#define __TUBE_STYLE (extrusion_join_style & TUBE_JN_MASK)
+#define __TUBE_RAW_JOIN (extrusion_join_style & TUBE_JN_RAW)
+#define __TUBE_CUT_JOIN (extrusion_join_style & TUBE_JN_CUT)
+#define __TUBE_ANGLE_JOIN (extrusion_join_style & TUBE_JN_ANGLE)
+#define __TUBE_ROUND_JOIN (extrusion_join_style & TUBE_JN_ROUND)
+
+/* ======================= END OF FILE ========================== */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Headers/vvector.h	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,1339 @@
+
+/*
+ * vvector.h
+ *
+ * FUNCTION:
+ * This file contains a number of utilities useful for handling
+ * 3D vectors
+ * 
+ * HISTORY:
+ * Written by Linas Vepstas, August 1991
+ * Added 2D code, March 1993
+ * Added Outer products, C++ proofed, Linas Vepstas October 1993
+ */
+
+#ifndef __GUTIL_VECTOR_H__
+#define __GUTIL_VECTOR_H__
+
+#if defined(__cplusplus) || defined(c_plusplus)
+extern "C" {
+#endif
+
+
+#include <math.h>
+#include "port.h"
+
+/* ========================================================== */
+/* Zero out a 2D vector */
+
+#define VEC_ZERO_2(a)				\
+{						\
+   (a)[0] = (a)[1] = 0.0;			\
+}
+
+/* ========================================================== */
+/* Zero out a 3D vector */
+
+#define VEC_ZERO(a)				\
+{						\
+   (a)[0] = (a)[1] = (a)[2] = 0.0;		\
+}
+
+/* ========================================================== */
+/* Zero out a 4D vector */
+
+#define VEC_ZERO_4(a)				\
+{						\
+   (a)[0] = (a)[1] = (a)[2] = (a)[3] = 0.0;	\
+}
+
+/* ========================================================== */
+/* Vector copy */
+
+#define VEC_COPY_2(b,a)				\
+{						\
+   (b)[0] = (a)[0];				\
+   (b)[1] = (a)[1];				\
+}
+
+/* ========================================================== */
+/* Copy 3D vector */
+
+#define VEC_COPY(b,a)				\
+{						\
+   (b)[0] = (a)[0];				\
+   (b)[1] = (a)[1];				\
+   (b)[2] = (a)[2];				\
+}
+
+/* ========================================================== */
+/* Copy 4D vector */
+
+#define VEC_COPY_4(b,a)				\
+{						\
+   (b)[0] = (a)[0];				\
+   (b)[1] = (a)[1];				\
+   (b)[2] = (a)[2];				\
+   (b)[3] = (a)[3];				\
+}
+
+/* ========================================================== */
+/* Vector difference */
+
+#define VEC_DIFF_2(v21,v2,v1)			\
+{						\
+   (v21)[0] = (v2)[0] - (v1)[0];		\
+   (v21)[1] = (v2)[1] - (v1)[1];		\
+}
+
+/* ========================================================== */
+/* Vector difference */
+
+#define VEC_DIFF(v21,v2,v1)			\
+{						\
+   (v21)[0] = (v2)[0] - (v1)[0];		\
+   (v21)[1] = (v2)[1] - (v1)[1];		\
+   (v21)[2] = (v2)[2] - (v1)[2];		\
+}
+
+/* ========================================================== */
+/* Vector difference */
+
+#define VEC_DIFF_4(v21,v2,v1)			\
+{						\
+   (v21)[0] = (v2)[0] - (v1)[0];		\
+   (v21)[1] = (v2)[1] - (v1)[1];		\
+   (v21)[2] = (v2)[2] - (v1)[2];		\
+   (v21)[3] = (v2)[3] - (v1)[3];		\
+}
+
+/* ========================================================== */
+/* Vector sum */
+
+#define VEC_SUM_2(v21,v2,v1)			\
+{						\
+   (v21)[0] = (v2)[0] + (v1)[0];		\
+   (v21)[1] = (v2)[1] + (v1)[1];		\
+}
+
+/* ========================================================== */
+/* Vector sum */
+
+#define VEC_SUM(v21,v2,v1)			\
+{						\
+   (v21)[0] = (v2)[0] + (v1)[0];		\
+   (v21)[1] = (v2)[1] + (v1)[1];		\
+   (v21)[2] = (v2)[2] + (v1)[2];		\
+}
+
+/* ========================================================== */
+/* Vector sum */
+
+#define VEC_SUM_4(v21,v2,v1)			\
+{						\
+   (v21)[0] = (v2)[0] + (v1)[0];		\
+   (v21)[1] = (v2)[1] + (v1)[1];		\
+   (v21)[2] = (v2)[2] + (v1)[2];		\
+   (v21)[3] = (v2)[3] + (v1)[3];		\
+}
+
+/* ========================================================== */
+/* scalar times vector */
+
+#define VEC_SCALE_2(c,a,b)			\
+{						\
+   (c)[0] = (a)*(b)[0];				\
+   (c)[1] = (a)*(b)[1];				\
+}
+
+/* ========================================================== */
+/* scalar times vector */
+
+#define VEC_SCALE(c,a,b)			\
+{						\
+   (c)[0] = (a)*(b)[0];				\
+   (c)[1] = (a)*(b)[1];				\
+   (c)[2] = (a)*(b)[2];				\
+}
+
+/* ========================================================== */
+/* scalar times vector */
+
+#define VEC_SCALE_4(c,a,b)			\
+{						\
+   (c)[0] = (a)*(b)[0];				\
+   (c)[1] = (a)*(b)[1];				\
+   (c)[2] = (a)*(b)[2];				\
+   (c)[3] = (a)*(b)[3];				\
+}
+
+/* ========================================================== */
+/* accumulate scaled vector */
+
+#define VEC_ACCUM_2(c,a,b)			\
+{						\
+   (c)[0] += (a)*(b)[0];			\
+   (c)[1] += (a)*(b)[1];			\
+}
+
+/* ========================================================== */
+/* accumulate scaled vector */
+
+#define VEC_ACCUM(c,a,b)			\
+{						\
+   (c)[0] += (a)*(b)[0];			\
+   (c)[1] += (a)*(b)[1];			\
+   (c)[2] += (a)*(b)[2];			\
+}
+
+/* ========================================================== */
+/* accumulate scaled vector */
+
+#define VEC_ACCUM_4(c,a,b)			\
+{						\
+   (c)[0] += (a)*(b)[0];			\
+   (c)[1] += (a)*(b)[1];			\
+   (c)[2] += (a)*(b)[2];			\
+   (c)[3] += (a)*(b)[3];			\
+}
+
+/* ========================================================== */
+/* Vector dot product */
+
+#define VEC_DOT_PRODUCT_2(c,a,b)			\
+{							\
+   c = (a)[0]*(b)[0] + (a)[1]*(b)[1];			\
+}
+
+/* ========================================================== */
+/* Vector dot product */
+
+#define VEC_DOT_PRODUCT(c,a,b)				\
+{							\
+   c = (a)[0]*(b)[0] + (a)[1]*(b)[1] + (a)[2]*(b)[2];	\
+}
+
+/* ========================================================== */
+/* Vector dot product */
+
+#define VEC_DOT_PRODUCT_4(c,a,b)			\
+{							\
+   c = (a)[0]*(b)[0] + (a)[1]*(b)[1] + (a)[2]*(b)[2] + (a)[3]*(b)[3] ;	\
+}
+
+/* ========================================================== */
+/* vector impact parameter (squared) */
+
+#define VEC_IMPACT_SQ(bsq,direction,position)		\
+{							\
+   gleDouble vlen, llel;					\
+   VEC_DOT_PRODUCT (vlen, position, position);		\
+   VEC_DOT_PRODUCT (llel, direction, position);		\
+   bsq = vlen - llel*llel;				\
+}
+
+/* ========================================================== */
+/* vector impact parameter */
+
+#define VEC_IMPACT(bsq,direction,position)		\
+{							\
+   VEC_IMPACT_SQ(bsq,direction,position);		\
+   bsq = sqrt (bsq);					\
+}
+
+/* ========================================================== */
+/* Vector length */
+
+#define VEC_LENGTH_2(vlen,a)			\
+{						\
+   vlen = a[0]*a[0] + a[1]*a[1];			\
+   vlen = sqrt (vlen);				\
+}
+
+/* ========================================================== */
+/* Vector length */
+
+#define VEC_LENGTH(vlen,a)			\
+{						\
+   vlen = (a)[0]*(a)[0] + (a)[1]*(a)[1];		\
+   vlen += (a)[2]*(a)[2];			\
+   vlen = sqrt (vlen);				\
+}
+
+/* ========================================================== */
+/* Vector length */
+
+#define VEC_LENGTH_4(vlen,a)			\
+{						\
+   vlen = (a)[0]*(a)[0] + (a)[1]*(a)[1];		\
+   vlen += (a)[2]*(a)[2];			\
+   vlen += (a)[3] * (a)[3];			\
+   vlen = sqrt (vlen);				\
+}
+
+/* ========================================================== */
+/* distance between two points */
+
+#define VEC_DISTANCE(vlen,va,vb)			\
+{						\
+    gleDouble tmp[4];				\
+    VEC_DIFF (tmp, vb, va);			\
+    VEC_LENGTH (vlen, tmp);			\
+}
+
+/* ========================================================== */
+/* Vector length */
+
+#define VEC_CONJUGATE_LENGTH(vlen,a)		\
+{						\
+   vlen = 1.0 - a[0]*a[0] - a[1]*a[1] - a[2]*a[2];\
+   vlen = sqrt (vlen);				\
+}
+
+/* ========================================================== */
+/* Vector length */
+
+#define VEC_NORMALIZE(a)			\
+{						\
+   double vlen;					\
+   VEC_LENGTH (vlen,a);				\
+   if (vlen != 0.0) {				\
+      vlen = 1.0 / vlen;				\
+      a[0] *= vlen;				\
+      a[1] *= vlen;				\
+      a[2] *= vlen;				\
+   }						\
+}
+
+/* ========================================================== */
+/* Vector length */
+
+#define VEC_RENORMALIZE(a,newlen)		\
+{						\
+   double vlen;					\
+   VEC_LENGTH (vlen,a);				\
+   if (vlen != 0.0) {				\
+      vlen = newlen / vlen;				\
+      a[0] *= vlen;				\
+      a[1] *= vlen;				\
+      a[2] *= vlen;				\
+   }						\
+}
+
+/* ========================================================== */
+/* 3D Vector cross product yeilding vector */
+
+#define VEC_CROSS_PRODUCT(c,a,b)		\
+{						\
+   c[0] = (a)[1] * (b)[2] - (a)[2] * (b)[1];	\
+   c[1] = (a)[2] * (b)[0] - (a)[0] * (b)[2];	\
+   c[2] = (a)[0] * (b)[1] - (a)[1] * (b)[0];	\
+}
+
+/* ========================================================== */
+/* Vector perp -- assumes that n is of unit length 
+ * accepts vector v, subtracts out any component parallel to n */
+
+#define VEC_PERP(vp,v,n)			\
+{						\
+   double vdot;					\
+						\
+   VEC_DOT_PRODUCT (vdot, v, n);			\
+   vp[0] = (v)[0] - (vdot) * (n)[0];		\
+   vp[1] = (v)[1] - (vdot) * (n)[1];		\
+   vp[2] = (v)[2] - (vdot) * (n)[2];		\
+}
+
+/* ========================================================== */
+/* Vector parallel -- assumes that n is of unit length 
+ * accepts vector v, subtracts out any component perpendicular to n */
+
+#define VEC_PARALLEL(vp,v,n)			\
+{						\
+   double vdot;					\
+						\
+   VEC_DOT_PRODUCT (vdot, v, n);			\
+   vp[0] = (vdot) * (n)[0];			\
+   vp[1] = (vdot) * (n)[1];			\
+   vp[2] = (vdot) * (n)[2];			\
+}
+
+/* ========================================================== */
+/* Vector reflection -- assumes n is of unit length */
+/* Takes vector v, reflects it against reflector n, and returns vr */
+
+#define VEC_REFLECT(vr,v,n)			\
+{						\
+   double vdot;					\
+						\
+   VEC_DOT_PRODUCT (vdot, v, n);			\
+   vr[0] = (v)[0] - 2.0 * (vdot) * (n)[0];	\
+   vr[1] = (v)[1] - 2.0 * (vdot) * (n)[1];	\
+   vr[2] = (v)[2] - 2.0 * (vdot) * (n)[2];	\
+}
+
+/* ========================================================== */
+/* Vector blending */
+/* Takes two vectors a, b, blends them together */ 
+
+#define VEC_BLEND(vr,sa,a,sb,b)			\
+{						\
+						\
+   vr[0] = (sa) * (a)[0] + (sb) * (b)[0];	\
+   vr[1] = (sa) * (a)[1] + (sb) * (b)[1];	\
+   vr[2] = (sa) * (a)[2] + (sb) * (b)[2];	\
+}
+
+/* ========================================================== */
+/* Vector print */
+
+#define VEC_PRINT_2(a)					\
+{							\
+   double vlen;						\
+   VEC_LENGTH_2 (vlen, a);					\
+   printf (" a is %f %f length of a is %f \n", a[0], a[1], vlen); \
+}
+
+/* ========================================================== */
+/* Vector print */
+
+#define VEC_PRINT(a)					\
+{							\
+   double vlen;						\
+   VEC_LENGTH (vlen, (a));				\
+   printf (" a is %f %f %f length of a is %f \n", (a)[0], (a)[1], (a)[2], vlen); \
+}
+
+/* ========================================================== */
+/* Vector print */
+
+#define VEC_PRINT_4(a)					\
+{							\
+   double vlen;						\
+   VEC_LENGTH_4 (vlen, (a));				\
+   printf (" a is %f %f %f %f length of a is %f \n",	\
+       (a)[0], (a)[1], (a)[2], (a)[3], vlen);		\
+}
+
+/* ========================================================== */
+/* print matrix */
+
+#define MAT_PRINT_4X4(mmm) {				\
+   int i,j;						\
+   printf ("matrix mmm is \n");				\
+   if (mmm == NULL) {					\
+      printf (" Null \n");				\
+   } else {						\
+      for (i=0; i<4; i++) {				\
+         for (j=0; j<4; j++) {				\
+            printf ("%f ", mmm[i][j]);			\
+         }						\
+         printf (" \n");				\
+      }							\
+   }							\
+}
+
+/* ========================================================== */
+/* print matrix */
+
+#define MAT_PRINT_3X3(mmm) {				\
+   int i,j;						\
+   printf ("matrix mmm is \n");				\
+   if (mmm == NULL) {					\
+      printf (" Null \n");				\
+   } else {						\
+      for (i=0; i<3; i++) {				\
+         for (j=0; j<3; j++) {				\
+            printf ("%f ", mmm[i][j]);			\
+         }						\
+         printf (" \n");				\
+      }							\
+   }							\
+}
+
+/* ========================================================== */
+/* print matrix */
+
+#define MAT_PRINT_2X3(mmm) {				\
+   int i,j;						\
+   printf ("matrix mmm is \n");				\
+   if (mmm == NULL) {					\
+      printf (" Null \n");				\
+   } else {						\
+      for (i=0; i<2; i++) {				\
+         for (j=0; j<3; j++) {				\
+            printf ("%f ", mmm[i][j]);			\
+         }						\
+         printf (" \n");				\
+      }							\
+   }							\
+}
+
+/* ========================================================== */
+/* initialize matrix */
+
+#define IDENTIFY_MATRIX_3X3(m)			\
+{						\
+   m[0][0] = 1.0;				\
+   m[0][1] = 0.0;				\
+   m[0][2] = 0.0;				\
+						\
+   m[1][0] = 0.0;				\
+   m[1][1] = 1.0;				\
+   m[1][2] = 0.0;				\
+						\
+   m[2][0] = 0.0;				\
+   m[2][1] = 0.0;				\
+   m[2][2] = 1.0;				\
+}
+
+/* ========================================================== */
+/* initialize matrix */
+
+#define IDENTIFY_MATRIX_4X4(m)			\
+{						\
+   m[0][0] = 1.0;				\
+   m[0][1] = 0.0;				\
+   m[0][2] = 0.0;				\
+   m[0][3] = 0.0;				\
+						\
+   m[1][0] = 0.0;				\
+   m[1][1] = 1.0;				\
+   m[1][2] = 0.0;				\
+   m[1][3] = 0.0;				\
+						\
+   m[2][0] = 0.0;				\
+   m[2][1] = 0.0;				\
+   m[2][2] = 1.0;				\
+   m[2][3] = 0.0;				\
+						\
+   m[3][0] = 0.0;				\
+   m[3][1] = 0.0;				\
+   m[3][2] = 0.0;				\
+   m[3][3] = 1.0;				\
+}
+
+/* ========================================================== */
+/* matrix copy */
+
+#define COPY_MATRIX_2X2(b,a)	\
+{				\
+   b[0][0] = a[0][0];		\
+   b[0][1] = a[0][1];		\
+				\
+   b[1][0] = a[1][0];		\
+   b[1][1] = a[1][1];		\
+				\
+}
+
+/* ========================================================== */
+/* matrix copy */
+
+#define COPY_MATRIX_2X3(b,a)	\
+{				\
+   b[0][0] = a[0][0];		\
+   b[0][1] = a[0][1];		\
+   b[0][2] = a[0][2];		\
+				\
+   b[1][0] = a[1][0];		\
+   b[1][1] = a[1][1];		\
+   b[1][2] = a[1][2];		\
+}
+
+/* ========================================================== */
+/* matrix copy */
+
+#define COPY_MATRIX_3X3(b,a)	\
+{				\
+   b[0][0] = a[0][0];		\
+   b[0][1] = a[0][1];		\
+   b[0][2] = a[0][2];		\
+				\
+   b[1][0] = a[1][0];		\
+   b[1][1] = a[1][1];		\
+   b[1][2] = a[1][2];		\
+				\
+   b[2][0] = a[2][0];		\
+   b[2][1] = a[2][1];		\
+   b[2][2] = a[2][2];		\
+}
+
+/* ========================================================== */
+/* matrix copy */
+
+#define COPY_MATRIX_4X4(b,a)	\
+{				\
+   b[0][0] = a[0][0];		\
+   b[0][1] = a[0][1];		\
+   b[0][2] = a[0][2];		\
+   b[0][3] = a[0][3];		\
+				\
+   b[1][0] = a[1][0];		\
+   b[1][1] = a[1][1];		\
+   b[1][2] = a[1][2];		\
+   b[1][3] = a[1][3];		\
+				\
+   b[2][0] = a[2][0];		\
+   b[2][1] = a[2][1];		\
+   b[2][2] = a[2][2];		\
+   b[2][3] = a[2][3];		\
+				\
+   b[3][0] = a[3][0];		\
+   b[3][1] = a[3][1];		\
+   b[3][2] = a[3][2];		\
+   b[3][3] = a[3][3];		\
+}
+
+/* ========================================================== */
+/* matrix transpose */
+
+#define TRANSPOSE_MATRIX_2X2(b,a)	\
+{				\
+   b[0][0] = a[0][0];		\
+   b[0][1] = a[1][0];		\
+				\
+   b[1][0] = a[0][1];		\
+   b[1][1] = a[1][1];		\
+}
+
+/* ========================================================== */
+/* matrix transpose */
+
+#define TRANSPOSE_MATRIX_3X3(b,a)	\
+{				\
+   b[0][0] = a[0][0];		\
+   b[0][1] = a[1][0];		\
+   b[0][2] = a[2][0];		\
+				\
+   b[1][0] = a[0][1];		\
+   b[1][1] = a[1][1];		\
+   b[1][2] = a[2][1];		\
+				\
+   b[2][0] = a[0][2];		\
+   b[2][1] = a[1][2];		\
+   b[2][2] = a[2][2];		\
+}
+
+/* ========================================================== */
+/* matrix transpose */
+
+#define TRANSPOSE_MATRIX_4X4(b,a)	\
+{				\
+   b[0][0] = a[0][0];		\
+   b[0][1] = a[1][0];		\
+   b[0][2] = a[2][0];		\
+   b[0][3] = a[3][0];		\
+				\
+   b[1][0] = a[0][1];		\
+   b[1][1] = a[1][1];		\
+   b[1][2] = a[2][1];		\
+   b[1][3] = a[3][1];		\
+				\
+   b[2][0] = a[0][2];		\
+   b[2][1] = a[1][2];		\
+   b[2][2] = a[2][2];		\
+   b[2][3] = a[3][2];		\
+				\
+   b[3][0] = a[0][3];		\
+   b[3][1] = a[1][3];		\
+   b[3][2] = a[2][3];		\
+   b[3][3] = a[3][3];		\
+}
+
+/* ========================================================== */
+/* multiply matrix by scalar */
+
+#define SCALE_MATRIX_2X2(b,s,a)		\
+{					\
+   b[0][0] = (s) * a[0][0];		\
+   b[0][1] = (s) * a[0][1];		\
+					\
+   b[1][0] = (s) * a[1][0];		\
+   b[1][1] = (s) * a[1][1];		\
+}
+
+/* ========================================================== */
+/* multiply matrix by scalar */
+
+#define SCALE_MATRIX_3X3(b,s,a)		\
+{					\
+   b[0][0] = (s) * a[0][0];		\
+   b[0][1] = (s) * a[0][1];		\
+   b[0][2] = (s) * a[0][2];		\
+					\
+   b[1][0] = (s) * a[1][0];		\
+   b[1][1] = (s) * a[1][1];		\
+   b[1][2] = (s) * a[1][2];		\
+					\
+   b[2][0] = (s) * a[2][0];		\
+   b[2][1] = (s) * a[2][1];		\
+   b[2][2] = (s) * a[2][2];		\
+}
+
+/* ========================================================== */
+/* multiply matrix by scalar */
+
+#define SCALE_MATRIX_4X4(b,s,a)		\
+{					\
+   b[0][0] = (s) * a[0][0];		\
+   b[0][1] = (s) * a[0][1];		\
+   b[0][2] = (s) * a[0][2];		\
+   b[0][3] = (s) * a[0][3];		\
+					\
+   b[1][0] = (s) * a[1][0];		\
+   b[1][1] = (s) * a[1][1];		\
+   b[1][2] = (s) * a[1][2];		\
+   b[1][3] = (s) * a[1][3];		\
+					\
+   b[2][0] = (s) * a[2][0];		\
+   b[2][1] = (s) * a[2][1];		\
+   b[2][2] = (s) * a[2][2];		\
+   b[2][3] = (s) * a[2][3];		\
+					\
+   b[3][0] = s * a[3][0];		\
+   b[3][1] = s * a[3][1];		\
+   b[3][2] = s * a[3][2];		\
+   b[3][3] = s * a[3][3];		\
+}
+
+/* ========================================================== */
+/* multiply matrix by scalar */
+
+#define ACCUM_SCALE_MATRIX_2X2(b,s,a)		\
+{					\
+   b[0][0] += (s) * a[0][0];		\
+   b[0][1] += (s) * a[0][1];		\
+					\
+   b[1][0] += (s) * a[1][0];		\
+   b[1][1] += (s) * a[1][1];		\
+}
+
+/* +========================================================== */
+/* multiply matrix by scalar */
+
+#define ACCUM_SCALE_MATRIX_3X3(b,s,a)		\
+{					\
+   b[0][0] += (s) * a[0][0];		\
+   b[0][1] += (s) * a[0][1];		\
+   b[0][2] += (s) * a[0][2];		\
+					\
+   b[1][0] += (s) * a[1][0];		\
+   b[1][1] += (s) * a[1][1];		\
+   b[1][2] += (s) * a[1][2];		\
+					\
+   b[2][0] += (s) * a[2][0];		\
+   b[2][1] += (s) * a[2][1];		\
+   b[2][2] += (s) * a[2][2];		\
+}
+
+/* +========================================================== */
+/* multiply matrix by scalar */
+
+#define ACCUM_SCALE_MATRIX_4X4(b,s,a)		\
+{					\
+   b[0][0] += (s) * a[0][0];		\
+   b[0][1] += (s) * a[0][1];		\
+   b[0][2] += (s) * a[0][2];		\
+   b[0][3] += (s) * a[0][3];		\
+					\
+   b[1][0] += (s) * a[1][0];		\
+   b[1][1] += (s) * a[1][1];		\
+   b[1][2] += (s) * a[1][2];		\
+   b[1][3] += (s) * a[1][3];		\
+					\
+   b[2][0] += (s) * a[2][0];		\
+   b[2][1] += (s) * a[2][1];		\
+   b[2][2] += (s) * a[2][2];		\
+   b[2][3] += (s) * a[2][3];		\
+					\
+   b[3][0] += (s) * a[3][0];		\
+   b[3][1] += (s) * a[3][1];		\
+   b[3][2] += (s) * a[3][2];		\
+   b[3][3] += (s) * a[3][3];		\
+}
+
+/* +========================================================== */
+/* matrix product */
+/* c[x][y] = a[x][0]*b[0][y]+a[x][1]*b[1][y]+a[x][2]*b[2][y]+a[x][3]*b[3][y];*/
+
+#define MATRIX_PRODUCT_2X2(c,a,b)		\
+{						\
+   c[0][0] = a[0][0]*b[0][0]+a[0][1]*b[1][0];	\
+   c[0][1] = a[0][0]*b[0][1]+a[0][1]*b[1][1];	\
+						\
+   c[1][0] = a[1][0]*b[0][0]+a[1][1]*b[1][0];	\
+   c[1][1] = a[1][0]*b[0][1]+a[1][1]*b[1][1];	\
+						\
+}
+
+/* ========================================================== */
+/* matrix product */
+/* c[x][y] = a[x][0]*b[0][y]+a[x][1]*b[1][y]+a[x][2]*b[2][y]+a[x][3]*b[3][y];*/
+
+#define MATRIX_PRODUCT_3X3(c,a,b)				\
+{								\
+   c[0][0] = a[0][0]*b[0][0]+a[0][1]*b[1][0]+a[0][2]*b[2][0];	\
+   c[0][1] = a[0][0]*b[0][1]+a[0][1]*b[1][1]+a[0][2]*b[2][1];	\
+   c[0][2] = a[0][0]*b[0][2]+a[0][1]*b[1][2]+a[0][2]*b[2][2];	\
+								\
+   c[1][0] = a[1][0]*b[0][0]+a[1][1]*b[1][0]+a[1][2]*b[2][0];	\
+   c[1][1] = a[1][0]*b[0][1]+a[1][1]*b[1][1]+a[1][2]*b[2][1];	\
+   c[1][2] = a[1][0]*b[0][2]+a[1][1]*b[1][2]+a[1][2]*b[2][2];	\
+								\
+   c[2][0] = a[2][0]*b[0][0]+a[2][1]*b[1][0]+a[2][2]*b[2][0];	\
+   c[2][1] = a[2][0]*b[0][1]+a[2][1]*b[1][1]+a[2][2]*b[2][1];	\
+   c[2][2] = a[2][0]*b[0][2]+a[2][1]*b[1][2]+a[2][2]*b[2][2];	\
+}
+
+/* ========================================================== */
+/* matrix product */
+/* c[x][y] = a[x][0]*b[0][y]+a[x][1]*b[1][y]+a[x][2]*b[2][y]+a[x][3]*b[3][y];*/
+
+#define MATRIX_PRODUCT_4X4(c,a,b)		\
+{						\
+   c[0][0] = a[0][0]*b[0][0]+a[0][1]*b[1][0]+a[0][2]*b[2][0]+a[0][3]*b[3][0];\
+   c[0][1] = a[0][0]*b[0][1]+a[0][1]*b[1][1]+a[0][2]*b[2][1]+a[0][3]*b[3][1];\
+   c[0][2] = a[0][0]*b[0][2]+a[0][1]*b[1][2]+a[0][2]*b[2][2]+a[0][3]*b[3][2];\
+   c[0][3] = a[0][0]*b[0][3]+a[0][1]*b[1][3]+a[0][2]*b[2][3]+a[0][3]*b[3][3];\
+						\
+   c[1][0] = a[1][0]*b[0][0]+a[1][1]*b[1][0]+a[1][2]*b[2][0]+a[1][3]*b[3][0];\
+   c[1][1] = a[1][0]*b[0][1]+a[1][1]*b[1][1]+a[1][2]*b[2][1]+a[1][3]*b[3][1];\
+   c[1][2] = a[1][0]*b[0][2]+a[1][1]*b[1][2]+a[1][2]*b[2][2]+a[1][3]*b[3][2];\
+   c[1][3] = a[1][0]*b[0][3]+a[1][1]*b[1][3]+a[1][2]*b[2][3]+a[1][3]*b[3][3];\
+						\
+   c[2][0] = a[2][0]*b[0][0]+a[2][1]*b[1][0]+a[2][2]*b[2][0]+a[2][3]*b[3][0];\
+   c[2][1] = a[2][0]*b[0][1]+a[2][1]*b[1][1]+a[2][2]*b[2][1]+a[2][3]*b[3][1];\
+   c[2][2] = a[2][0]*b[0][2]+a[2][1]*b[1][2]+a[2][2]*b[2][2]+a[2][3]*b[3][2];\
+   c[2][3] = a[2][0]*b[0][3]+a[2][1]*b[1][3]+a[2][2]*b[2][3]+a[2][3]*b[3][3];\
+						\
+   c[3][0] = a[3][0]*b[0][0]+a[3][1]*b[1][0]+a[3][2]*b[2][0]+a[3][3]*b[3][0];\
+   c[3][1] = a[3][0]*b[0][1]+a[3][1]*b[1][1]+a[3][2]*b[2][1]+a[3][3]*b[3][1];\
+   c[3][2] = a[3][0]*b[0][2]+a[3][1]*b[1][2]+a[3][2]*b[2][2]+a[3][3]*b[3][2];\
+   c[3][3] = a[3][0]*b[0][3]+a[3][1]*b[1][3]+a[3][2]*b[2][3]+a[3][3]*b[3][3];\
+}
+
+/* ========================================================== */
+/* matrix times vector */
+
+#define MAT_DOT_VEC_2X2(p,m,v)					\
+{								\
+   p[0] = m[0][0]*v[0] + m[0][1]*v[1];				\
+   p[1] = m[1][0]*v[0] + m[1][1]*v[1];				\
+}
+
+/* ========================================================== */
+/* matrix times vector */
+
+#define MAT_DOT_VEC_3X3(p,m,v)					\
+{								\
+   p[0] = m[0][0]*v[0] + m[0][1]*v[1] + m[0][2]*v[2];		\
+   p[1] = m[1][0]*v[0] + m[1][1]*v[1] + m[1][2]*v[2];		\
+   p[2] = m[2][0]*v[0] + m[2][1]*v[1] + m[2][2]*v[2];		\
+}
+
+/* ========================================================== */
+/* matrix times vector */
+
+#define MAT_DOT_VEC_4X4(p,m,v)					\
+{								\
+   p[0] = m[0][0]*v[0] + m[0][1]*v[1] + m[0][2]*v[2] + m[0][3]*v[3];	\
+   p[1] = m[1][0]*v[0] + m[1][1]*v[1] + m[1][2]*v[2] + m[1][3]*v[3];	\
+   p[2] = m[2][0]*v[0] + m[2][1]*v[1] + m[2][2]*v[2] + m[2][3]*v[3];	\
+   p[3] = m[3][0]*v[0] + m[3][1]*v[1] + m[3][2]*v[2] + m[3][3]*v[3];	\
+}
+
+/* ========================================================== */
+/* vector transpose times matrix */
+/* p[j] = v[0]*m[0][j] + v[1]*m[1][j] + v[2]*m[2][j]; */
+
+#define VEC_DOT_MAT_3X3(p,v,m)					\
+{								\
+   p[0] = v[0]*m[0][0] + v[1]*m[1][0] + v[2]*m[2][0];		\
+   p[1] = v[0]*m[0][1] + v[1]*m[1][1] + v[2]*m[2][1];		\
+   p[2] = v[0]*m[0][2] + v[1]*m[1][2] + v[2]*m[2][2];		\
+}
+
+/* ========================================================== */
+/* affine matrix times vector */
+/* The matrix is assumed to be an affine matrix, with last two 
+ * entries representing a translation */
+
+#define MAT_DOT_VEC_2X3(p,m,v)					\
+{								\
+   p[0] = m[0][0]*v[0] + m[0][1]*v[1] + m[0][2];		\
+   p[1] = m[1][0]*v[0] + m[1][1]*v[1] + m[1][2];		\
+}
+
+/* ========================================================== */
+/* inverse transpose of matrix times vector
+ *
+ * This macro computes inverse transpose of matrix m, 
+ * and multiplies vector v into it, to yeild vector p
+ *
+ * DANGER !!! Do Not use this on normal vectors!!!
+ * It will leave normals the wrong length !!!
+ * See macro below for use on normals.
+ */
+
+#define INV_TRANSP_MAT_DOT_VEC_2X2(p,m,v)			\
+{								\
+   gleDouble det;						\
+								\
+   det = m[0][0]*m[1][1] - m[0][1]*m[1][0];			\
+   p[0] = m[1][1]*v[0] - m[1][0]*v[1];				\
+   p[1] = - m[0][1]*v[0] + m[0][0]*v[1];			\
+								\
+   /* if matrix not singular, and not orthonormal, then renormalize */ \
+   if ((det!=1.0) && (det != 0.0)) {				\
+      det = 1.0 / det;						\
+      p[0] *= det;						\
+      p[1] *= det;						\
+   }								\
+}
+
+/* ========================================================== */
+/* transform normal vector by inverse transpose of matrix 
+ * and then renormalize the vector 
+ *
+ * This macro computes inverse transpose of matrix m, 
+ * and multiplies vector v into it, to yeild vector p
+ * Vector p is then normalized.
+ */
+
+
+#define NORM_XFORM_2X2(p,m,v)					\
+{								\
+   double mlen;							\
+								\
+   /* do nothing if off-diagonals are zero and diagonals are 	\
+    * equal */							\
+   if ((m[0][1] != 0.0) || (m[1][0] != 0.0) || (m[0][0] != m[1][1])) { \
+      p[0] = m[1][1]*v[0] - m[1][0]*v[1];			\
+      p[1] = - m[0][1]*v[0] + m[0][0]*v[1];			\
+								\
+      mlen = p[0]*p[0] + p[1]*p[1];				\
+      mlen = 1.0 / sqrt (mlen);					\
+      p[0] *= mlen;						\
+      p[1] *= mlen;						\
+   } else {							\
+      VEC_COPY_2 (p, v);					\
+   }								\
+}
+
+/* ========================================================== */
+/* outer product of vector times vector transpose 
+ *
+ * The outer product of vector v and vector transpose t yeilds 
+ * dyadic matrix m.
+ */
+
+#define OUTER_PRODUCT_2X2(m,v,t)				\
+{								\
+   m[0][0] = v[0] * t[0];					\
+   m[0][1] = v[0] * t[1];					\
+								\
+   m[1][0] = v[1] * t[0];					\
+   m[1][1] = v[1] * t[1];					\
+}
+
+/* ========================================================== */
+/* outer product of vector times vector transpose 
+ *
+ * The outer product of vector v and vector transpose t yeilds 
+ * dyadic matrix m.
+ */
+
+#define OUTER_PRODUCT_3X3(m,v,t)				\
+{								\
+   m[0][0] = v[0] * t[0];					\
+   m[0][1] = v[0] * t[1];					\
+   m[0][2] = v[0] * t[2];					\
+								\
+   m[1][0] = v[1] * t[0];					\
+   m[1][1] = v[1] * t[1];					\
+   m[1][2] = v[1] * t[2];					\
+								\
+   m[2][0] = v[2] * t[0];					\
+   m[2][1] = v[2] * t[1];					\
+   m[2][2] = v[2] * t[2];					\
+}
+
+/* ========================================================== */
+/* outer product of vector times vector transpose 
+ *
+ * The outer product of vector v and vector transpose t yeilds 
+ * dyadic matrix m.
+ */
+
+#define OUTER_PRODUCT_4X4(m,v,t)				\
+{								\
+   m[0][0] = v[0] * t[0];					\
+   m[0][1] = v[0] * t[1];					\
+   m[0][2] = v[0] * t[2];					\
+   m[0][3] = v[0] * t[3];					\
+								\
+   m[1][0] = v[1] * t[0];					\
+   m[1][1] = v[1] * t[1];					\
+   m[1][2] = v[1] * t[2];					\
+   m[1][3] = v[1] * t[3];					\
+								\
+   m[2][0] = v[2] * t[0];					\
+   m[2][1] = v[2] * t[1];					\
+   m[2][2] = v[2] * t[2];					\
+   m[2][3] = v[2] * t[3];					\
+								\
+   m[3][0] = v[3] * t[0];					\
+   m[3][1] = v[3] * t[1];					\
+   m[3][2] = v[3] * t[2];					\
+   m[3][3] = v[3] * t[3];					\
+}
+
+/* +========================================================== */
+/* outer product of vector times vector transpose 
+ *
+ * The outer product of vector v and vector transpose t yeilds 
+ * dyadic matrix m.
+ */
+
+#define ACCUM_OUTER_PRODUCT_2X2(m,v,t)				\
+{								\
+   m[0][0] += v[0] * t[0];					\
+   m[0][1] += v[0] * t[1];					\
+								\
+   m[1][0] += v[1] * t[0];					\
+   m[1][1] += v[1] * t[1];					\
+}
+
+/* +========================================================== */
+/* outer product of vector times vector transpose 
+ *
+ * The outer product of vector v and vector transpose t yeilds 
+ * dyadic matrix m.
+ */
+
+#define ACCUM_OUTER_PRODUCT_3X3(m,v,t)				\
+{								\
+   m[0][0] += v[0] * t[0];					\
+   m[0][1] += v[0] * t[1];					\
+   m[0][2] += v[0] * t[2];					\
+								\
+   m[1][0] += v[1] * t[0];					\
+   m[1][1] += v[1] * t[1];					\
+   m[1][2] += v[1] * t[2];					\
+								\
+   m[2][0] += v[2] * t[0];					\
+   m[2][1] += v[2] * t[1];					\
+   m[2][2] += v[2] * t[2];					\
+}
+
+/* +========================================================== */
+/* outer product of vector times vector transpose 
+ *
+ * The outer product of vector v and vector transpose t yeilds 
+ * dyadic matrix m.
+ */
+
+#define ACCUM_OUTER_PRODUCT_4X4(m,v,t)				\
+{								\
+   m[0][0] += v[0] * t[0];					\
+   m[0][1] += v[0] * t[1];					\
+   m[0][2] += v[0] * t[2];					\
+   m[0][3] += v[0] * t[3];					\
+								\
+   m[1][0] += v[1] * t[0];					\
+   m[1][1] += v[1] * t[1];					\
+   m[1][2] += v[1] * t[2];					\
+   m[1][3] += v[1] * t[3];					\
+								\
+   m[2][0] += v[2] * t[0];					\
+   m[2][1] += v[2] * t[1];					\
+   m[2][2] += v[2] * t[2];					\
+   m[2][3] += v[2] * t[3];					\
+								\
+   m[3][0] += v[3] * t[0];					\
+   m[3][1] += v[3] * t[1];					\
+   m[3][2] += v[3] * t[2];					\
+   m[3][3] += v[3] * t[3];					\
+}
+
+/* +========================================================== */
+/* determinant of matrix
+ *
+ * Computes determinant of matrix m, returning d
+ */
+
+#define DETERMINANT_2X2(d,m)					\
+{								\
+   d = m[0][0] * m[1][1] - m[0][1] * m[1][0];			\
+}
+
+/* ========================================================== */
+/* determinant of matrix
+ *
+ * Computes determinant of matrix m, returning d
+ */
+
+#define DETERMINANT_3X3(d,m)					\
+{								\
+   d = m[0][0] * (m[1][1]*m[2][2] - m[1][2] * m[2][1]);		\
+   d -= m[0][1] * (m[1][0]*m[2][2] - m[1][2] * m[2][0]);	\
+   d += m[0][2] * (m[1][0]*m[2][1] - m[1][1] * m[2][0]);	\
+}
+
+/* ========================================================== */
+/* i,j,th cofactor of a 4x4 matrix
+ *
+ */
+
+#define COFACTOR_4X4_IJ(fac,m,i,j) 				\
+{								\
+   int ii[4], jj[4], k;						\
+								\
+   /* compute which row, columnt to skip */			\
+   for (k=0; k<i; k++) ii[k] = k;				\
+   for (k=i; k<3; k++) ii[k] = k+1;				\
+   for (k=0; k<j; k++) jj[k] = k;				\
+   for (k=j; k<3; k++) jj[k] = k+1;				\
+								\
+   (fac) = m[ii[0]][jj[0]] * (m[ii[1]][jj[1]]*m[ii[2]][jj[2]] 	\
+                            - m[ii[1]][jj[2]]*m[ii[2]][jj[1]]); \
+   (fac) -= m[ii[0]][jj[1]] * (m[ii[1]][jj[0]]*m[ii[2]][jj[2]]	\
+                             - m[ii[1]][jj[2]]*m[ii[2]][jj[0]]);\
+   (fac) += m[ii[0]][jj[2]] * (m[ii[1]][jj[0]]*m[ii[2]][jj[1]]	\
+                             - m[ii[1]][jj[1]]*m[ii[2]][jj[0]]);\
+								\
+   /* compute sign */						\
+   k = i+j;							\
+   if ( k != (k/2)*2) {						\
+      (fac) = -(fac);						\
+   }								\
+}
+
+/* ========================================================== */
+/* determinant of matrix
+ *
+ * Computes determinant of matrix m, returning d
+ */
+
+#define DETERMINANT_4X4(d,m)					\
+{								\
+   double cofac;						\
+   COFACTOR_4X4_IJ (cofac, m, 0, 0);				\
+   d = m[0][0] * cofac;						\
+   COFACTOR_4X4_IJ (cofac, m, 0, 1);				\
+   d += m[0][1] * cofac;					\
+   COFACTOR_4X4_IJ (cofac, m, 0, 2);				\
+   d += m[0][2] * cofac;					\
+   COFACTOR_4X4_IJ (cofac, m, 0, 3);				\
+   d += m[0][3] * cofac;					\
+}
+
+/* ========================================================== */
+/* cofactor of matrix
+ *
+ * Computes cofactor of matrix m, returning a
+ */
+
+#define COFACTOR_2X2(a,m)					\
+{								\
+   a[0][0] = (m)[1][1];						\
+   a[0][1] = - (m)[1][0];						\
+   a[1][0] = - (m)[0][1];						\
+   a[1][1] = (m)[0][0];						\
+}
+
+/* ========================================================== */
+/* cofactor of matrix
+ *
+ * Computes cofactor of matrix m, returning a
+ */
+
+#define COFACTOR_3X3(a,m)					\
+{								\
+   a[0][0] = m[1][1]*m[2][2] - m[1][2]*m[2][1];			\
+   a[0][1] = - (m[1][0]*m[2][2] - m[2][0]*m[1][2]);		\
+   a[0][2] = m[1][0]*m[2][1] - m[1][1]*m[2][0];			\
+   a[1][0] = - (m[0][1]*m[2][2] - m[0][2]*m[2][1]);		\
+   a[1][1] = m[0][0]*m[2][2] - m[0][2]*m[2][0];			\
+   a[1][2] = - (m[0][0]*m[2][1] - m[0][1]*m[2][0]);		\
+   a[2][0] = m[0][1]*m[1][2] - m[0][2]*m[1][1];			\
+   a[2][1] = - (m[0][0]*m[1][2] - m[0][2]*m[1][0]);		\
+   a[2][2] = m[0][0]*m[1][1] - m[0][1]*m[1][0]);		\
+}
+
+/* ========================================================== */
+/* cofactor of matrix
+ *
+ * Computes cofactor of matrix m, returning a
+ */
+
+#define COFACTOR_4X4(a,m)					\
+{								\
+   int i,j;							\
+								\
+   for (i=0; i<4; i++) {					\
+      for (j=0; j<4; j++) {					\
+         COFACTOR_4X4_IJ (a[i][j], m, i, j);			\
+      }								\
+   }								\
+}
+
+/* ========================================================== */
+/* adjoint of matrix
+ *
+ * Computes adjoint of matrix m, returning a
+ * (Note that adjoint is just the transpose of the cofactor matrix)
+ */
+
+#define ADJOINT_2X2(a,m)					\
+{								\
+   a[0][0] = (m)[1][1];						\
+   a[1][0] = - (m)[1][0];						\
+   a[0][1] = - (m)[0][1];						\
+   a[1][1] = (m)[0][0];						\
+}
+
+/* ========================================================== */
+/* adjoint of matrix
+ *
+ * Computes adjoint of matrix m, returning a
+ * (Note that adjoint is just the transpose of the cofactor matrix)
+ */
+
+
+#define ADJOINT_3X3(a,m)					\
+{								\
+   a[0][0] = m[1][1]*m[2][2] - m[1][2]*m[2][1];			\
+   a[1][0] = - (m[1][0]*m[2][2] - m[2][0]*m[1][2]);		\
+   a[2][0] = m[1][0]*m[2][1] - m[1][1]*m[2][0];			\
+   a[0][1] = - (m[0][1]*m[2][2] - m[0][2]*m[2][1]);		\
+   a[1][1] = m[0][0]*m[2][2] - m[0][2]*m[2][0];			\
+   a[2][1] = - (m[0][0]*m[2][1] - m[0][1]*m[2][0]);		\
+   a[0][2] = m[0][1]*m[1][2] - m[0][2]*m[1][1];			\
+   a[1][2] = - (m[0][0]*m[1][2] - m[0][2]*m[1][0]);		\
+   a[2][2] = m[0][0]*m[1][1] - m[0][1]*m[1][0]);		\
+}
+
+/* ========================================================== */
+/* adjoint of matrix
+ *
+ * Computes adjoint of matrix m, returning a
+ * (Note that adjoint is just the transpose of the cofactor matrix)
+ */
+
+#define ADJOINT_4X4(a,m)					\
+{								\
+   int i,j;							\
+								\
+   for (i=0; i<4; i++) {					\
+      for (j=0; j<4; j++) {					\
+         COFACTOR_4X4_IJ (a[j][i], m, i, j);			\
+      }								\
+   }								\
+}
+
+/* ========================================================== */
+/* compute adjoint of matrix and scale
+ *
+ * Computes adjoint of matrix m, scales it by s, returning a
+ */
+
+#define SCALE_ADJOINT_2X2(a,s,m)				\
+{								\
+   a[0][0] = (s) * m[1][1];					\
+   a[1][0] = - (s) * m[1][0];					\
+   a[0][1] = - (s) * m[0][1];					\
+   a[1][1] = (s) * m[0][0];					\
+}
+
+/* ========================================================== */
+/* compute adjoint of matrix and scale
+ *
+ * Computes adjoint of matrix m, scales it by s, returning a
+ */
+
+#define SCALE_ADJOINT_3X3(a,s,m)				\
+{								\
+   a[0][0] = (s) * (m[1][1] * m[2][2] - m[1][2] * m[2][1]);	\
+   a[1][0] = (s) * (m[1][2] * m[2][0] - m[1][0] * m[2][2]);	\
+   a[2][0] = (s) * (m[1][0] * m[2][1] - m[1][1] * m[2][0]);	\
+								\
+   a[0][1] = (s) * (m[0][2] * m[2][1] - m[0][1] * m[2][2]);	\
+   a[1][1] = (s) * (m[0][0] * m[2][2] - m[0][2] * m[2][0]);	\
+   a[2][1] = (s) * (m[0][1] * m[2][0] - m[0][0] * m[2][1]);	\
+								\
+   a[0][2] = (s) * (m[0][1] * m[1][2] - m[0][2] * m[1][1]);	\
+   a[1][2] = (s) * (m[0][2] * m[1][0] - m[0][0] * m[1][2]);	\
+   a[2][2] = (s) * (m[0][0] * m[1][1] - m[0][1] * m[1][0]);	\
+}
+
+/* ========================================================== */
+/* compute adjoint of matrix and scale
+ *
+ * Computes adjoint of matrix m, scales it by s, returning a
+ */
+
+#define SCALE_ADJOINT_4X4(a,s,m)				\
+{								\
+   int i,j;							\
+								\
+   for (i=0; i<4; i++) {					\
+      for (j=0; j<4; j++) {					\
+         COFACTOR_4X4_IJ (a[j][i], m, i, j);			\
+         a[j][i] *= s;						\
+      }								\
+   }								\
+}
+
+/* ========================================================== */
+/* inverse of matrix 
+ *
+ * Compute inverse of matrix a, returning determinant m and 
+ * inverse b
+ */
+
+#define INVERT_2X2(b,det,a)			\
+{						\
+   double tmp;					\
+   DETERMINANT_2X2 (det, a);			\
+   tmp = 1.0 / (det);				\
+   SCALE_ADJOINT_2X2 (b, tmp, a);		\
+}
+
+/* ========================================================== */
+/* inverse of matrix 
+ *
+ * Compute inverse of matrix a, returning determinant m and 
+ * inverse b
+ */
+
+#define INVERT_3X3(b,det,a)			\
+{						\
+   double tmp;					\
+   DETERMINANT_3X3 (det, a);			\
+   tmp = 1.0 / (det);				\
+   SCALE_ADJOINT_3X3 (b, tmp, a);		\
+}
+
+/* ========================================================== */
+/* inverse of matrix 
+ *
+ * Compute inverse of matrix a, returning determinant m and 
+ * inverse b
+ */
+
+#define INVERT_4X4(b,det,a)			\
+{						\
+   double tmp;					\
+   DETERMINANT_4X4 (det, a);			\
+   tmp = 1.0 / (det);				\
+   SCALE_ADJOINT_4X4 (b, tmp, a);		\
+}
+
+/* ========================================================== */
+#if defined(__cplusplus) || defined(c_plusplus)
+}
+#endif
+
+#endif /* __GUTIL_VECTOR_H__ */
+/* ===================== END OF FILE ======================== */
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Resources/Caution.tiff has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Resources/English.lproj/GLUT.nib/classes.nib	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,55 @@
+{
+    IBClasses = (
+        {
+            ACTIONS = {save = id; saveAs = id; }; 
+            CLASS = FirstResponder; 
+            LANGUAGE = ObjC; 
+            SUPERCLASS = NSObject; 
+        }, 
+        {
+            ACTIONS = {timerAction = id; }; 
+            CLASS = GLUTApplication; 
+            LANGUAGE = ObjC; 
+            OUTLETS = {
+                "_aboutMenuItem" = NSMenuItem; 
+                "_hideMenuItem" = NSMenuItem; 
+                "_quitMenuItem" = NSMenuItem; 
+            }; 
+            SUPERCLASS = NSApplication; 
+        }, 
+        {
+            ACTIONS = {toggleWindow = id; }; 
+            CLASS = GLUTClipboardController; 
+            LANGUAGE = ObjC; 
+            OUTLETS = {"_infoText" = id; "_scrollView" = id; }; 
+            SUPERCLASS = NSWindowController; 
+        }, 
+        {
+            ACTIONS = {
+                assign = id; 
+                cancel = id; 
+                inputMenu = id; 
+                invertInput = id; 
+                mouseMatrix = id; 
+                mousePreset = id; 
+                ok = id; 
+                setDefault = id; 
+            }; 
+            CLASS = GLUTPreferencesController; 
+            LANGUAGE = ObjC; 
+            OUTLETS = {
+                assignPrompt = NSTextField; 
+                assignText = NSTextField; 
+                inputMenu = NSPopUpButton; 
+                inverted = NSButton; 
+                mbConfigMenu = NSPopUpButton; 
+                mbConfigWarningIcon = NSImageView; 
+                mbConfigWarningText = NSTextField; 
+                middleButtonMatrix = NSMatrix; 
+                rightButtonMatrix = NSMatrix; 
+            }; 
+            SUPERCLASS = NSWindowController; 
+        }
+    ); 
+    IBVersion = 1; 
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Resources/English.lproj/GLUT.nib/info.nib	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>IBDocumentLocation</key>
+	<string>4 104 410 240 0 0 1152 848 </string>
+	<key>IBEditorPositions</key>
+	<dict>
+		<key>29</key>
+		<string>19 615 246 44 0 0 1152 848 </string>
+	</dict>
+	<key>IBFramework Version</key>
+	<string>291.0</string>
+	<key>IBGroupedObjects</key>
+	<dict/>
+	<key>IBLastGroupID</key>
+	<string>1</string>
+	<key>IBOpenObjects</key>
+	<array>
+		<integer>29</integer>
+	</array>
+	<key>IBSystem Version</key>
+	<string>6I32</string>
+</dict>
+</plist>
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Resources/English.lproj/GLUT.nib/objects.nib has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Resources/English.lproj/GLUTClipboard.nib/classes.nib	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,13 @@
+{
+    IBClasses = (
+        {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, 
+        {
+            ACTIONS = {toggleWindow = id; }; 
+            CLASS = GLUTClipboardController; 
+            LANGUAGE = ObjC; 
+            OUTLETS = {_infoText = id; _scrollView = id; }; 
+            SUPERCLASS = NSWindowController; 
+        }
+    ); 
+    IBVersion = 1; 
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Resources/English.lproj/GLUTClipboard.nib/info.nib	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist SYSTEM "file://localhost/System/Library/DTDs/PropertyList.dtd">
+<plist version="0.9">
+<dict>
+	<key>IBDocumentLocation</key>
+	<string>63 221 356 240 0 0 1600 1178 </string>
+	<key>IBFramework Version</key>
+	<string>263.2</string>
+	<key>IBSystem Version</key>
+	<string>5S41</string>
+</dict>
+</plist>
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Resources/English.lproj/GLUTClipboard.nib/objects.nib has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Resources/English.lproj/GLUTPreferences.nib/classes.nib	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,73 @@
+{
+    IBClasses = (
+        {
+            ACTIONS = {save = id; saveAs = id; }; 
+            CLASS = FirstResponder; 
+            LANGUAGE = ObjC; 
+            SUPERCLASS = NSObject; 
+        }, 
+        {
+            ACTIONS = {
+                cancel = id; 
+                joyAssign = id; 
+                joyDevice = id; 
+                joyElement = id; 
+                joyInvert = id; 
+                launchDebugMode = id; 
+                launchGamemodeCaptureSingle = id; 
+                launchIconic = id; 
+                launchUseCurrWD = id; 
+                launchUseExtDesktop = id; 
+                launchUseMacOSCoords = id; 
+                mouseEanbleEmulation = id; 
+                mouseMiddleMenu = id; 
+                mouseRightMenu = id; 
+                ok = id; 
+                spaceAssign = id; 
+                spaceDevice = id; 
+                spaceElement = id; 
+                spaceInvert = id; 
+            }; 
+            CLASS = GLUTPreferencesController; 
+            LANGUAGE = ObjC; 
+            OUTLETS = {
+                joyAssign = NSButton; 
+                joyAssignNote = NSTextField; 
+                joyAssignWarningIcon = NSImageView; 
+                joyDeviceMenu = NSPopUpButton; 
+                joyElement = NSTextField; 
+                joyInputMenu = NSPopUpButton; 
+                joyInverted = NSButton; 
+                launchDebugMode = NSButton; 
+                launchFadeTime = NSTextField; 
+                launchGamemodeCaptureSingle = NSButton; 
+                launchIconic = NSButton; 
+                launchInitHeight = NSTextField; 
+                launchInitWidth = NSTextField; 
+                launchInitX = NSTextField; 
+                launchInitY = NSTextField; 
+                launchMenuIdle = NSTextField; 
+                launchSyncToVBL = NSButton; 
+                launchUseCurrWD = NSButton; 
+                launchUseExtendedDesktop = NSButton; 
+                launchUseMacOSXCoords = NSButton; 
+                mouseAssignWarningIcon = NSImageView; 
+                mouseAssignWarningText = NSTextField; 
+                mouseDetected = NSTextField; 
+                mouseEmulation = NSButton; 
+                mouseMiddleConfigMenu = NSPopUpButton; 
+                mouseRightConfigMenu = NSPopUpButton; 
+                prefsTabView = NSTabView; 
+                spaceAssign = NSButton; 
+                spaceAssignNote = NSTextField; 
+                spaceAssignWarningIcon = NSImageView; 
+                spaceDeviceMenu = NSPopUpButton; 
+                spaceElement = NSTextField; 
+                spaceInputMenu = NSPopUpButton; 
+                spaceInverted = NSButton; 
+            }; 
+            SUPERCLASS = NSWindowController; 
+        }
+    ); 
+    IBVersion = 1; 
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Resources/English.lproj/GLUTPreferences.nib/info.nib	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>IBDocumentLocation</key>
+	<string>16 329 410 240 0 0 1920 1178 </string>
+	<key>IBFramework Version</key>
+	<string>439.0</string>
+	<key>IBOpenObjects</key>
+	<array>
+		<integer>205</integer>
+	</array>
+	<key>IBSystem Version</key>
+	<string>8G32</string>
+</dict>
+</plist>
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Resources/English.lproj/GLUTPreferences.nib/objects.nib has changed
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Resources/English.lproj/GLUTUI.strings has changed
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Resources/English.lproj/InfoPlist.strings has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Resources/Info.plist	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>CFBundleDevelopmentRegion</key>
+	<string>English</string>
+	<key>CFBundleExecutable</key>
+	<string>GLUT</string>
+	<key>CFBundleGetInfoString</key>
+	<string>3.4.0, Copyright (c) 2001-2008 Apple Inc., All Rights Reserved</string>
+	<key>CFBundleIdentifier</key>
+	<string>com.apple.glut</string>
+	<key>CFBundleInfoDictionaryVersion</key>
+	<string>6.0</string>
+	<key>CFBundlePackageType</key>
+	<string>FMWK</string>
+	<key>CFBundleShortVersionString</key>
+	<string>3.4.0</string>
+	<key>CFBundleSignature</key>
+	<string>????</string>
+	<key>CFBundleVersion</key>
+	<string>GLUT-3.4.0</string>
+</dict>
+</plist>
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Resources/blankCursor.tiff has changed
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Resources/bottomCursor.tiff has changed
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Resources/bottomleftCursor.tiff has changed
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Resources/bottomrightCursor.tiff has changed
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Resources/crossCursor.tiff has changed
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Resources/cycleCursor.tiff has changed
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Resources/destroyCursor.tiff has changed
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Resources/fingerCursor.tiff has changed
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Resources/helpCursor.tiff has changed
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Resources/leftCursor.tiff has changed
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Resources/leftRightCursor.tiff has changed
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Resources/rightArrowCursor.tiff has changed
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Resources/rightCursor.tiff has changed
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Resources/sprayCursor.tiff has changed
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Resources/topCursor.tiff has changed
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Resources/topleftCursor.tiff has changed
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Resources/toprightCursor.tiff has changed
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Resources/upDownCursor.tiff has changed
Binary file bin/MelodyTriangle.app/Contents/Frameworks/GLUT.framework/Versions/Current/Resources/waitCursor.tiff has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/Info.plist	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>BuildMachineOSBuild</key>
+	<string>10K549</string>
+	<key>CFBundleDevelopmentRegion</key>
+	<string>English</string>
+	<key>CFBundleExecutable</key>
+	<string>MelodyTriangle</string>
+	<key>CFBundleIdentifier</key>
+	<string>com.yourcompany.openFrameworks</string>
+	<key>CFBundleInfoDictionaryVersion</key>
+	<string>6.0</string>
+	<key>CFBundlePackageType</key>
+	<string>APPL</string>
+	<key>CFBundleSignature</key>
+	<string>????</string>
+	<key>CFBundleVersion</key>
+	<string>1.0</string>
+	<key>DTCompiler</key>
+	<string></string>
+	<key>DTPlatformBuild</key>
+	<string>10M2518</string>
+	<key>DTPlatformVersion</key>
+	<string>PG</string>
+	<key>DTSDKBuild</key>
+	<string>10K549</string>
+	<key>DTSDKName</key>
+	<string></string>
+	<key>DTXcode</key>
+	<string>0400</string>
+	<key>DTXcodeBuild</key>
+	<string>10M2518</string>
+</dict>
+</plist>
Binary file bin/MelodyTriangle.app/Contents/MacOS/MelodyTriangle has changed
Binary file bin/MelodyTriangle.app/Contents/MacOS/libfmodex.dylib has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/MelodyTriangle.app/Contents/PkgInfo	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,1 @@
+APPL????
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/Voice.cpp	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,50 @@
+/*
+ *  Voice.cpp
+ *  MelodyTriangle
+ *
+ *  Created by Henrik Ekeus on 12/01/2012.
+ *  Copyright 2012 Queen Mary University of London. All rights reserved.
+ *
+ */
+
+#include "Voice.h"
+
+Voice::Voice(int id, int x, int y){
+	this->id=id;
+	posx=x;
+	posy=y;
+	isActive=true;
+	radius=15;
+	inTriangle=false;
+	octave=0;
+	highlight=false;
+}
+
+Voice::Voice(){}
+
+void Voice::draw(){
+	ofSetColor(255,0,0);
+	
+	if (isActive){
+		
+		ofFill();
+	}else {
+		ofNoFill();
+	}
+	ofCircle(posx, posy, radius);
+	if (highlight){
+		ofNoFill();
+		ofSetColor(255, 255, 255);
+		ofCircle(posx, posy, radius);
+	}
+}
+
+bool Voice::isInVoice(int x, int y){
+	if (ofDist(x, y, posx, posy)<=radius){
+		return true;
+	}else {
+		return false;
+	}
+
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/Voice.h	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,27 @@
+/*
+ *  Voice.h
+ *  MelodyTriangle
+ *
+ *  Created by Henrik Ekeus on 12/01/2012.
+ *  Copyright 2012 Queen Mary University of London. All rights reserved.
+ *
+ */
+#include "ofMain.h"
+class Voice  {
+public:
+	
+	void draw();
+	Voice(int id, int x, int y);
+	Voice();
+	bool isInVoice(int x, int y);
+	
+	int id;
+	int posx,posy;
+	bool isActive;
+	bool inTriangle;
+	int radius;
+	int octave;
+	bool highlight;
+	
+	
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main.cpp	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,28 @@
+#include "ofMain.h"
+#include "melodyTriangle.h"
+#include "ofAppGlutWindow.h"
+
+#define HOST "localhost"
+#define PORT 7770
+#define NUMVOICES 3
+
+//========================================================================
+int main(int argc, const char **argv ){
+	
+    ofAppGlutWindow window;
+	
+	if (argc>4 ? atoi(argv[4]) : false){
+		ofSetupOpenGL(&window, 1280,800, OF_FULLSCREEN);			// <-------- setup the GL context
+	}else{
+		ofSetupOpenGL(&window, 800,600, OF_WINDOW);
+	}
+	// this kicks off the running of my app
+	// can be OF_WINDOW or OF_FULLSCREEN
+	// pass in width and height too:
+	ofRunApp( new melodyTriangle(argc>1 ? argv[1] : HOST, 
+								 argc>2 ? atoi(argv[2]) : PORT,
+								 argc>3 ? atoi(argv[3]) : NUMVOICES,
+								 argc>5 ? atoi(argv[5]) : true,
+								 argc>6 ? atoi(argv[6]) : 0));
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/melodyTriangle.cpp	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,434 @@
+#include "melodyTriangle.h"
+#include <GLUT/GLUT.h> 
+
+/*
+ /birth id
+ /death id
+ /start id
+ /stop id
+ /track id x y left right top bottom area  
+ /tempo 
+ 
+ 
+ */
+melodyTriangle::melodyTriangle(const char *host, int port, int numVoices, bool enableKeys,int voiceIdOffset){
+	printf("in constructor: %s %i %i %i\n",host,port,numVoices,enableKeys);
+	this->numVoices=numVoices;
+	this->enableKeys=enableKeys;
+	this->voiceIdOffset=voiceIdOffset;
+	//voices=*Voice[numVoices];
+	sender.setup( host,port );
+}
+
+//--------------------------------------------------------------
+void melodyTriangle::setup(){
+	//voices = new Voice[NUMVOICES];
+	
+	ofSetCircleResolution(100);
+	ofBackground(0,0,0);
+	ofSetWindowTitle("Melody Triangle");
+	triangleHeight=ofGetHeight()*0.75;
+	ofSetFrameRate(40); // if vertical sync is off, we can go a bit fast... this caps the framerate at 60fps.
+	ofEnableSmoothing();
+	x1=ofGetWidth()/2;
+	y1=(ofGetHeight()-triangleHeight)/2;
+	x2=ofGetWidth()/2-triangleHeight/sqrt(3);
+	y2=ofGetHeight()-(ofGetHeight()-triangleHeight)/2;
+	x3=ofGetWidth()/2+triangleHeight/sqrt(3);
+	y3=y2;
+	
+	ofxOscMessage m;
+	m.setAddress( "/calibrate" );
+	m.addIntArg( x1 );
+	m.addIntArg( y1 );
+	m.addIntArg( x2 );
+	m.addIntArg( y2 );
+	m.addIntArg( x3 );
+	m.addIntArg( y3 );
+	sender.sendMessage( m );
+	printf("sent /calibrate %i %i %i %i %i %i\n",x1,y1,x2,y2,x3,y3);
+	
+	for (int i=0;i<numVoices;i++){
+		
+		voices[i]=new Voice(i+1+voiceIdOffset,x2+15,y1+20+i*30);
+	}
+	voiceGrabbed=-1;
+}
+
+//--------------------------------------------------------------
+void melodyTriangle::update(){
+}
+
+bool melodyTriangle::isInTriangle(int x, int y){
+	if (x>x2 && x<x3 && y>y1 && y<y2){
+		//printf("in bounding box\n");
+		float dx=abs(x-x1);
+		float dy=abs(y-y1);
+		//printf("tan(30)- dx/dy: %f\n",tan(30*PI/180)-dx/dy);
+		
+		if (dx/dy < tan(30*PI/180)){
+			
+			//printf("in triangle \n");
+			return true;
+		}else {
+			//printf("not in triangle \n");
+			return false;
+		}
+
+	}else{
+		//printf("not in bounding box \n");
+		return false;
+	}
+}
+
+void melodyTriangle::sendStatus(Voice v){
+	
+	ofxOscMessage m;
+	///track id x y left right top bottom area  
+	m.setAddress( "/track2d" );
+	m.addIntArg( v.id );
+	m.addIntArg( v.posx );
+	m.addIntArg( v.posy );
+	sender.sendMessage( m );
+	printf("sent - /track2d %i %i %i\n",v.id,v.posx,v.posy);
+	
+}
+
+//--------------------------------------------------------------
+void melodyTriangle::draw(){
+
+	
+	//let's draw our triangle
+	ofSetColor(0,0,255);
+	
+	ofFill();		
+	ofTriangle(x1, y1, x2, y2, x3, y3);
+	bool sendStart=false;
+	if (voiceGrabbed!=-1){
+		if (mouseX!=(*voices[voiceGrabbed]).posx || mouseY!=(*voices[voiceGrabbed]).posy){
+			//(*voices[voiceGrabbed]).posx=mouseX;
+			//(*voices[voiceGrabbed]).posy=mouseY;
+			if ((*voices[voiceGrabbed]).inTriangle && !isInTriangle(mouseX,mouseY)){
+			    ///death id
+				
+				if (ofDist((*voices[voiceGrabbed]).posx, (*voices[voiceGrabbed]).posy, mouseX, mouseY) > (*voices[voiceGrabbed]).radius*2){ 
+				
+				ofxOscMessage m;
+				///track id x y left right top bottom area  
+				m.setAddress( "/death" );
+				m.addIntArg( (*voices[voiceGrabbed]).id );
+				sender.sendMessage( m );
+				
+				printf("sent /death %i \n",(*voices[voiceGrabbed]).id);
+				(*voices[voiceGrabbed]).posx=mouseX;
+				(*voices[voiceGrabbed]).posy=mouseY;
+
+				} else {
+					//printf("e");
+					//On Edge
+				}
+
+			}else{
+				(*voices[voiceGrabbed]).posx=mouseX;
+				(*voices[voiceGrabbed]).posy=mouseY;
+				//(*voices[voiceGrabbed]).posx=(*voices[voiceGrabbed]).posx*0.9+mouseX*0.1;
+				//(*voices[voiceGrabbed]).posy=(*voices[voiceGrabbed]).posy*0.9+mouseY*0.1;
+				
+				
+			}
+			if (!(*voices[voiceGrabbed]).inTriangle && isInTriangle(mouseX,mouseY)){
+				//birth id
+				
+				ofxOscMessage m;
+				///track id x y left right top bottom area  
+				m.setAddress( "/birth" );
+				m.addIntArg( (*voices[voiceGrabbed]).id );
+				sender.sendMessage( m );
+				
+				printf("sent /birth %i \n",(*voices[voiceGrabbed]).id);
+				sendStart=true;
+			}
+			
+			
+			//(*voices[voiceGrabbed]).inTriangle = isInTriangle(mouseX,mouseY);
+			
+			(*voices[voiceGrabbed]).inTriangle = isInTriangle((*voices[voiceGrabbed]).posx,(*voices[voiceGrabbed]).posy);
+			
+			if ((*voices[voiceGrabbed]).inTriangle){
+				sendStatus(*voices[voiceGrabbed]);
+				if (sendStart){
+					if ((*voices[voiceGrabbed]).isActive){
+						ofxOscMessage m;
+						///track id x y left right top bottom area  
+						m.setAddress( "/start" );
+						m.addIntArg( (*voices[voiceGrabbed]).id );
+						sender.sendMessage( m );
+						printf("sent /start %i \n",(*voices[voiceGrabbed]).id);
+					}
+				}
+			}
+			
+		}
+	};
+	for (int i=0; i<numVoices; i++){
+		(*voices[i]).draw();
+	}
+	
+	
+}
+
+
+//--------------------------------------------------------------
+void melodyTriangle::keyPressed  (int key){
+	//printf("key %i",key);
+	if (enableKeys){
+	if (key == 'a'){
+		for (int i=0; i<numVoices; i++){
+				if ((*voices[i]).isInVoice(mouseX,mouseY)){
+					
+					(*voices[i]).isActive=!(*voices[i]).isActive;
+					///start id
+					///stop id
+					if ((*voices[i]).isActive){
+						ofxOscMessage m;
+						///track id x y left right top bottom area  
+						m.setAddress( "/start" );
+						m.addIntArg( (*voices[i]).id );
+						sender.sendMessage( m );
+						printf("sent /start %i \n",(*voices[i]).id);
+					}else {
+						ofxOscMessage m;
+						///track id x y left right top bottom area  
+						m.setAddress( "/stop" );
+						m.addIntArg( (*voices[i]).id );
+						sender.sendMessage( m );
+						printf("sent /stop %i \n",(*voices[i]).id);
+						
+					}
+
+				}
+		}
+	}
+	if (key == OF_KEY_UP){
+		for (int i=0; i<numVoices; i++){
+			if ((*voices[i]).isInVoice(mouseX,mouseY)){
+				
+				ofxOscMessage m;
+				///track id x y left right top bottom area  
+				m.setAddress( "/period" );
+				m.addIntArg( (*voices[i]).id );
+				m.addIntArg(1);
+				m.addIntArg(2);
+				sender.sendMessage( m );
+				printf("sent /period %i %i %i\n",(*voices[i]).id,1,2);
+				
+			}
+		}
+	}
+	if (key == OF_KEY_DOWN){
+		for (int i=0; i<numVoices; i++){
+			if ((*voices[i]).isInVoice(mouseX,mouseY)){
+				ofxOscMessage m;
+				///track id x y left right top bottom area  
+				m.setAddress( "/period" );
+				m.addIntArg( (*voices[i]).id );
+				m.addIntArg(2);
+				m.addIntArg(1);
+				sender.sendMessage( m );
+				printf("sent /period %i %i %i\n",(*voices[i]).id,2,1);
+			}
+		}
+	}
+	
+	if (key == '.'){
+		for (int i=0; i<numVoices; i++){
+			if ((*voices[i]).isInVoice(mouseX,mouseY)){
+				ofxOscMessage m;
+				///track id x y left right top bottom area  
+				m.setAddress( "/period" );
+				m.addIntArg( (*voices[i]).id );
+				m.addIntArg(1);
+				m.addIntArg(3);
+				sender.sendMessage( m );
+				printf("sent /period %i %i %i\n",(*voices[i]).id,1,3);
+			}
+		}
+		
+	}
+	if (key == ','){
+		for (int i=0; i<numVoices; i++){
+			if ((*voices[i]).isInVoice(mouseX,mouseY)){
+				ofxOscMessage m;
+				///track id x y left right top bottom area  
+				m.setAddress( "/period" );
+				m.addIntArg( (*voices[i]).id );
+				m.addIntArg(3);
+				m.addIntArg(1);
+				sender.sendMessage( m );
+				printf("sent /period %i %i %i\n",(*voices[i]).id,3,1);
+			}
+		}
+		
+	}
+	if (key == OF_KEY_LEFT){
+		for (int i=0; i<numVoices; i++){
+			if ((*voices[i]).isInVoice(mouseX,mouseY)){
+				
+				ofxOscMessage m;
+				///track id x y left right top bottom area  
+				m.setAddress( "/shift" );
+				m.addIntArg( (*voices[i]).id );
+				m.addIntArg(-1);
+				m.addIntArg(2);
+				sender.sendMessage( m );
+				printf("sent /shift %i %i %i\n",(*voices[i]).id,-1,2);
+				
+			}
+		}
+	}
+	if (key == OF_KEY_RIGHT){
+		for (int i=0; i<numVoices; i++){
+			if ((*voices[i]).isInVoice(mouseX,mouseY)){
+				
+					
+					ofxOscMessage m;
+					///track id x y left right top bottom area  
+					m.setAddress( "/shift" );
+					m.addIntArg( (*voices[i]).id );
+					m.addIntArg(1);
+					m.addIntArg(2);
+					sender.sendMessage( m );
+					printf("sent /shift %i %i %i\n",(*voices[i]).id,1,2);
+				
+			}
+		}
+	}
+	if (key == '1'){
+		
+				ofxOscMessage m;
+				///track id x y left right top bottom area  
+				m.setAddress( "/tempo" );
+				m.addIntArg(30);
+				sender.sendMessage( m );
+				printf("sent /tempo 30\n");
+		
+	}
+	if (key == '2'){
+		ofxOscMessage m;
+		///track id x y left right top bottom area  
+		m.setAddress( "/tempo" );
+		m.addIntArg(60);
+		sender.sendMessage( m );
+		printf("sent /tempo 60\n");
+	}
+	if (key == '3'){
+		ofxOscMessage m;
+		///track id x y left right top bottom area  
+		m.setAddress( "/tempo" );
+		m.addIntArg(90);
+		sender.sendMessage( m );
+		printf("sent /tempo 90\n");
+	}
+	if (key == '4'){
+		ofxOscMessage m;
+		///track id x y left right top bottom area  
+		m.setAddress( "/tempo" );
+		m.addIntArg(120);
+		sender.sendMessage( m );
+		printf("sent /tempo 120\n");
+	}
+	if (key == '+'){
+		for (int i=0; i<numVoices; i++){
+			if ((*voices[i]).isInVoice(mouseX,mouseY)){
+				
+				(*voices[i]).octave++;
+				ofxOscMessage m;
+				///track id x y left right top bottom area  
+				m.setAddress( "/octave" );
+				m.addIntArg( (*voices[i]).id );
+				m.addIntArg((*voices[i]).octave);
+				
+				sender.sendMessage( m );
+				printf("sent /octave %i %i \n",(*voices[i]).id,(*voices[i]).octave);
+				
+			}
+		}
+	}
+	
+	if (key == '-'){
+		for (int i=0; i<numVoices; i++){
+			if ((*voices[i]).isInVoice(mouseX,mouseY)){
+				
+				(*voices[i]).octave--;
+				ofxOscMessage m;
+				///track id x y left right top bottom area  
+				m.setAddress( "/octave" );
+				m.addIntArg( (*voices[i]).id );
+				m.addIntArg((*voices[i]).octave);
+				
+				sender.sendMessage( m );
+				printf("sent /octave %i %i \n",(*voices[i]).id,(*voices[i]).octave);
+				
+			}
+		}
+	}
+	}
+	if (key == ' '){
+		
+		ofxOscMessage m;
+		///track id x y left right top bottom area  
+		m.setAddress( "/marker" );
+		sender.sendMessage(m);
+		printf("sent /marker\n");
+	}
+}
+
+//--------------------------------------------------------------
+void melodyTriangle::keyReleased  (int key){
+
+}
+
+//--------------------------------------------------------------
+void melodyTriangle::mouseMoved(int x, int y ){
+	for (int i=0; i<numVoices;i++){
+		if ((*voices[i]).isInVoice(x,y)){
+			(*voices[i]).highlight=true;
+		}else {
+			(*voices[i]).highlight=false;
+		}
+
+	}
+	
+	
+}
+
+//--------------------------------------------------------------
+void melodyTriangle::mouseDragged(int x, int y, int button){
+	
+}
+
+//--------------------------------------------------------------
+void melodyTriangle::mousePressed(int x, int y, int button){
+	
+	for (int i=0; i<numVoices;i++){
+		if ((*voices[i]).isInVoice(x,y)){
+			voiceGrabbed=i;
+			//printf("grabbed %i",voiceGrabbed);
+		}else{
+			//printf("didnt grab %i",i);
+		}
+	}
+}
+
+
+
+//--------------------------------------------------------------
+void melodyTriangle::mouseReleased(int x, int y, int button){
+	//printf("released %i",voiceGrabbed);
+	voiceGrabbed=-1;
+}
+
+//--------------------------------------------------------------
+void melodyTriangle::windowResized(int w, int h){
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/melodyTriangle.h	Wed Jan 25 16:30:07 2012 +0000
@@ -0,0 +1,45 @@
+
+
+#include "ofMain.h"
+#include "Voice.h"
+
+#include "ofxOsc.h"
+
+
+
+
+
+class melodyTriangle : public ofBaseApp{
+	
+	public:
+		melodyTriangle(const char *host, int port, int numVoices, bool enableKeys, int voiceIdOffset);
+		
+		void setup();
+		void update();
+		void draw();
+		
+		void keyPressed(int key);
+		void keyReleased(int key);
+		void mouseMoved(int x, int y );
+		void mouseDragged(int x, int y, int button);
+		void mousePressed(int x, int y, int button);
+		void mouseReleased(int x, int y, int button);
+		void windowResized(int w, int h);
+		int numVoices;
+		int voiceIdOffset;	
+		bool enableKeys;
+		float 	counter;
+		bool	bSmooth;
+		//Voice *voices[NUMVOICES];
+		Voice *voices[10];
+	
+		int x1,y1,x2,y2,x3,y3;//Triangle Coords
+		int triangleHeight;
+		int voiceGrabbed;
+	    void sendStatus(Voice v);
+	    bool isInTriangle(int x, int y);
+		
+	
+	private:
+		ofxOscSender sender;
+};