From 0b48b1c76babf7da1fd8803c3a4aac35b724ae1f Mon Sep 17 00:00:00 2001 From: "erwin.coumans" Date: Sun, 18 May 2008 00:38:17 +0000 Subject: [PATCH] Added Mac OSX XCode project with Cocoa userinterface (wrapping GLUT) for Bullet demos Thanks to TomorrowPlus for the constribution! --- .../TemplateIcon.icns | Bin 0 -> 52318 bytes .../AllBulletDemos.xcodeproj/project.pbxproj | 1857 +++++++++++++++ .../AllBulletDemos.xcodeproj/zakariya.pbxuser | 248 ++ .../zakariya.perspectivev3 | 1517 ++++++++++++ .../AllBulletDemos_Prefix.pch | 7 + Extras/AllBulletDemosOSX/BulletIcon.icns | Bin 0 -> 28472 bytes Extras/AllBulletDemosOSX/BulletIcon.psd | Bin 0 -> 101941 bytes .../English.lproj/Credits.rtf | 11 + .../English.lproj/InfoPlist.strings | Bin 0 -> 92 bytes .../English.lproj/MainMenu.xib | 2095 +++++++++++++++++ Extras/AllBulletDemosOSX/Info.plist | 28 + Extras/AllBulletDemosOSX/README.txt | 6 + Extras/AllBulletDemosOSX/main.m | 14 + Extras/AllBulletDemosOSX/src/BTDemo.h | 103 + Extras/AllBulletDemosOSX/src/BTDemo.mm | 390 +++ .../src/BTDemosAppController.h | 54 + .../src/BTDemosAppController.m | 151 ++ .../src/BTSimulationParameters.h | 44 + .../src/BTSimulationParameters.m | 85 + .../src/toolkit/BTFullscreenWindow.h | 25 + .../src/toolkit/BTFullscreenWindow.m | 48 + .../src/toolkit/BTGLUTKeyAdapter.h | 46 + .../src/toolkit/BTGLUTKeyAdapter.m | 128 + .../src/toolkit/BTOpenGLDisplayDelegate.h | 50 + .../src/toolkit/BTOpenGLView.h | 65 + .../src/toolkit/BTOpenGLView.m | 603 +++++ 26 files changed, 7575 insertions(+) create mode 100644 Extras/AllBulletDemosOSX/AllBulletDemos.xcodeproj/TemplateIcon.icns create mode 100644 Extras/AllBulletDemosOSX/AllBulletDemos.xcodeproj/project.pbxproj create mode 100644 Extras/AllBulletDemosOSX/AllBulletDemos.xcodeproj/zakariya.pbxuser create mode 100644 Extras/AllBulletDemosOSX/AllBulletDemos.xcodeproj/zakariya.perspectivev3 create mode 100644 Extras/AllBulletDemosOSX/AllBulletDemos_Prefix.pch create mode 100644 Extras/AllBulletDemosOSX/BulletIcon.icns create mode 100644 Extras/AllBulletDemosOSX/BulletIcon.psd create mode 100644 Extras/AllBulletDemosOSX/English.lproj/Credits.rtf create mode 100644 Extras/AllBulletDemosOSX/English.lproj/InfoPlist.strings create mode 100644 Extras/AllBulletDemosOSX/English.lproj/MainMenu.xib create mode 100644 Extras/AllBulletDemosOSX/Info.plist create mode 100644 Extras/AllBulletDemosOSX/README.txt create mode 100644 Extras/AllBulletDemosOSX/main.m create mode 100644 Extras/AllBulletDemosOSX/src/BTDemo.h create mode 100644 Extras/AllBulletDemosOSX/src/BTDemo.mm create mode 100644 Extras/AllBulletDemosOSX/src/BTDemosAppController.h create mode 100644 Extras/AllBulletDemosOSX/src/BTDemosAppController.m create mode 100644 Extras/AllBulletDemosOSX/src/BTSimulationParameters.h create mode 100644 Extras/AllBulletDemosOSX/src/BTSimulationParameters.m create mode 100644 Extras/AllBulletDemosOSX/src/toolkit/BTFullscreenWindow.h create mode 100644 Extras/AllBulletDemosOSX/src/toolkit/BTFullscreenWindow.m create mode 100644 Extras/AllBulletDemosOSX/src/toolkit/BTGLUTKeyAdapter.h create mode 100644 Extras/AllBulletDemosOSX/src/toolkit/BTGLUTKeyAdapter.m create mode 100644 Extras/AllBulletDemosOSX/src/toolkit/BTOpenGLDisplayDelegate.h create mode 100644 Extras/AllBulletDemosOSX/src/toolkit/BTOpenGLView.h create mode 100644 Extras/AllBulletDemosOSX/src/toolkit/BTOpenGLView.m diff --git a/Extras/AllBulletDemosOSX/AllBulletDemos.xcodeproj/TemplateIcon.icns b/Extras/AllBulletDemosOSX/AllBulletDemos.xcodeproj/TemplateIcon.icns new file mode 100644 index 0000000000000000000000000000000000000000..62cb7015e09d6ea3e65d7f7949c4c07f9246a908 GIT binary patch literal 52318 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 WhsmLR^b3` + + + + ActivePerspectiveName + Project + AllowedModules + + + BundleLoadPath + + MaxInstances + n + Module + PBXSmartGroupTreeModule + Name + Groups and Files Outline View + + + BundleLoadPath + + MaxInstances + n + Module + PBXNavigatorGroup + Name + Editor + + + BundleLoadPath + + MaxInstances + n + Module + XCTaskListModule + Name + Task List + + + BundleLoadPath + + MaxInstances + n + Module + XCDetailModule + Name + File and Smart Group Detail Viewer + + + BundleLoadPath + + MaxInstances + 1 + Module + PBXBuildResultsModule + Name + Detailed Build Results Viewer + + + BundleLoadPath + + MaxInstances + 1 + Module + PBXProjectFindModule + Name + Project Batch Find Tool + + + BundleLoadPath + + MaxInstances + n + Module + XCProjectFormatConflictsModule + Name + Project Format Conflicts List + + + BundleLoadPath + + MaxInstances + n + Module + PBXBookmarksModule + Name + Bookmarks Tool + + + BundleLoadPath + + MaxInstances + n + Module + PBXClassBrowserModule + Name + Class Browser + + + BundleLoadPath + + MaxInstances + n + Module + PBXCVSModule + Name + Source Code Control Tool + + + BundleLoadPath + + MaxInstances + n + Module + PBXDebugBreakpointsModule + Name + Debug Breakpoints Tool + + + BundleLoadPath + + MaxInstances + n + Module + XCDockableInspector + Name + Inspector + + + BundleLoadPath + + MaxInstances + n + Module + PBXOpenQuicklyModule + Name + Open Quickly Tool + + + BundleLoadPath + + MaxInstances + 1 + Module + PBXDebugSessionModule + Name + Debugger + + + BundleLoadPath + + MaxInstances + 1 + Module + PBXDebugCLIModule + Name + Debug Console + + + BundleLoadPath + + MaxInstances + n + Module + XCSnapshotModule + Name + Snapshots Tool + + + BundlePath + /Developer/Library/PrivateFrameworks/DevToolsInterface.framework/Resources + Description + AIODescriptionKey + DockingSystemVisible + + Extension + perspectivev3 + FavBarConfig + + PBXProjectModuleGUID + 36C69D140DC9E7C30034504A + XCBarModuleItemNames + + XCBarModuleItems + + + FirstTimeWindowDisplayed + + Identifier + com.apple.perspectives.project.defaultV3 + MajorVersion + 34 + MinorVersion + 0 + Name + All-In-One + Notifications + + + XCObserverAutoDisconnectKey + + XCObserverDefintionKey + + PBXStatusErrorsKey + 0 + + XCObserverFactoryKey + XCPerspectivesSpecificationIdentifier + XCObserverGUIDKey + XCObserverProjectIdentifier + XCObserverNotificationKey + PBXStatusBuildStateMessageNotification + XCObserverTargetKey + XCMainBuildResultsModuleGUID + XCObserverTriggerKey + awakenModuleWithObserver: + XCObserverValidationKey + + PBXStatusErrorsKey + 2 + + + + XCObserverAutoDisconnectKey + + XCObserverDefintionKey + + PBXStatusWarningsKey + 0 + + XCObserverFactoryKey + XCPerspectivesSpecificationIdentifier + XCObserverGUIDKey + XCObserverProjectIdentifier + XCObserverNotificationKey + PBXStatusBuildStateMessageNotification + XCObserverTargetKey + XCMainBuildResultsModuleGUID + XCObserverTriggerKey + awakenModuleWithObserver: + XCObserverValidationKey + + PBXStatusWarningsKey + 2 + + + + OpenEditors + + PerspectiveWidths + + 1440 + 1440 + + Perspectives + + + ChosenToolbarItems + + XCToolbarPerspectiveControl + NSToolbarSeparatorItem + active-target-popup + active-executable-popup + active-buildstyle-popup + action + NSToolbarFlexibleSpaceItem + buildOrClean + build-and-goOrGo + com.apple.ide.PBXToolbarStopButton + get-info + toggle-editor + NSToolbarFlexibleSpaceItem + researchAssistant + com.apple.pbx.toolbar.searchfield + + ControllerClassBaseName + + IconName + WindowOfProject + Identifier + perspective.project + IsVertical + + Layout + + + BecomeActive + + ContentConfiguration + + PBXBottomSmartGroupGIDs + + 1C37FBAC04509CD000000102 + 1C37FAAC04509CD000000102 + 1C08E77C0454961000C914BD + 1C37FABC05509CD000000102 + 1C37FABC05539CD112110102 + E2644B35053B69B200211256 + 1C37FABC04509CD000100104 + 1CC0EA4004350EF90044410B + 1CC0EA4004350EF90041110B + 1C77FABC04509CD000000102 + + PBXProjectModuleGUID + 1CA23ED40692098700951B8B + PBXProjectModuleLabel + Files + PBXProjectStructureProvided + yes + PBXSmartGroupTreeModuleColumnData + + PBXSmartGroupTreeModuleColumnWidthsKey + + 352 + + PBXSmartGroupTreeModuleColumnsKey_v4 + + MainColumn + + + PBXSmartGroupTreeModuleOutlineStateKey_v7 + + PBXSmartGroupTreeModuleOutlineStateExpansionKey + + 29B97314FDCFA39411CA2CEA + 36A05D5A0DCBAD9000ADF289 + 36C69D250DC9E7FE0034504A + 36A05DC60DCBBAC000ADF289 + 29B97317FDCFA39411CA2CEA + + PBXSmartGroupTreeModuleOutlineStateSelectionKey + + + 20 + 18 + 0 + + + PBXSmartGroupTreeModuleOutlineStateVisibleRectKey + {{0, 0}, {352, 780}} + + PBXTopSmartGroupGIDs + + XCIncludePerspectivesSwitch + + + GeometryConfiguration + + Frame + {{0, 0}, {369, 798}} + GroupTreeTableConfiguration + + MainColumn + 352 + + RubberWindowFrame + 0 39 1440 839 0 0 1440 878 + + Module + PBXSmartGroupTreeModule + Proportion + 369pt + + + Dock + + + ContentConfiguration + + PBXProjectModuleGUID + 36C69D0F0DC9E7C30034504A + PBXProjectModuleLabel + + PBXSplitModuleInNavigatorKey + + Split0 + + PBXProjectModuleGUID + 36C69D100DC9E7C30034504A + PBXProjectModuleLabel + + + SplitCount + 1 + + StatusBarVisibility + + XCSharingToken + com.apple.Xcode.CommonNavigatorGroupSharingToken + + GeometryConfiguration + + Frame + {{0, 0}, {1066, 555}} + RubberWindowFrame + 0 39 1440 839 0 0 1440 878 + + Module + PBXNavigatorGroup + Proportion + 555pt + + + Proportion + 238pt + Tabs + + + ContentConfiguration + + PBXProjectModuleGUID + 1CA23EDF0692099D00951B8B + PBXProjectModuleLabel + Detail + + GeometryConfiguration + + Frame + {{10, 27}, {1066, 211}} + RubberWindowFrame + 0 39 1440 839 0 0 1440 878 + + Module + XCDetailModule + + + ContentConfiguration + + PBXProjectModuleGUID + 1CA23EE00692099D00951B8B + PBXProjectModuleLabel + Project Find + + GeometryConfiguration + + Frame + {{10, 27}, {1066, -27}} + + Module + PBXProjectFindModule + + + ContentConfiguration + + PBXCVSModuleFilterTypeKey + 1032 + PBXProjectModuleGUID + 1CA23EE10692099D00951B8B + PBXProjectModuleLabel + SCM Results + + GeometryConfiguration + + Frame + {{10, 31}, {603, 297}} + + Module + PBXCVSModule + + + ContentConfiguration + + PBXProjectModuleGUID + XCMainBuildResultsModuleGUID + PBXProjectModuleLabel + Build + XCBuildResultsTrigger_Collapse + 1021 + XCBuildResultsTrigger_Open + 1013 + + GeometryConfiguration + + Frame + {{10, 27}, {1066, 211}} + + Module + PBXBuildResultsModule + + + + + Proportion + 1066pt + + + Name + Project + ServiceClasses + + XCModuleDock + PBXSmartGroupTreeModule + XCModuleDock + PBXNavigatorGroup + XCDockableTabModule + XCDetailModule + PBXProjectFindModule + PBXCVSModule + PBXBuildResultsModule + + TableOfContents + + 3699D2370DCF89C9001D9494 + 1CA23ED40692098700951B8B + 3699D2380DCF89C9001D9494 + 36C69D0F0DC9E7C30034504A + 3699D2390DCF89C9001D9494 + 1CA23EDF0692099D00951B8B + 1CA23EE00692099D00951B8B + 1CA23EE10692099D00951B8B + XCMainBuildResultsModuleGUID + + ToolbarConfiguration + xcode.toolbar.config.defaultV3 + + + ChosenToolbarItems + + XCToolbarPerspectiveControl + NSToolbarSeparatorItem + build-and-go + go + NSToolbarFlexibleSpaceItem + debugger-fix-and-continue + debugger-restart-executable + debugger-pause + debugger-step-over + debugger-step-into + debugger-step-out + debugger-step-instruction + NSToolbarFlexibleSpaceItem + + ControllerClassBaseName + PBXDebugSessionModule + IconName + DebugTabIcon + Identifier + perspective.debug + IsVertical + + Layout + + + ContentConfiguration + + PBXProjectModuleGUID + 1CCC7628064C1048000F2A68 + PBXProjectModuleLabel + Debugger Console + + GeometryConfiguration + + Frame + {{0, 0}, {1440, 238}} + + Module + PBXDebugCLIModule + Proportion + 238pt + + + ContentConfiguration + + Debugger + + HorizontalSplitView + + _collapsingFrameDimension + 0.0 + _indexOfCollapsedView + 0 + _percentageOfCollapsedView + 0.0 + isCollapsed + yes + sizes + + {{0, 0}, {703, 268}} + {{703, 0}, {737, 268}} + + + VerticalSplitView + + _collapsingFrameDimension + 0.0 + _indexOfCollapsedView + 0 + _percentageOfCollapsedView + 0.0 + isCollapsed + yes + sizes + + {{0, 0}, {1440, 268}} + {{0, 268}, {1440, 287}} + + + + LauncherConfigVersion + 8 + PBXProjectModuleGUID + 1CCC7629064C1048000F2A68 + PBXProjectModuleLabel + Debug + + GeometryConfiguration + + DebugConsoleVisible + None + DebugConsoleWindowFrame + {{200, 200}, {500, 300}} + DebugSTDIOWindowFrame + {{200, 200}, {500, 300}} + Frame + {{0, 243}, {1440, 555}} + PBXDebugSessionStackFrameViewKey + + DebugVariablesTableConfiguration + + Name + 120 + Value + 85 + Summary + 507 + + Frame + {{703, 0}, {737, 268}} + + + Module + PBXDebugSessionModule + Proportion + 555pt + + + Name + Debug + ServiceClasses + + XCModuleDock + PBXDebugCLIModule + PBXDebugSessionModule + PBXDebugProcessAndThreadModule + PBXDebugProcessViewModule + PBXDebugThreadViewModule + PBXDebugStackFrameViewModule + PBXNavigatorGroup + + TableOfContents + + 3699D2080DCF68BE001D9494 + 1CCC7628064C1048000F2A68 + 1CCC7629064C1048000F2A68 + 3699D2090DCF68BE001D9494 + 3699D20A0DCF68BE001D9494 + 3699D20B0DCF68BE001D9494 + 3699D20C0DCF68BE001D9494 + 36C69D0F0DC9E7C30034504A + + ToolbarConfiguration + xcode.toolbar.config.debugV3 + + + PerspectivesBarVisible + + ShelfIsVisible + + SourceDescription + file at '/Developer/Library/PrivateFrameworks/DevToolsInterface.framework/Resources/XCPerspectivesSpecification.xcperspec' + StatusbarIsVisible + + TimeStamp + 231705097.779064 + ToolbarDisplayMode + 2 + ToolbarIsVisible + + ToolbarSizeMode + 2 + Type + Perspectives + UpdateMessage + + WindowJustification + 5 + WindowOrderList + + /Users/zakariya/Code/vendor/bullet-2.68/Extras/AllBulletDemosOSX/AllBulletDemos.xcodeproj + + WindowString + 0 39 1440 839 0 0 1440 878 + WindowToolsV3 + + + Identifier + windowTool.debugger + Layout + + + Dock + + + ContentConfiguration + + Debugger + + HorizontalSplitView + + _collapsingFrameDimension + 0.0 + _indexOfCollapsedView + 0 + _percentageOfCollapsedView + 0.0 + isCollapsed + yes + sizes + + {{0, 0}, {317, 164}} + {{317, 0}, {377, 164}} + + + VerticalSplitView + + _collapsingFrameDimension + 0.0 + _indexOfCollapsedView + 0 + _percentageOfCollapsedView + 0.0 + isCollapsed + yes + sizes + + {{0, 0}, {694, 164}} + {{0, 164}, {694, 216}} + + + + LauncherConfigVersion + 8 + PBXProjectModuleGUID + 1C162984064C10D400B95A72 + PBXProjectModuleLabel + Debug - GLUTExamples (Underwater) + + GeometryConfiguration + + DebugConsoleDrawerSize + {100, 120} + DebugConsoleVisible + None + DebugConsoleWindowFrame + {{200, 200}, {500, 300}} + DebugSTDIOWindowFrame + {{200, 200}, {500, 300}} + Frame + {{0, 0}, {694, 380}} + RubberWindowFrame + 321 238 694 422 0 0 1440 878 + + Module + PBXDebugSessionModule + Proportion + 100% + + + Proportion + 100% + + + Name + Debugger + ServiceClasses + + PBXDebugSessionModule + + StatusbarIsVisible + 1 + TableOfContents + + 1CD10A99069EF8BA00B06720 + 1C0AD2AB069F1E9B00FABCE6 + 1C162984064C10D400B95A72 + 1C0AD2AC069F1E9B00FABCE6 + + ToolbarConfiguration + xcode.toolbar.config.debugV3 + WindowString + 321 238 694 422 0 0 1440 878 + WindowToolGUID + 1CD10A99069EF8BA00B06720 + WindowToolIsVisible + 0 + + + Identifier + windowTool.build + Layout + + + Dock + + + ContentConfiguration + + PBXProjectModuleGUID + 1CD0528F0623707200166675 + PBXProjectModuleLabel + <No Editor> + PBXSplitModuleInNavigatorKey + + Split0 + + PBXProjectModuleGUID + 1CD052900623707200166675 + + SplitCount + 1 + + StatusBarVisibility + 1 + + GeometryConfiguration + + Frame + {{0, 0}, {500, 215}} + RubberWindowFrame + 192 257 500 500 0 0 1280 1002 + + Module + PBXNavigatorGroup + Proportion + 218pt + + + BecomeActive + 1 + ContentConfiguration + + PBXProjectModuleGUID + XCMainBuildResultsModuleGUID + PBXProjectModuleLabel + Build + + GeometryConfiguration + + Frame + {{0, 222}, {500, 236}} + RubberWindowFrame + 192 257 500 500 0 0 1280 1002 + + Module + PBXBuildResultsModule + Proportion + 236pt + + + Proportion + 458pt + + + Name + Build Results + ServiceClasses + + PBXBuildResultsModule + + StatusbarIsVisible + 1 + TableOfContents + + 1C78EAA5065D492600B07095 + 1C78EAA6065D492600B07095 + 1CD0528F0623707200166675 + XCMainBuildResultsModuleGUID + + ToolbarConfiguration + xcode.toolbar.config.buildV3 + WindowString + 192 257 500 500 0 0 1280 1002 + + + Identifier + windowTool.find + Layout + + + Dock + + + Dock + + + ContentConfiguration + + PBXProjectModuleGUID + 1CDD528C0622207200134675 + PBXProjectModuleLabel + <No Editor> + PBXSplitModuleInNavigatorKey + + Split0 + + PBXProjectModuleGUID + 1CD0528D0623707200166675 + + SplitCount + 1 + + StatusBarVisibility + 1 + + GeometryConfiguration + + Frame + {{0, 0}, {781, 167}} + RubberWindowFrame + 62 385 781 470 0 0 1440 878 + + Module + PBXNavigatorGroup + Proportion + 781pt + + + Proportion + 50% + + + BecomeActive + 1 + ContentConfiguration + + PBXProjectModuleGUID + 1CD0528E0623707200166675 + PBXProjectModuleLabel + Project Find + + GeometryConfiguration + + Frame + {{8, 0}, {773, 254}} + RubberWindowFrame + 62 385 781 470 0 0 1440 878 + + Module + PBXProjectFindModule + Proportion + 50% + + + Proportion + 428pt + + + Name + Project Find + ServiceClasses + + PBXProjectFindModule + + StatusbarIsVisible + 1 + TableOfContents + + 1C530D57069F1CE1000CFCEE + 1C530D58069F1CE1000CFCEE + 1C530D59069F1CE1000CFCEE + 1CDD528C0622207200134675 + 1C530D5A069F1CE1000CFCEE + 1CE0B1FE06471DED0097A5F4 + 1CD0528E0623707200166675 + + WindowString + 62 385 781 470 0 0 1440 878 + WindowToolGUID + 1C530D57069F1CE1000CFCEE + WindowToolIsVisible + 0 + + + Identifier + windowTool.snapshots + Layout + + + Dock + + + Module + XCSnapshotModule + Proportion + 100% + + + Proportion + 100% + + + Name + Snapshots + ServiceClasses + + XCSnapshotModule + + StatusbarIsVisible + Yes + ToolbarConfiguration + xcode.toolbar.config.snapshots + WindowString + 315 824 300 550 0 0 1440 878 + WindowToolIsVisible + Yes + + + Identifier + windowTool.debuggerConsole + Layout + + + Dock + + + BecomeActive + 1 + ContentConfiguration + + PBXProjectModuleGUID + 1C78EAAC065D492600B07095 + PBXProjectModuleLabel + Debugger Console + + GeometryConfiguration + + Frame + {{0, 0}, {700, 358}} + RubberWindowFrame + 149 87 700 400 0 0 1440 878 + + Module + PBXDebugCLIModule + Proportion + 358pt + + + Proportion + 358pt + + + Name + Debugger Console + ServiceClasses + + PBXDebugCLIModule + + StatusbarIsVisible + 1 + TableOfContents + + 1C530D5B069F1CE1000CFCEE + 1C530D5C069F1CE1000CFCEE + 1C78EAAC065D492600B07095 + + ToolbarConfiguration + xcode.toolbar.config.consoleV3 + WindowString + 149 87 440 400 0 0 1440 878 + WindowToolGUID + 1C530D5B069F1CE1000CFCEE + WindowToolIsVisible + 0 + + + Identifier + windowTool.scm + Layout + + + Dock + + + ContentConfiguration + + PBXProjectModuleGUID + 1C78EAB2065D492600B07095 + PBXProjectModuleLabel + <No Editor> + PBXSplitModuleInNavigatorKey + + Split0 + + PBXProjectModuleGUID + 1C78EAB3065D492600B07095 + + SplitCount + 1 + + StatusBarVisibility + 1 + + GeometryConfiguration + + Frame + {{0, 0}, {452, 0}} + RubberWindowFrame + 743 379 452 308 0 0 1280 1002 + + Module + PBXNavigatorGroup + Proportion + 0pt + + + BecomeActive + 1 + ContentConfiguration + + PBXProjectModuleGUID + 1CD052920623707200166675 + PBXProjectModuleLabel + SCM + + GeometryConfiguration + + ConsoleFrame + {{0, 259}, {452, 0}} + Frame + {{0, 7}, {452, 259}} + RubberWindowFrame + 743 379 452 308 0 0 1280 1002 + TableConfiguration + + Status + 30 + FileName + 199 + Path + 197.09500122070312 + + TableFrame + {{0, 0}, {452, 250}} + + Module + PBXCVSModule + Proportion + 262pt + + + Proportion + 266pt + + + Name + SCM + ServiceClasses + + PBXCVSModule + + StatusbarIsVisible + 1 + TableOfContents + + 1C78EAB4065D492600B07095 + 1C78EAB5065D492600B07095 + 1C78EAB2065D492600B07095 + 1CD052920623707200166675 + + ToolbarConfiguration + xcode.toolbar.config.scmV3 + WindowString + 743 379 452 308 0 0 1280 1002 + + + Identifier + windowTool.breakpoints + IsVertical + 0 + Layout + + + Dock + + + BecomeActive + 1 + ContentConfiguration + + PBXBottomSmartGroupGIDs + + 1C77FABC04509CD000000102 + + PBXProjectModuleGUID + 1CE0B1FE06471DED0097A5F4 + PBXProjectModuleLabel + Files + PBXProjectStructureProvided + no + PBXSmartGroupTreeModuleColumnData + + PBXSmartGroupTreeModuleColumnWidthsKey + + 168 + + PBXSmartGroupTreeModuleColumnsKey_v4 + + MainColumn + + + PBXSmartGroupTreeModuleOutlineStateKey_v7 + + PBXSmartGroupTreeModuleOutlineStateExpansionKey + + 1C77FABC04509CD000000102 + + PBXSmartGroupTreeModuleOutlineStateSelectionKey + + + 0 + + + PBXSmartGroupTreeModuleOutlineStateVisibleRectKey + {{0, 0}, {168, 350}} + + PBXTopSmartGroupGIDs + + XCIncludePerspectivesSwitch + 0 + + GeometryConfiguration + + Frame + {{0, 0}, {185, 368}} + GroupTreeTableConfiguration + + MainColumn + 168 + + RubberWindowFrame + 315 424 744 409 0 0 1440 878 + + Module + PBXSmartGroupTreeModule + Proportion + 185pt + + + ContentConfiguration + + PBXProjectModuleGUID + 1CA1AED706398EBD00589147 + PBXProjectModuleLabel + Detail + + GeometryConfiguration + + Frame + {{190, 0}, {554, 368}} + RubberWindowFrame + 315 424 744 409 0 0 1440 878 + + Module + XCDetailModule + Proportion + 554pt + + + Proportion + 368pt + + + MajorVersion + 3 + MinorVersion + 0 + Name + Breakpoints + ServiceClasses + + PBXSmartGroupTreeModule + XCDetailModule + + StatusbarIsVisible + 1 + TableOfContents + + 1CDDB66807F98D9800BB5817 + 1CDDB66907F98D9800BB5817 + 1CE0B1FE06471DED0097A5F4 + 1CA1AED706398EBD00589147 + + ToolbarConfiguration + xcode.toolbar.config.breakpointsV3 + WindowString + 315 424 744 409 0 0 1440 878 + WindowToolGUID + 1CDDB66807F98D9800BB5817 + WindowToolIsVisible + 1 + + + Identifier + windowTool.debugAnimator + Layout + + + Dock + + + Module + PBXNavigatorGroup + Proportion + 100% + + + Proportion + 100% + + + Name + Debug Visualizer + ServiceClasses + + PBXNavigatorGroup + + StatusbarIsVisible + 1 + ToolbarConfiguration + xcode.toolbar.config.debugAnimatorV3 + WindowString + 100 100 700 500 0 0 1280 1002 + + + Identifier + windowTool.bookmarks + Layout + + + Dock + + + Module + PBXBookmarksModule + Proportion + 166pt + + + Proportion + 166pt + + + Name + Bookmarks + ServiceClasses + + PBXBookmarksModule + + StatusbarIsVisible + 0 + WindowString + 538 42 401 187 0 0 1280 1002 + + + Identifier + windowTool.projectFormatConflicts + Layout + + + Dock + + + Module + XCProjectFormatConflictsModule + Proportion + 100% + + + Proportion + 100% + + + Name + Project Format Conflicts + ServiceClasses + + XCProjectFormatConflictsModule + + StatusbarIsVisible + 0 + WindowContentMinSize + 450 300 + WindowString + 50 850 472 307 0 0 1440 877 + + + Identifier + windowTool.classBrowser + Layout + + + Dock + + + BecomeActive + 1 + ContentConfiguration + + OptionsSetName + Hierarchy, all classes + PBXProjectModuleGUID + 1CA6456E063B45B4001379D8 + PBXProjectModuleLabel + Class Browser - NSObject + + GeometryConfiguration + + ClassesFrame + {{0, 0}, {369, 96}} + ClassesTreeTableConfiguration + + PBXClassNameColumnIdentifier + 208 + PBXClassBookColumnIdentifier + 22 + + Frame + {{0, 0}, {616, 353}} + MembersFrame + {{0, 105}, {369, 395}} + MembersTreeTableConfiguration + + PBXMemberTypeIconColumnIdentifier + 22 + PBXMemberNameColumnIdentifier + 216 + PBXMemberTypeColumnIdentifier + 94 + PBXMemberBookColumnIdentifier + 22 + + PBXModuleWindowStatusBarHidden2 + 1 + RubberWindowFrame + 597 125 616 374 0 0 1280 1002 + + Module + PBXClassBrowserModule + Proportion + 354pt + + + Proportion + 354pt + + + Name + Class Browser + ServiceClasses + + PBXClassBrowserModule + + StatusbarIsVisible + 0 + TableOfContents + + 1C78EABA065D492600B07095 + 1C78EABB065D492600B07095 + 1CA6456E063B45B4001379D8 + + ToolbarConfiguration + xcode.toolbar.config.classbrowser + WindowString + 597 125 616 374 0 0 1280 1002 + + + Identifier + windowTool.refactoring + IncludeInToolsMenu + 0 + Layout + + + Dock + + + BecomeActive + 1 + GeometryConfiguration + + Frame + {0, 0}, {500, 335} + RubberWindowFrame + {0, 0}, {500, 335} + + Module + XCRefactoringModule + Proportion + 100% + + + Proportion + 100% + + + Name + Refactoring + ServiceClasses + + XCRefactoringModule + + WindowString + 200 200 500 356 0 0 1920 1200 + + + + diff --git a/Extras/AllBulletDemosOSX/AllBulletDemos_Prefix.pch b/Extras/AllBulletDemosOSX/AllBulletDemos_Prefix.pch new file mode 100644 index 000000000..f1d2c1188 --- /dev/null +++ b/Extras/AllBulletDemosOSX/AllBulletDemos_Prefix.pch @@ -0,0 +1,7 @@ +// +// Prefix header for all source files of the 'AllBulletDemos' target in the 'AllBulletDemos' project +// + +#ifdef __OBJC__ + #import +#endif diff --git a/Extras/AllBulletDemosOSX/BulletIcon.icns b/Extras/AllBulletDemosOSX/BulletIcon.icns new file mode 100644 index 0000000000000000000000000000000000000000..1429602ce60360b8a4f8238c60b7fbc08505dd12 GIT binary patch literal 28472 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 A(*OVf literal 0 HcmV?d00001 diff --git a/Extras/AllBulletDemosOSX/BulletIcon.psd b/Extras/AllBulletDemosOSX/BulletIcon.psd new file mode 100644 index 0000000000000000000000000000000000000000..c0b4a99c98e71bf4d1248a33d32738024e8fa106 GIT binary patch literal 101941 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 a!Y*1dX%G66ZqL#C$|bw0ZoP5@jOGW1ArT7z literal 0 HcmV?d00001 diff --git a/Extras/AllBulletDemosOSX/English.lproj/MainMenu.xib b/Extras/AllBulletDemosOSX/English.lproj/MainMenu.xib new file mode 100644 index 000000000..2305b55e0 --- /dev/null +++ b/Extras/AllBulletDemosOSX/English.lproj/MainMenu.xib @@ -0,0 +1,2095 @@ + + + + 1040 + 9C7010 + 652 + 949.26 + 352.00 + + YES + + + + YES + com.apple.InterfaceBuilderKit + com.apple.InterfaceBuilder.CocoaPlugin + + + YES + + NSApplication + + + FirstResponder + + + NSApplication + + + AMainMenu + + YES + + + AllBulletDemos + + 1048576 + 2147483647 + + NSImage + NSMenuCheckmark + + + NSImage + NSMenuMixedState + + submenuAction: + + AllBulletDemos + + YES + + + About AllBulletDemos + + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + UHJlZmVyZW5jZXPigKY + , + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Services + + 1048576 + 2147483647 + + + submenuAction: + + Services + + YES + + _NSServicesMenu + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Hide AllBulletDemos + h + 1048576 + 2147483647 + + + + + + Hide Others + h + 1572864 + 2147483647 + + + + + + Show All + + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Quit AllBulletDemos + q + 1048576 + 2147483647 + + + + + _NSAppleMenu + + + + + File + + 2147483647 + + + submenuAction: + + File + + YES + + + Reset Current Demo + r + 1048576 + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Close + w + 1048576 + 2147483647 + + + + + + + + + View + + 1048576 + 2147483647 + + + submenuAction: + + View + + YES + + + Previous Demo + [ + 1048576 + 2147483647 + + + + + + Next Demo + ] + 1048576 + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Fullscreen + F + 1048576 + 2147483647 + + + + + + + + + Window + + 1048576 + 2147483647 + + + submenuAction: + + Window + + YES + + + Minimize + m + 1048576 + 2147483647 + + + + + + Zoom + + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Bring All to Front + + 1048576 + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Show Paramaters + P + 1048576 + 2147483647 + + + + + _NSWindowsMenu + + + + _NSMainMenu + + + 15 + 2 + {{500, 363}, {593, 360}} + 1954021376 + All Bullet Demos + NSWindow + + {593, 360} + + + 256 + + YES + + + 274 + {593, 320} + + BTOpenGLView + + + + 268 + {{17, 328}, {210, 22}} + + YES + + -2076049856 + 133120 + + LucidaGrande + 1.100000e+01 + 3100 + + + 109199615 + 129 + + + 400 + 75 + + + Item 1 + + 1048576 + 2147483647 + 1 + + + _popUpItemAction: + + + YES + + OtherViews + + YES + + + + Item 2 + + 1048576 + 2147483647 + + + _popUpItemAction: + + + + + Item 3 + + 1048576 + 2147483647 + + + _popUpItemAction: + + + + + 1 + YES + YES + 2 + + + + + 265 + {{489, 331}, {86, 18}} + + YES + + 67239424 + 131072 + Fullscreen + + + 1211912703 + 130 + + NSImage + NSSwitch + + + NSSwitch + + + + 200 + 25 + + + + + 265 + {{393, 331}, {93, 18}} + + YES + + 67239424 + 131072 + Parameters + + + 1211912703 + 130 + + + + + 200 + 25 + + + + + 268 + {{227, 325}, {96, 28}} + + YES + + 67239424 + 134348800 + Reset + + + -2038284033 + 129 + + + 200 + 25 + + + + {593, 360} + + {{0, 0}, {1440, 878}} + {593, 382} + {3.40282e+38, 3.40282e+38} + _main_window_ + + + NSFontManager + + + BTDemosAppController + + + 19 + 2 + {{196, 291}, {276, 219}} + -469762048 + Parameters + NSPanel + + {276, 219} + {276, 219} + + + 256 + + YES + + + 268 + {{17, 177}, {64, 17}} + + YES + + 68288064 + 272630784 + Iterations + + LucidaGrande + 1.300000e+01 + 1044 + + + + 6 + System + controlColor + + 3 + MC42NjY2NjY2OQA + + + + 6 + System + controlTextColor + + 3 + MAA + + + + + + + 268 + {{86, 174}, {121, 22}} + + YES + + -1804468671 + -1874852864 + + + + + YES + + YES + allowsFloats + formatterBehavior + minimum + + + YES + + + + + + # + # + + + + + + + + + + NaN + + YES + + YES + + + YES + + + + + + 0 + 0 + YES + NO + 1 + AAAAAAAAAAAAAAAAAAAAAA + + + 3 + YES + YES + YES + + . + , + NO + YES + YES + + + YES + + 6 + System + textBackgroundColor + + 3 + MQA + + + + 6 + System + textColor + + + + + + + 268 + {{84, 140}, {149, 18}} + + YES + + -2080244224 + 0 + Disable deactivation + + + 1211912703 + 130 + + + + + 200 + 25 + + + + + 12 + {{12, 121}, {252, 5}} + + {0, 0} + + 67239424 + 0 + Box + + + + 3 + MCAwLjgwMDAwMDAxAA + + + 3 + 2 + 0 + NO + + + + 268 + {{212, 171}, {19, 27}} + + YES + + 917024 + 0 + + 1.000000e+02 + 1.000000e+00 + YES + + + + + 268 + {{9, 87}, {69, 17}} + + YES + + 68288064 + 272630784 + Rendering + + + + + + + + + 268 + {{84, 59}, {63, 18}} + + YES + + -2080244224 + 0 + AABBs + + + 1211912703 + 130 + + + + + 200 + 25 + + + + + 268 + {{84, 39}, {113, 18}} + + YES + + -2080244224 + 0 + Debug Drawer + + + 1211912703 + 130 + + + + + 200 + 25 + + + + + 268 + {{84, 19}, {113, 18}} + + YES + + -2080244224 + 0 + Contacts + + + 1211912703 + 130 + + + + + 200 + 25 + + + + {276, 219} + + {{0, 0}, {1440, 878}} + {276, 235} + {276, 235} + _parameters_window_ + + + BTSimulationParameters + + + YES + + + + + YES + + + performMiniaturize: + + + + 37 + + + + arrangeInFront: + + + + 39 + + + + orderFrontStandardAboutPanel: + + + + 142 + + + + performZoom: + + + + 240 + + + + hide: + + + + 367 + + + + hideOtherApplications: + + + + 368 + + + + terminate: + + + + 369 + + + + unhideAllApplications: + + + + 370 + + + + _glView + + + + 451 + + + + delegate + + + + 453 + + + + content: demos + + + + + + content: demos + content + demos + 2 + + + 489 + + + + selectedValue: demo + + + + + + selectedValue: demo + selectedValue + demo + + 2 + + + 490 + + + + value: fullscreen + + + + + + value: fullscreen + value + fullscreen + 2 + + + 493 + + + + nextDemo: + + + + 498 + + + + previousDemo: + + + + 499 + + + + _parameters + + + + 526 + + + + value: iterations + + + + + + value: iterations + value + iterations + 2 + + + 527 + + + + maxValue: maxIterations + + + + + + maxValue: maxIterations + maxValue + maxIterations + 2 + + + 531 + + + + minValue: minIterations + + + + + + minValue: minIterations + minValue + minIterations + + 2 + + + 532 + + + + value: iterations + + + + + + value: iterations + value + iterations + + 2 + + + 533 + + + + value: disableDeactivation + + + + + + value: disableDeactivation + value + disableDeactivation + 2 + + + 534 + + + + value: drawAABBs + + + + + + value: drawAABBs + value + drawAABBs + 2 + + + 535 + + + + value: debugDraw + + + + + + value: debugDraw + value + debugDraw + 2 + + + 537 + + + + visible: showParameters + + + + + + visible: showParameters + visible + showParameters + 2 + + + 540 + + + + value: showParameters + + + + + + value: showParameters + value + showParameters + 2 + + + 543 + + + + performClose: + + + + 559 + + + + value: showParameters + + + + + + value: showParameters + value + showParameters + 2 + + + 564 + + + + value: fullscreen + + + + + + value: fullscreen + value + fullscreen + 2 + + + 567 + + + + resetDemo: + + + + 570 + + + + resetDemo: + + + + 573 + + + + value: drawContacts + + + + + + value: drawContacts + value + drawContacts + 2 + + + 576 + + + + nullMenuTarget: + + + + 579 + + + + nullMenuTarget: + + + + 580 + + + + + YES + + 0 + + YES + + + + + + -2 + + + RmlsZSdzIE93bmVyA + + + -1 + + + First Responder + + + -3 + + + Application + + + 29 + + + YES + + + + + + + MainMenu + + + 19 + + + YES + + + + + + 56 + + + YES + + + + + + 57 + + + YES + + + + + + + + + + + + + + + + 58 + + + + + 134 + + + + + 150 + + + + + 136 + + + 1111 + + + 144 + + + + + 129 + + + 121 + + + 143 + + + + + 236 + + + + + 131 + + + YES + + + + + + 149 + + + + + 145 + + + + + 130 + + + + + 24 + + + YES + + + + + + + + + + + 92 + + + + + 5 + + + + + 239 + + + + + 23 + + + + + 295 + + + YES + + + + + + 296 + + + YES + + + + + + + + + 371 + + + YES + + + + + + 372 + + + YES + + + + + + + + + + 420 + + + + + 449 + + + + + 450 + + + + + 483 + + + YES + + + + + + 484 + + + YES + + + + + + 485 + + + YES + + + + + + + + 486 + + + + + 487 + + + + + 488 + + + + + 491 + + + YES + + + + + + 492 + + + + + 496 + + + + + 497 + + + + + 501 + + + + + 503 + + + YES + + + + + + 504 + + + YES + + + + + + + + + + + + + + 507 + + + YES + + + + + + 508 + + + + + 509 + + + YES + + + + + + 510 + + + YES + + + + + + 511 + + + + + 512 + + + YES + + + + + + 513 + + + + + 514 + + + + + 515 + + + YES + + + + + + 516 + + + + + 517 + + + YES + + + + + + 518 + + + + + 519 + + + YES + + + + + + 520 + + + + + 521 + + + YES + + + + + + 522 + + + + + 523 + + + YES + + + + + + 524 + + + + + 525 + + + + + 538 + + + + + 541 + + + YES + + + + + + 542 + + + + + 544 + + + YES + + + + + + 545 + + + YES + + + + + + + + 550 + + + + + 560 + + + + + 561 + + + + + 562 + + + + + 568 + + + + + 569 + + + + + 571 + + + YES + + + + + + 572 + + + + + + + YES + + YES + -1.IBPluginDependency + -2.IBPluginDependency + -3.IBPluginDependency + 129.IBPluginDependency + 129.ImportedFromIB2 + 130.IBPluginDependency + 130.ImportedFromIB2 + 130.editorWindowContentRectSynchronizationRect + 131.IBPluginDependency + 131.ImportedFromIB2 + 134.IBPluginDependency + 134.ImportedFromIB2 + 136.IBPluginDependency + 136.ImportedFromIB2 + 143.IBPluginDependency + 143.ImportedFromIB2 + 144.IBPluginDependency + 144.ImportedFromIB2 + 145.IBPluginDependency + 145.ImportedFromIB2 + 149.IBPluginDependency + 149.ImportedFromIB2 + 150.IBPluginDependency + 150.ImportedFromIB2 + 19.IBPluginDependency + 19.ImportedFromIB2 + 23.IBPluginDependency + 23.ImportedFromIB2 + 236.IBPluginDependency + 236.ImportedFromIB2 + 239.IBPluginDependency + 239.ImportedFromIB2 + 24.IBEditorWindowLastContentRect + 24.IBPluginDependency + 24.ImportedFromIB2 + 24.editorWindowContentRectSynchronizationRect + 29.IBEditorWindowLastContentRect + 29.IBPluginDependency + 29.ImportedFromIB2 + 29.WindowOrigin + 29.editorWindowContentRectSynchronizationRect + 295.IBPluginDependency + 296.IBEditorWindowLastContentRect + 296.IBPluginDependency + 296.editorWindowContentRectSynchronizationRect + 371.IBEditorWindowLastContentRect + 371.IBPluginDependency + 371.IBWindowTemplateEditedContentRect + 371.NSWindowTemplate.visibleAtLaunch + 371.editorWindowContentRectSynchronizationRect + 371.windowTemplate.hasMinSize + 371.windowTemplate.minSize + 372.IBPluginDependency + 449.IBPluginDependency + 450.IBPluginDependency + 483.IBPluginDependency + 484.IBPluginDependency + 485.IBPluginDependency + 486.IBPluginDependency + 487.IBPluginDependency + 488.IBPluginDependency + 491.IBPluginDependency + 492.IBPluginDependency + 496.IBPluginDependency + 497.IBPluginDependency + 5.IBPluginDependency + 5.ImportedFromIB2 + 501.IBPluginDependency + 503.IBEditorWindowLastContentRect + 503.IBPluginDependency + 503.IBWindowTemplateEditedContentRect + 503.NSWindowTemplate.visibleAtLaunch + 503.windowTemplate.hasMaxSize + 503.windowTemplate.hasMinSize + 503.windowTemplate.maxSize + 503.windowTemplate.minSize + 504.IBPluginDependency + 507.IBPluginDependency + 508.IBPluginDependency + 509.IBPluginDependency + 510.IBPluginDependency + 511.IBPluginDependency + 512.IBPluginDependency + 513.IBPluginDependency + 514.IBPluginDependency + 515.IBPluginDependency + 516.IBPluginDependency + 517.IBPluginDependency + 518.IBPluginDependency + 519.IBPluginDependency + 520.IBPluginDependency + 521.IBPluginDependency + 522.IBPluginDependency + 523.IBPluginDependency + 524.IBPluginDependency + 525.IBPluginDependency + 541.IBPluginDependency + 542.IBPluginDependency + 544.IBPluginDependency + 545.IBEditorWindowLastContentRect + 545.IBPluginDependency + 550.IBPluginDependency + 56.IBPluginDependency + 56.ImportedFromIB2 + 560.IBPluginDependency + 561.IBPluginDependency + 562.IBPluginDependency + 568.IBPluginDependency + 569.IBPluginDependency + 57.IBEditorWindowLastContentRect + 57.IBPluginDependency + 57.ImportedFromIB2 + 57.editorWindowContentRectSynchronizationRect + 571.IBPluginDependency + 572.IBPluginDependency + 58.IBPluginDependency + 58.ImportedFromIB2 + 92.IBPluginDependency + 92.ImportedFromIB2 + + + YES + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilderKit + com.apple.InterfaceBuilderKit + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + {{436, 809}, {64, 6}} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + {{440, 182}, {211, 103}} + com.apple.InterfaceBuilder.CocoaPlugin + + {{525, 802}, {197, 73}} + {{207, 285}, {316, 20}} + com.apple.InterfaceBuilder.CocoaPlugin + + {74, 862} + {{6, 978}, {478, 20}} + com.apple.InterfaceBuilder.CocoaPlugin + {{390, 212}, {192, 73}} + com.apple.InterfaceBuilder.CocoaPlugin + {{475, 832}, {234, 43}} + {{115, 412}, {593, 360}} + com.apple.InterfaceBuilder.CocoaPlugin + {{115, 412}, {593, 360}} + + {{33, 99}, {480, 360}} + + {593, 360} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + {{543, 587}, {276, 219}} + com.apple.InterfaceBuilder.CocoaPlugin + {{543, 587}, {276, 219}} + + + + {276, 219} + {276, 219} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{348, 232}, {218, 53}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{219, 102}, {242, 183}} + com.apple.InterfaceBuilder.CocoaPlugin + + {{23, 794}, {245, 183}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + + + + YES + + YES + + + YES + + + + + YES + + YES + + + YES + + + + 580 + + + + YES + + BTDemosAppController + NSObject + + YES + + YES + nextDemo: + nullMenuTarget: + previousDemo: + resetDemo: + toggleFullscreen: + toggleParameters: + + + YES + id + id + id + id + id + id + + + + YES + + YES + _glView + _parameters + + + YES + BTOpenGLView + BTSimulationParameters + + + + IBProjectSource + src/BTDemosAppController.h + + + + BTOpenGLView + NSView + + _delegate + id + + + IBProjectSource + src/toolkit/BTOpenGLView.h + + + + BTSimulationParameters + NSObject + + IBProjectSource + src/BTSimulationParameters.h + + + + + 0 + ../AllBulletDemos.xcodeproj + 3 + + diff --git a/Extras/AllBulletDemosOSX/Info.plist b/Extras/AllBulletDemosOSX/Info.plist new file mode 100644 index 000000000..5081c73b8 --- /dev/null +++ b/Extras/AllBulletDemosOSX/Info.plist @@ -0,0 +1,28 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIconFile + BulletIcon + CFBundleIdentifier + org.bullet.${PRODUCT_NAME:identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + APPL + CFBundleSignature + ???? + CFBundleVersion + 1.0 + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + diff --git a/Extras/AllBulletDemosOSX/README.txt b/Extras/AllBulletDemosOSX/README.txt new file mode 100644 index 000000000..173847c85 --- /dev/null +++ b/Extras/AllBulletDemosOSX/README.txt @@ -0,0 +1,6 @@ +To build: +Place AllBulletDemosOSX in bullet-/Extras and build with Xcode. + +Questions: +contact Shamyl Zakariya +shamyl@zakariya.net \ No newline at end of file diff --git a/Extras/AllBulletDemosOSX/main.m b/Extras/AllBulletDemosOSX/main.m new file mode 100644 index 000000000..699ddd42d --- /dev/null +++ b/Extras/AllBulletDemosOSX/main.m @@ -0,0 +1,14 @@ +// +// main.m +// AllBulletDemos +// +// Created by Shamyl Zakariya on 5/1/08. +// Copyright Shamyl Zakariya 2008. All rights reserved. +// + +#import + +int main(int argc, char *argv[]) +{ + return NSApplicationMain(argc, (const char **) argv); +} diff --git a/Extras/AllBulletDemosOSX/src/BTDemo.h b/Extras/AllBulletDemosOSX/src/BTDemo.h new file mode 100644 index 000000000..0f7810f73 --- /dev/null +++ b/Extras/AllBulletDemosOSX/src/BTDemo.h @@ -0,0 +1,103 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#import +#import "BTOpenGLDisplayDelegate.h" + +@class BTDemoEntry; + +@interface BTDemo : NSObject { + + NSString *_demoName; + BTDemoEntry *_demo; +} + +/** + @brief Array of all available bullet demos +*/ ++ (NSArray*) demoNames; + +/** + @brief Verify a given string is a demo name +*/ ++ (BOOL) isDemo: (NSString *) demoName; + +/** + @brief Create a demo with a given name + @note Returns nil if the name is not a valid demo name +*/ ++ (BTDemo*) demoWithName: (NSString *) demoName; + +/** + @brief Initialize a demo with a given name +*/ +- (id) initWithDemoName: (NSString *) demoName; + +/** + @brief Reset current demo +*/ +- (void) reset; + +/** + @brief Name of current demo +*/ +- (NSString*) demoName; + +/////////////////////////////////////////////////////////////////////// +// BTOpenGLDisplayDelegate + +- (void) contextCreated; +- (void) contextWillBeDestroyed; +- (void) contextWillResize; +- (void) contextResized: (NSSize) newSize; +- (void) contextDidResize; +- (void) contextStateInvalidated; + +- (void) display: (float) deltaT; + +- (void) keyPressed: (unsigned char) key; +- (void) keyReleased: (unsigned char) key; + +- (void) specialKeyPressed: (unsigned) GLUTKey; +- (void) specialKeyReleased: (unsigned) GLUTKey; + +- (void) mouseButtonPressed: (unsigned) mouseButton; +- (void) mouseButtonReleased: (unsigned) mouseButton; +- (void) mouseMoved: (NSPoint) delta; +- (void) newMousePosition: (NSPoint) newMousePosition; +- (void) scrollWheel: (NSPoint) delta; + +/////////////////////////////////////////////////////////////////////// +// Global simulation properties -- applies to all demos + ++ (void) setIterations: (unsigned) iterations; ++ (unsigned) iterations; + ++ (unsigned) minIterations; ++ (unsigned) maxIterations; + ++ (void) setDisableDeactivation: (BOOL) disableDeactivation; ++ (BOOL) disableDeactivation; + ++ (void) setDrawAABBs: (BOOL) drawAABBs; ++ (BOOL) drawAABBs; + ++ (void) setDebugDraw: (BOOL) debugDraw; ++ (BOOL) debugDraw; + ++ (void) setDrawContacts: (BOOL) drawContacts; ++ (BOOL) drawContacts; + +@end diff --git a/Extras/AllBulletDemosOSX/src/BTDemo.mm b/Extras/AllBulletDemosOSX/src/BTDemo.mm new file mode 100644 index 000000000..d44a98338 --- /dev/null +++ b/Extras/AllBulletDemosOSX/src/BTDemo.mm @@ -0,0 +1,390 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#import "BTDemo.h" + +/////////////////////////////////////////////////////////////////////// +// Bullet includes + +#include "LinearMath/btScalar.h" +#include "LinearMath/btMinMax.h" + +#include "DemoApplication.h" +#include "DemoEntries.h" +#include "BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h" + +#include "GLDebugDrawer.h" + +#include "LinearMath/btQuickprof.h" + + +/////////////////////////////////////////////////////////////////////// + +#pragma mark - +#pragma mark Globals + +static NSPoint MousePosition; +static NSSize ViewSize; +static int NumIterations = 10; +static BOOL DisableDeactivation = NO; +static BOOL DrawAABBs = NO; +static BOOL DebugDraw = NO; +static BOOL DrawContacts = NO; + +/////////////////////////////////////////////////////////////////////// + +#pragma mark - +#pragma mark BTDemoEntry + +@interface BTDemoEntry : NSObject { + btDemoEntry *ctor; + DemoApplication *demo; +} + +- (id) initWithDemoEntry: (btDemoEntry*) constructor; +- (DemoApplication*) demo; +- (void) reset; + +@end + +@implementation BTDemoEntry + +- (id) initWithDemoEntry: (btDemoEntry*) constructor +{ + if ( self = [super init] ) + { + ctor = constructor; + [self reset]; + } + + return self; +} + +- (void) dealloc +{ + if ( demo ) delete demo; + [super dealloc]; +} + +- (DemoApplication*) demo +{ + return demo; +} + +- (void) reset +{ + if ( demo ) + { + if (demo->getDynamicsWorld()->getDebugDrawer()) + delete demo->getDynamicsWorld()->getDebugDrawer(); + + delete demo; + demo = NULL; + } + + demo = ctor->createFcn(); + btAssert(demo); + + if (demo->getDynamicsWorld()) + { + demo->getDynamicsWorld()->setDebugDrawer(new GLDebugDrawer()); + } + + #ifndef BT_NO_PROFILE + CProfileManager::Reset(); + #endif //BT_NO_PROFILE +} + +@end + +/////////////////////////////////////////////////////////////////////// + +#pragma mark - +#pragma mark BTDemo + + +@implementation BTDemo + ++ (NSArray*) demoNames +{ + static NSMutableArray *DEMOS = nil; + if ( !DEMOS ) + { + DEMOS = [[NSMutableArray alloc] init]; + + btDemoEntry* e = g_demoEntries; + while (e->createFcn) + { + [DEMOS addObject: [NSString stringWithUTF8String: e->name]]; + ++e; + } + } + + return DEMOS; +} + ++ (BOOL) isDemo: (NSString *) demoName +{ + return [[self demoNames] containsObject: demoName]; +} + ++ (BTDemo*) demoWithName: (NSString *) demoName +{ + if ( [BTDemo isDemo: demoName] ) + { + return [[[BTDemo alloc] initWithDemoName: demoName] autorelease]; + } + + return nil; +} + +- (id) initWithDemoName: (NSString *) demoName +{ + if ( self = [super init] ) + { + _demoName = [demoName copy]; + + // now walk the constructor list and find this demo + + btDemoEntry* e = g_demoEntries; + while (e->createFcn) + { + NSString *name = [NSString stringWithCString: e->name]; + if ( [name isEqualToString: demoName] ) + { + _demo = [[BTDemoEntry alloc] initWithDemoEntry: e]; + break; + } + + e++; + } + } + + return self; +} + +- (void) dealloc +{ + [_demoName release]; + [_demo release]; + [super dealloc]; +} + +- (void) reset +{ + [_demo reset]; + + [self contextWillResize]; + [self contextResized: ViewSize]; + [self contextDidResize]; +} + +- (NSString*) demoName +{ + return _demoName; +} + +#pragma mark - +#pragma mark BTOpenGLDisplayDelegate + +- (void) contextCreated +{} + +- (void) contextWillBeDestroyed +{} + +- (void) contextWillResize +{} + +- (void) contextResized: (NSSize) newSize +{ + ViewSize = newSize; + glViewport( 0, 0, (int) newSize.width, (int) newSize.height ); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + + [_demo demo]->reshape( (int) newSize.width, (int) newSize.height ); +} + +- (void) contextDidResize +{} + +- (void) contextStateInvalidated +{} + +- (void) display: (float) deltaT +{ + DemoApplication *demo = [_demo demo]; + + if ( !demo ) + { + glClearColor( 1, 0.5, 1, 1 ); + glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); + return; + } + + if (DrawAABBs) + { + demo->setDebugMode(demo->getDebugMode() |btIDebugDraw::DBG_DrawAabb); + } + else + { + demo->setDebugMode(demo->getDebugMode() & (~btIDebugDraw::DBG_DrawAabb)); + } + + if (DebugDraw) + { + demo->setDebugMode(demo->getDebugMode() |btIDebugDraw::DBG_DrawWireframe); + } + else + { + demo->setDebugMode(demo->getDebugMode() & (~btIDebugDraw::DBG_DrawWireframe)); + } + + if (DrawContacts) + { + demo->setDebugMode(demo->getDebugMode() |btIDebugDraw::DBG_DrawContactPoints); + } + else + { + demo->setDebugMode(demo->getDebugMode() & (~btIDebugDraw::DBG_DrawContactPoints)); + } + + if (DisableDeactivation) + { + demo->setDebugMode(demo->getDebugMode() |btIDebugDraw::DBG_NoDeactivation); + } + else + { + demo->setDebugMode(demo->getDebugMode() & (~btIDebugDraw::DBG_NoDeactivation)); + } + + if (demo->getDynamicsWorld() && demo->getDynamicsWorld()->getWorldType() == BT_DISCRETE_DYNAMICS_WORLD) + { + btDiscreteDynamicsWorld* discreteWorld = (btDiscreteDynamicsWorld*) demo->getDynamicsWorld(); + discreteWorld->getSolverInfo().m_numIterations = NumIterations; + } + + if (!demo->isIdle()) + { + demo->clientMoveAndDisplay(); + } + else + { + demo->displayCallback(); + } + +} + +- (void) keyPressed: (unsigned char) key +{ + [_demo demo]->keyboardCallback(key, (int)MousePosition.x, (int)MousePosition.y ); +} + +- (void) keyReleased: (unsigned char) key +{} + +- (void) specialKeyPressed: (unsigned) key +{ + [_demo demo]->specialKeyboard(key,(int)MousePosition.x, (int)MousePosition.y ); +} + +- (void) specialKeyReleased: (unsigned) key +{} + +- (void) mouseButtonPressed: (unsigned) mouseButton +{ + [_demo demo]->mouseFunc( mouseButton, GLUT_DOWN, (int)MousePosition.x, (int)MousePosition.y ); +} + +- (void) mouseButtonReleased: (unsigned) mouseButton +{ + [_demo demo]->mouseFunc( mouseButton, GLUT_UP, (int)MousePosition.x, (int)MousePosition.y ); +} + +- (void) mouseMoved: (NSPoint) delta +{ + [_demo demo]->mouseMotionFunc((int)MousePosition.x, (int)MousePosition.y ); +} + +- (void) newMousePosition: (NSPoint) newMousePosition +{ + // Need to invert Y, since DemoApplication assumes origin at top-left + MousePosition = NSMakePoint( newMousePosition.x, ViewSize.height - newMousePosition.y ); +} + +- (void) scrollWheel: (NSPoint) delta +{} + +#pragma mark - +#pragma mark Global Simulation Properties + ++ (void) setIterations: (unsigned) iterations +{ + NumIterations = iterations; +} + ++ (unsigned) iterations +{ + return NumIterations; +} + ++ (unsigned) minIterations { return 1; } ++ (unsigned) maxIterations { return 1000; } + + ++ (void) setDisableDeactivation: (BOOL) disableDeactivation +{ + DisableDeactivation = disableDeactivation; +} + ++ (BOOL) disableDeactivation +{ + return DisableDeactivation; +} + ++ (void) setDrawAABBs: (BOOL) drawAABBs +{ + DrawAABBs = drawAABBs; +} + ++ (BOOL) drawAABBs +{ + return DrawAABBs; +} + ++ (void) setDebugDraw: (BOOL) debugDraw +{ + DebugDraw = debugDraw; +} + ++ (BOOL) debugDraw +{ + return DebugDraw; +} + ++ (void) setDrawContacts: (BOOL) drawContacts +{ + DrawContacts = drawContacts; +} + ++ (BOOL) drawContacts +{ + return DrawContacts; +} + + +@end diff --git a/Extras/AllBulletDemosOSX/src/BTDemosAppController.h b/Extras/AllBulletDemosOSX/src/BTDemosAppController.h new file mode 100644 index 000000000..62349e3e1 --- /dev/null +++ b/Extras/AllBulletDemosOSX/src/BTDemosAppController.h @@ -0,0 +1,54 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#import +#import "BTOpenGLView.h" +#import "BTSimulationParameters.h" +#import "BTDemo.h" + +@interface BTDemosAppController : NSObject { + + IBOutlet BTOpenGLView* _glView; + IBOutlet BTSimulationParameters *_parameters; + + BTDemo *_currentDemo; + BOOL _showParameters; +} + +/////////////////////////////////////////////////////////////////////// +// Public API + +- (void) setFullscreen: (BOOL) fullscreen; +- (BOOL) fullscreen; + +- (void) setShowParameters: (BOOL) showParameters; +- (BOOL) showParameters; + +- (NSArray*) demos; + +- (void) setDemo: (NSString*) demoName; +- (NSString*) demo; + +/////////////////////////////////////////////////////////////////////// +// IBActions + +- (IBAction) nextDemo: (id) sender; +- (IBAction) previousDemo: (id) sender; +- (IBAction) toggleFullscreen: (id) sender; +- (IBAction) toggleParameters: (id) sender; +- (IBAction) resetDemo: (id) sender; +- (IBAction) nullMenuTarget: (id) sender; + +@end diff --git a/Extras/AllBulletDemosOSX/src/BTDemosAppController.m b/Extras/AllBulletDemosOSX/src/BTDemosAppController.m new file mode 100644 index 000000000..544471385 --- /dev/null +++ b/Extras/AllBulletDemosOSX/src/BTDemosAppController.m @@ -0,0 +1,151 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#import "BTDemosAppController.h" + + +@implementation BTDemosAppController + +- (id) init +{ + if ( self = [super init] ) + { + // change cwd to .app/Contents/Resources + NSString *resourcePath = [[NSBundle mainBundle] resourcePath]; + [[NSFileManager defaultManager] changeCurrentDirectoryPath:resourcePath]; + } + + return self; +} + +- (void) awakeFromNib +{} + +#pragma mark - +#pragma mark Public API + +- (void) setFullscreen: (BOOL) fullscreen +{ + [_glView setFullscreen: fullscreen]; +} + +- (BOOL) fullscreen +{ + return [_glView fullscreen]; +} + +- (void) setShowParameters: (BOOL) showParameters +{ + _showParameters = showParameters; +} + +- (BOOL) showParameters +{ + return _showParameters; +} + +- (NSArray*) demos +{ + return [BTDemo demoNames]; +} + +- (void) setDemo: (NSString*) demoName +{ + [_currentDemo release]; + [_glView setDelegate: nil]; + + _currentDemo = [[BTDemo demoWithName: demoName] retain]; + + if ( _currentDemo ) + { + // the demo is the rendering & input delegate for the gl view + [_glView setDelegate: _currentDemo]; + + [_currentDemo contextWillResize]; + [_currentDemo contextResized: [_glView bounds].size]; + [_currentDemo contextDidResize]; + } +} + +- (NSString*) demo +{ + return _currentDemo ? [_currentDemo demoName] : nil; +} + +#pragma mark - +#pragma mark IBActions + +- (IBAction) nextDemo: (id) sender +{ + NSArray *demos = [self demos]; + unsigned index = [demos indexOfObject: [self demo]]; + if ( index != NSNotFound ) + { + index = ( index + 1 ) % [demos count]; + [self setDemo: [demos objectAtIndex: index]]; + } +} + +- (IBAction) previousDemo: (id) sender +{ + NSArray *demos = [self demos]; + unsigned index = [demos indexOfObject: [self demo]]; + if ( index != NSNotFound ) + { + if ( index == 0 ) index = [demos count] - 1; + else index--; + + [self setDemo: [demos objectAtIndex: index]]; + } +} + +- (IBAction) toggleFullscreen: (id) sender +{ + [self setFullscreen: ![self fullscreen]]; +} + +- (IBAction) toggleParameters: (id) sender +{ + [self setShowParameters: ![self showParameters]]; +} + +- (IBAction) resetDemo: (id) sender +{ + [_currentDemo reset]; +} + +- (IBAction) nullMenuTarget: (id) sender +{ + // this handles a 10.4 bug. A menu bound to some property for toggling + // will not invoke unless it has a target and selector set. +} + +#pragma mark - +#pragma mark NSApplicationDelegate + +- (void) applicationDidFinishLaunching: (NSNotification *)aNotification +{ + // note: We load the first demo here and not in -awakeFromNib as the + // OpenGL view is instantiated, but not running yet at that point + + [self setDemo: [[self demos] objectAtIndex:0]]; +} + +- (BOOL) applicationShouldTerminateAfterLastWindowClosed: (NSApplication *)theApplication +{ + return YES; +} + +@end diff --git a/Extras/AllBulletDemosOSX/src/BTSimulationParameters.h b/Extras/AllBulletDemosOSX/src/BTSimulationParameters.h new file mode 100644 index 000000000..f549a8b3d --- /dev/null +++ b/Extras/AllBulletDemosOSX/src/BTSimulationParameters.h @@ -0,0 +1,44 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#import + +/* + BTSimulationParameters is an instanceable proxy for BTDemo's global + simulation properties. We're doing this so we can bind UI to something + in the nib file. +*/ + +@interface BTSimulationParameters : NSObject {} + +- (void) setIterations: (unsigned) iterations; +- (unsigned) iterations; + +- (unsigned) minIterations; +- (unsigned) maxIterations; + +- (void) setDisableDeactivation: (BOOL) disableDeactivation; +- (BOOL) disableDeactivation; + +- (void) setDrawAABBs: (BOOL) drawAABBs; +- (BOOL) drawAABBs; + +- (void) setDebugDraw: (BOOL) debugDraw; +- (BOOL) debugDraw; + +- (void) setDrawContacts: (BOOL) drawContacts; +- (BOOL) drawContacts; + +@end diff --git a/Extras/AllBulletDemosOSX/src/BTSimulationParameters.m b/Extras/AllBulletDemosOSX/src/BTSimulationParameters.m new file mode 100644 index 000000000..45445c5ad --- /dev/null +++ b/Extras/AllBulletDemosOSX/src/BTSimulationParameters.m @@ -0,0 +1,85 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#import "BTSimulationParameters.h" +#import "BTDemo.h" + +@implementation BTSimulationParameters + +- (id) init +{ + if ( self = [super init] ) + {} + + return self; +} + +#pragma mark Public API + +- (void) setIterations: (unsigned) iterations +{ + [BTDemo setIterations: iterations]; +} + +- (unsigned) iterations +{ + return [BTDemo iterations]; +} + +- (unsigned) minIterations { return [BTDemo minIterations]; } +- (unsigned) maxIterations { return [BTDemo maxIterations]; } + + +- (void) setDisableDeactivation: (BOOL) disableDeactivation +{ + [BTDemo setDisableDeactivation: disableDeactivation]; +} + +- (BOOL) disableDeactivation +{ + return [BTDemo disableDeactivation]; +} + +- (void) setDrawAABBs: (BOOL) drawAABBs +{ + [BTDemo setDrawAABBs: drawAABBs]; +} + +- (BOOL) drawAABBs +{ + return [BTDemo drawAABBs];; +} + +- (void) setDebugDraw: (BOOL) debugDraw +{ + [BTDemo setDebugDraw: debugDraw]; +} + +- (BOOL) debugDraw +{ + return [BTDemo debugDraw]; +} + +- (void) setDrawContacts: (BOOL) drawContacts +{ + [BTDemo setDrawContacts: drawContacts]; +} + +- (BOOL) drawContacts +{ + return [BTDemo drawContacts]; +} + +@end diff --git a/Extras/AllBulletDemosOSX/src/toolkit/BTFullscreenWindow.h b/Extras/AllBulletDemosOSX/src/toolkit/BTFullscreenWindow.h new file mode 100644 index 000000000..3172f95a0 --- /dev/null +++ b/Extras/AllBulletDemosOSX/src/toolkit/BTFullscreenWindow.h @@ -0,0 +1,25 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#import + + +@interface BTFullScreenWindow : NSWindow { + +} + +- (id) initForScreen: (NSScreen *) screen; + +@end diff --git a/Extras/AllBulletDemosOSX/src/toolkit/BTFullscreenWindow.m b/Extras/AllBulletDemosOSX/src/toolkit/BTFullscreenWindow.m new file mode 100644 index 000000000..2528f6e12 --- /dev/null +++ b/Extras/AllBulletDemosOSX/src/toolkit/BTFullscreenWindow.m @@ -0,0 +1,48 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#import "BTFullScreenWindow.h" + + +@implementation BTFullScreenWindow + +- (id) initForScreen: (NSScreen *) screen +{ + NSRect frame = [screen frame]; + frame.size.height -= [NSMenuView menuBarHeight]; + + self = [self initWithContentRect: frame + styleMask: NSBorderlessWindowMask + backing: NSBackingStoreBuffered + defer: YES + screen: screen ]; + if ( self ) + { + /* + For some reason, without this + we lose mouse moved events in fullscreen + */ + [self setAcceptsMouseMovedEvents: YES]; + } + + return self; +} + +- (BOOL)canBecomeKeyWindow +{ + return YES; +} + +@end diff --git a/Extras/AllBulletDemosOSX/src/toolkit/BTGLUTKeyAdapter.h b/Extras/AllBulletDemosOSX/src/toolkit/BTGLUTKeyAdapter.h new file mode 100644 index 000000000..3d19f479a --- /dev/null +++ b/Extras/AllBulletDemosOSX/src/toolkit/BTGLUTKeyAdapter.h @@ -0,0 +1,46 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef __BT_KEY_CODE_H__ +#define __BT_KEY_CODE_H__ + +#include + +#if defined(__cplusplus) +extern "C" { +#endif + +/** + @brief Determine if a key is a letter. + @return true if @a keycode is a letter, and not a control + or modifier key. E.g., the letter 'b' is, where the Esc key ( BTKey_Escape ) is not. +*/ +extern BOOL BTKeyIsAlpha( int ); + +/** + @brief Determine if a key is a GLUT special key. ( arrow, F-Keys, etc ) +*/ +extern BOOL BTKeyIsSpecial( int keycode ); + +/** + @brief Convert an OS X keycode to GLUT Special key representation +*/ +extern int BTKeyTranslateKeyCodeToSpecial( int ); + +#if defined(__cplusplus) +} +#endif + +#endif diff --git a/Extras/AllBulletDemosOSX/src/toolkit/BTGLUTKeyAdapter.m b/Extras/AllBulletDemosOSX/src/toolkit/BTGLUTKeyAdapter.m new file mode 100644 index 000000000..786498d9e --- /dev/null +++ b/Extras/AllBulletDemosOSX/src/toolkit/BTGLUTKeyAdapter.m @@ -0,0 +1,128 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#import "BTGLUTKeyAdapter.h" +#import + +BOOL BTKeyIsAlpha( int key ) +{ + return !BTKeyIsSpecial( key ); +} + +BOOL BTKeyIsSpecial( int keycode ) +{ + BOOL ret = NO; + switch( keycode ) + { + case NSUpArrowFunctionKey: + case NSDownArrowFunctionKey: + case NSLeftArrowFunctionKey: + case NSRightArrowFunctionKey: + case NSF1FunctionKey: + case NSF2FunctionKey: + case NSF3FunctionKey: + case NSF4FunctionKey: + case NSF5FunctionKey: + case NSF6FunctionKey: + case NSF7FunctionKey: + case NSF8FunctionKey: + case NSF9FunctionKey: + case NSF10FunctionKey: + case NSF11FunctionKey: + case NSF12FunctionKey: + ret = YES; + break; + + default: break; + } + + return ret; +} + + +int BTKeyTranslateKeyCodeToSpecial( int kc ) +{ + int ret = kc; + switch( kc ) + { + case NSUpArrowFunctionKey: + ret = GLUT_KEY_UP; + break; + + case NSDownArrowFunctionKey: + ret = GLUT_KEY_DOWN; + break; + + case NSLeftArrowFunctionKey: + ret = GLUT_KEY_LEFT; + break; + + case NSRightArrowFunctionKey: + ret = GLUT_KEY_RIGHT; + break; + + case NSF1FunctionKey: + ret = GLUT_KEY_F1; + break; + + case NSF2FunctionKey: + ret = GLUT_KEY_F2; + break; + + case NSF3FunctionKey: + ret = GLUT_KEY_F3; + break; + + case NSF4FunctionKey: + ret = GLUT_KEY_F4; + break; + + case NSF5FunctionKey: + ret = GLUT_KEY_F5; + break; + + case NSF6FunctionKey: + ret = GLUT_KEY_F6; + break; + + case NSF7FunctionKey: + ret = GLUT_KEY_F7; + break; + + case NSF8FunctionKey: + ret = GLUT_KEY_F8; + break; + + case NSF9FunctionKey: + ret = GLUT_KEY_F9; + break; + + case NSF10FunctionKey: + ret = GLUT_KEY_F10; + break; + + case NSF11FunctionKey: + ret = GLUT_KEY_F11; + break; + + case NSF12FunctionKey: + ret = GLUT_KEY_F12; + break; + + default: break; + } + + return ret; +} diff --git a/Extras/AllBulletDemosOSX/src/toolkit/BTOpenGLDisplayDelegate.h b/Extras/AllBulletDemosOSX/src/toolkit/BTOpenGLDisplayDelegate.h new file mode 100644 index 000000000..41d506902 --- /dev/null +++ b/Extras/AllBulletDemosOSX/src/toolkit/BTOpenGLDisplayDelegate.h @@ -0,0 +1,50 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#import + + +@protocol BTOpenGLDisplayDelegate + +- (void) contextCreated; +- (void) contextWillBeDestroyed; +- (void) contextWillResize; +- (void) contextResized: (NSSize) newSize; +- (void) contextDidResize; +- (void) contextStateInvalidated; + +- (void) display: (float) deltaT; + +/////////////////////////////////////////////////////////////////////// +// ASCII keypresses + +- (void) keyPressed: (unsigned char) key; +- (void) keyReleased: (unsigned char) key; + +/////////////////////////////////////////////////////////////////////// +// GLUT Special Keys, such as GLUT_KEY_LEFT ( "left arrow key" ) + +- (void) specialKeyPressed: (unsigned) GLUTKey; +- (void) specialKeyReleased: (unsigned) GLUTKey; + +/////////////////////////////////////////////////////////////////////// +// Mouse. button is GLUT_LEFT_MOUSE, GLUT_RIGHT_MOUSE, etc. + +- (void) mouseButtonPressed: (unsigned) mouseButton; +- (void) mouseButtonReleased: (unsigned) mouseButton; +- (void) mouseMoved: (NSPoint) delta; +- (void) newMousePosition: (NSPoint) newMousePosition; +- (void) scrollWheel: (NSPoint) delta; +@end diff --git a/Extras/AllBulletDemosOSX/src/toolkit/BTOpenGLView.h b/Extras/AllBulletDemosOSX/src/toolkit/BTOpenGLView.h new file mode 100644 index 000000000..a5f4c72b8 --- /dev/null +++ b/Extras/AllBulletDemosOSX/src/toolkit/BTOpenGLView.h @@ -0,0 +1,65 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#import +#import +#import "BTOpenGLDisplayDelegate.h" + +@interface BTOpenGLView : NSView +{ + IBOutlet id _delegate; + + BOOL _firstFrame, + _setupBoundsChangeNotification, + _isFullScreen, + _multisample, + _vblSync, + _suppressResize; + + NSOpenGLContext *_windowedContext; + + unsigned int _modifierFlags; + + float _interval, + _currentFPS; + + double _lastFrameTime; + + NSWindow *_fullscreenWindow, + *_windowedWindow; + + NSTimer *_timer; +} + +- (void) setDelegate: (id ) delegate; +- (id ) delegate; + +- (void) setTargetFPS: (float) fps; +- (float) targetFPS; +- (float) currentFPS; + +- (void) setFullscreen: (BOOL) yesno; +- (BOOL) fullscreen; + +- (void) setMultisampleRendering: (BOOL) multisample; +- (BOOL) multisampleRendering; + +- (void) setVBLSync: (BOOL) sync; +- (BOOL) vblSync; + +- (NSOpenGLContext*) openGLContext; + + +@end diff --git a/Extras/AllBulletDemosOSX/src/toolkit/BTOpenGLView.m b/Extras/AllBulletDemosOSX/src/toolkit/BTOpenGLView.m new file mode 100644 index 000000000..397764a13 --- /dev/null +++ b/Extras/AllBulletDemosOSX/src/toolkit/BTOpenGLView.m @@ -0,0 +1,603 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#import "BTOpenGLView.h" + +#include +#import +#import + +#import "BTFullScreenWindow.h" +#import "BTGLUTKeyAdapter.h" + +#pragma mark - +#pragma mark Private Methods + +@interface BTOpenGLView (Internal) + +- (void) update; +- (void) boundsDidChange: (NSNotification *) notification; +- (void) setVBL: (BOOL*) vbl forContext: (NSOpenGLContext*) context; +- (void) setMultithreaded: (BOOL) mt; +- (NSOpenGLPixelFormat*) windowedPixelFormat: (BOOL*) antialias; + +@end + +@implementation BTOpenGLView + +#pragma mark - +#pragma mark Bootstrap + +- (id)initWithFrame:(NSRect)frameRect +{ + self = [super initWithFrame:frameRect]; + if (self == nil) + { + NSLog( @"BTOpenGLView::initWithFrame - Unable to init" ); + return nil; + } + + _modifierFlags = 0; + _multisample = YES; + _vblSync = YES; + _firstFrame = YES; + _setupBoundsChangeNotification = NO; + + /* + Set up the windowed context -- it will be assigned to the + view later, not now. + */ + _windowedContext = [[NSOpenGLContext alloc] initWithFormat: [self windowedPixelFormat: &_multisample] + shareContext: nil]; + + [self setVBL: &_vblSync forContext: _windowedContext]; + + if (_windowedContext == nil) + { + NSLog(@"Got nil windowed context"); + [self dealloc]; + return nil; + } + + /* + Setup and start the update timer. + */ + _interval = 1.0 / 60.0; + _timer = [[NSTimer scheduledTimerWithTimeInterval: _interval + target: self + selector: @selector(update) + userInfo: nil + repeats: YES ] retain]; + + [[NSRunLoop currentRunLoop] addTimer: _timer forMode: NSEventTrackingRunLoopMode]; + + return self; +} + +- (void)dealloc +{ + [_timer invalidate]; + [_timer release]; + + [_delegate contextWillBeDestroyed]; + + [_windowedContext release]; + + [[NSNotificationCenter defaultCenter] removeObserver: self]; + + [super dealloc]; +} + +- (void) awakeFromNib +{ + NSWindow *window = [self window]; + [window setAcceptsMouseMovedEvents: YES]; + [window makeFirstResponder: self]; + [window setInitialFirstResponder: self]; +} + +- (void)drawRect:(NSRect)rect +{ + [self update]; +} + +#pragma mark - +#pragma mark Public API + +- (void) setDelegate: (id ) delegate +{ + // we don't retain delegates + _delegate = delegate; +} + +- (id ) delegate +{ + return _delegate; +} + +- (void) setTargetFPS: (float) fps +{ + float newInterval = 1.0 / fps; + if ( ABS( newInterval - _interval ) > 1.0e-3 ) + { + _interval = newInterval; + + [_timer invalidate]; + [_timer release]; + + _timer = [[NSTimer scheduledTimerWithTimeInterval: _interval + target: self + selector: @selector(update) + userInfo: nil + repeats: YES ] retain]; + + [[NSRunLoop currentRunLoop] addTimer: _timer forMode: NSEventTrackingRunLoopMode]; + } + +} + +- (float) targetFPS +{ + return 1.0 / _interval; +} + +- (float) currentFPS +{ + return _currentFPS; +} + +- (void) setFullscreen: (BOOL) fullscreen +{ + if ( fullscreen == _isFullScreen ) return; + + _isFullScreen = fullscreen; + _suppressResize = YES; + + if ( _isFullScreen ) + { + _windowedWindow = [self window]; + + /* + Detach & retain the content view from the non-fullscreen window. + */ + + NSView *contentView = [_windowedWindow contentView]; + [contentView retain]; + [contentView removeFromSuperviewWithoutNeedingDisplay]; + + /* + Create a fullscreen window, attach the content view, + and release the content view since the fullscreen window retained it. + */ + + _fullscreenWindow = [[BTFullScreenWindow alloc] initForScreen: [_windowedWindow screen]]; + [_fullscreenWindow setContentView: contentView ]; + [_fullscreenWindow makeKeyAndOrderFront:nil]; + [contentView release]; + + /* + Hide the old window + */ + [_windowedWindow orderOut: nil]; + + /* + Now, use the SetSystemUIMode API to auto-hide the dock + */ + + OSStatus error = SetSystemUIMode( kUIModeContentSuppressed, 0 ); + if ( error != noErr) + { + NSLog(@"Error couldn't set SystemUIMode: %ld", (long)error); + } + + } + else if ( _fullscreenWindow ) + { + /* + Detach and retain the content view from the fullscreen window + */ + NSView *contentView = [_fullscreenWindow contentView]; + [contentView retain]; + [contentView removeFromSuperviewWithoutNeedingDisplay]; + + /* + Reparent the content view to the non-fullscreen window, + and release it since it's now owned by the non-fullscreen window + */ + [_windowedWindow setContentView: contentView]; + [contentView release]; + + [_windowedWindow makeKeyAndOrderFront: nil]; + + /* + Release the fullscreen window + */ + [_fullscreenWindow orderOut: nil]; + [_fullscreenWindow release]; + _fullscreenWindow = nil; + + /* + Restore dock's normal behaior + */ + + OSStatus error = SetSystemUIMode( kUIModeNormal, 0 ); + if ( error != noErr) + { + NSLog(@"Error couldn't set SystemUIMode: %ld", (long)error); + } + } + + _suppressResize = NO; + + [self boundsDidChange: nil]; +} + +- (BOOL) fullscreen +{ + return _isFullScreen; +} + +- (void) setMultisampleRendering: (BOOL) multisample +{ + if ( multisample == _multisample ) return; + + _multisample = multisample; + _firstFrame = YES; + + + NSOpenGLContext *oldWindowedContext = _windowedContext; + _windowedContext = [[NSOpenGLContext alloc] initWithFormat: [self windowedPixelFormat: &_multisample] + shareContext: oldWindowedContext ]; + + [self setVBL: &_vblSync forContext: _windowedContext]; + + [oldWindowedContext release]; + [_windowedContext setView: self]; + [_windowedContext makeCurrentContext]; + [_windowedContext update]; + [self update]; +} + +- (BOOL) multisampleRendering +{ + return _multisample; +} + +- (void) setVBLSync: (BOOL) sync +{ + if ( sync == _vblSync ) return; + + _vblSync = sync; + [self setVBL: &_vblSync forContext: _windowedContext]; +} + +- (BOOL) vblSync +{ + return _vblSync; +} + +- (NSOpenGLContext *) openGLContext +{ + return _windowedContext; +} + +#pragma mark - +#pragma mark NSView Overrides + +- (BOOL) isOpaque +{ + return YES; +} + +- (BOOL) acceptsFirstResponder +{ + return YES; +} + +- (void) keyDown:(NSEvent *)theEvent +{ + int key = [[theEvent charactersIgnoringModifiers] characterAtIndex:0]; + + if ( BTKeyIsAlpha( key )) + { + [ _delegate keyPressed: key ]; + } + else + { + [_delegate specialKeyPressed: BTKeyTranslateKeyCodeToSpecial( key )]; + } +} + +- (void) keyUp:(NSEvent *)theEvent +{ + int key = [[theEvent charactersIgnoringModifiers] characterAtIndex:0]; + + if ( BTKeyIsAlpha( key )) + { + [ _delegate keyReleased: key ]; + } + else + { + [_delegate specialKeyReleased: BTKeyTranslateKeyCodeToSpecial( key )]; + } +} + +- (void) mouseDown: (NSEvent *) event +{ + int button = GLUT_LEFT_BUTTON; + switch( [event buttonNumber] ) + { + case 0: button = GLUT_LEFT_BUTTON; break; + case 1: button = GLUT_RIGHT_BUTTON; break; + case 2: button = GLUT_MIDDLE_BUTTON; break; + default: break; + } + + if ( _modifierFlags & NSControlKeyMask ) button = GLUT_RIGHT_BUTTON; + else if ( _modifierFlags & NSAlternateKeyMask ) button = GLUT_MIDDLE_BUTTON; + + [_delegate mouseButtonPressed: button]; +} + +- (void) mouseUp: (NSEvent *) event +{ + int button = GLUT_LEFT_BUTTON; + switch( [event buttonNumber] ) + { + case 0: button = GLUT_LEFT_BUTTON; break; + case 1: button = GLUT_RIGHT_BUTTON; break; + case 2: button = GLUT_MIDDLE_BUTTON; break; + default: break; + } + + if ( _modifierFlags & NSControlKeyMask ) button = GLUT_RIGHT_BUTTON; + else if ( _modifierFlags & NSAlternateKeyMask ) button = GLUT_MIDDLE_BUTTON; + + [_delegate mouseButtonReleased: button]; +} + +-(void) mouseMoved: (NSEvent *) event +{ + float dx = [event deltaX], + dy = [event deltaY]; + + NSPoint locationInView = [self convertPoint: [event locationInWindow] fromView: nil ]; + + [_delegate mouseMoved: NSMakePoint( dx, dy )]; + [_delegate newMousePosition: locationInView]; +} + +-(void) mouseDragged: (NSEvent *) event +{ + [self mouseMoved: event]; +} + +- (void) scrollWheel: (NSEvent *) event +{ + float dx = [event deltaX], + dy = [event deltaY]; + + [_delegate scrollWheel: NSMakePoint( dx, dy )]; +} + +- (void)flagsChanged:(NSEvent *) event +{ + _modifierFlags = [event modifierFlags]; +} + + +#pragma mark - +#pragma mark Private + +- (void) update +{ + if ( !_setupBoundsChangeNotification ) + { + _setupBoundsChangeNotification = YES; + + /* + This is hacky, but basically, we can't handle bounds-changing + ops correctly until everything's set up correctly. + */ + [self setPostsBoundsChangedNotifications:YES]; + [[NSNotificationCenter defaultCenter] addObserver: self + selector: @selector( boundsDidChange: ) + name: NSViewFrameDidChangeNotification + object: nil]; + } + + if (_firstFrame) + { + [_windowedContext setView:self]; + } + + [_windowedContext makeCurrentContext]; + + if (_firstFrame) + { + _firstFrame = NO; + + [_delegate contextCreated]; + + if ( _multisample ) + { + glEnable (GL_MULTISAMPLE_ARB); + // this fucks up text rendering, on nVIDIA, at least + //glHint (GL_MULTISAMPLE_FILTER_HINT_NV, GL_NICEST); + } + else + { + glDisable( GL_MULTISAMPLE_ARB ); + } + + [self setMultithreaded: NO]; + + NSSize contextSize; + if ( _isFullScreen ) + { + contextSize.width = CGDisplayPixelsWide(kCGDirectMainDisplay); + contextSize.height = CGDisplayPixelsHigh(kCGDirectMainDisplay); + } + else + { + contextSize = [self bounds].size; + } + + [_delegate contextWillResize]; + [_delegate contextResized: contextSize]; + [_delegate contextDidResize]; + [_delegate contextStateInvalidated]; + } + + double now = CFAbsoluteTimeGetCurrent(); + + if ( _delegate) [_delegate display: now - _lastFrameTime]; + else + { + glClearColor( 0.5, 0.5, 0.5, 1 ); + glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); + } + + _lastFrameTime = now; + + + [[NSOpenGLContext currentContext] flushBuffer]; + + /* + Now, update our FPS + */ + + { + static unsigned int frameCounter = 1; + static double lastCheckTime = 0; + + double elapsed = now - lastCheckTime; + if ( elapsed > 1.0 ) + { + _currentFPS = (float) ( ((double) frameCounter ) / elapsed ); + + lastCheckTime = now; + frameCounter = 0; + } + + frameCounter++; + } +} + +- (void) boundsDidChange: (NSNotification *) notification +{ + if ( _suppressResize ) return; + + [_windowedContext setView:self]; + [_windowedContext makeCurrentContext]; + [_windowedContext update]; + + NSSize contextSize = [self bounds].size; + + if ( _delegate ) + { + [_delegate contextWillResize]; + [_delegate contextResized: contextSize ]; + [_delegate contextDidResize]; + } + else + { + glViewport( 0, 0, (int) contextSize.width, (int) contextSize.height ); + } +} + +- (void) setVBL: (BOOL*) vbl forContext: (NSOpenGLContext*) context +{ + GLint value = *vbl ? 1 : 0; + [context setValues: &value forParameter: NSOpenGLCPSwapInterval]; + + *vbl = value ? YES : NO; +} + +- (void) setMultithreaded: (BOOL) mt +{ + CGLError err = kCGLNoError; + CGLContextObj ctx = CGLGetCurrentContext(); + + // Enable Apple's multi-threaded GL engine -- it's generally useful for + // high vertex throughput. Not high fragment situations + + if ( mt ) + { + err = CGLEnable( ctx, kCGLCEMPEngine ); + } + else + { + err = CGLDisable( ctx, kCGLCEMPEngine ); + } + + if (err != kCGLNoError ) + { + NSLog( @"BTOpenGLView -setMultithreaded: forContext: -- Unable to %s multithreaded GL", + mt ? "enable" : "disable" ); + } +} + +- (NSOpenGLPixelFormat*) windowedPixelFormat: (BOOL*) antialias +{ + NSOpenGLPixelFormatAttribute aaAttrs[] = + { + NSOpenGLPFADoubleBuffer, + NSOpenGLPFAAccelerated, + NSOpenGLPFADepthSize, (NSOpenGLPixelFormatAttribute)32, + NSOpenGLPFAStencilSize, (NSOpenGLPixelFormatAttribute)0, + NSOpenGLPFASingleRenderer, + NSOpenGLPFASampleBuffers, (NSOpenGLPixelFormatAttribute)( 1 ), + NSOpenGLPFASamples, (NSOpenGLPixelFormatAttribute)( 4 ), + NSOpenGLPFAScreenMask, (NSOpenGLPixelFormatAttribute) CGDisplayIDToOpenGLDisplayMask(kCGDirectMainDisplay), + NSOpenGLPFANoRecovery, + (NSOpenGLPixelFormatAttribute)0 + }; + + NSOpenGLPixelFormatAttribute vanillaAttrs[] = + { + NSOpenGLPFADoubleBuffer, + NSOpenGLPFAAccelerated, + NSOpenGLPFADepthSize, (NSOpenGLPixelFormatAttribute)32, + NSOpenGLPFAStencilSize, (NSOpenGLPixelFormatAttribute)0, + NSOpenGLPFASingleRenderer, + NSOpenGLPFASampleBuffers, (NSOpenGLPixelFormatAttribute)( 0 ), + NSOpenGLPFASamples, (NSOpenGLPixelFormatAttribute)( 0 ), + NSOpenGLPFAScreenMask, (NSOpenGLPixelFormatAttribute) CGDisplayIDToOpenGLDisplayMask(kCGDirectMainDisplay), + NSOpenGLPFANoRecovery, + (NSOpenGLPixelFormatAttribute)0 + }; + + NSOpenGLPixelFormat* fmt = 0; + + if ( *antialias ) + { + fmt = [[NSOpenGLPixelFormat alloc] initWithAttributes: (NSOpenGLPixelFormatAttribute*) aaAttrs]; + if ( nil == fmt ) + { + *antialias = NO; + fmt = [[NSOpenGLPixelFormat alloc] initWithAttributes: (NSOpenGLPixelFormatAttribute*) vanillaAttrs]; + } + } + else + { + fmt = [[NSOpenGLPixelFormat alloc] initWithAttributes: (NSOpenGLPixelFormatAttribute*) vanillaAttrs]; + } + + return fmt; +} + + +@end