Added Mac OSX XCode project with Cocoa userinterface (wrapping GLUT) for Bullet demos

Thanks to TomorrowPlus for the constribution!
This commit is contained in:
erwin.coumans
2008-05-18 00:38:17 +00:00
parent d9e7058ff2
commit 0b48b1c76b
26 changed files with 7575 additions and 0 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,248 @@
// !$*UTF8*$!
{
29B97313FDCFA39411CA2CEA /* Project object */ = {
activeArchitecture = i386;
activeBuildConfigurationName = Release;
activeExecutable = 36C69D030DC9E7BD0034504A /* AllBulletDemos */;
activeTarget = 8D1107260486CEB800E47090 /* AllBulletDemos */;
addToTargets = (
8D1107260486CEB800E47090 /* AllBulletDemos */,
);
codeSenseManager = 36C69D160DC9E7C30034504A /* Code sense */;
executables = (
36C69D030DC9E7BD0034504A /* AllBulletDemos */,
);
perUserDictionary = {
"PBXConfiguration.PBXBreakpointsDataSource.v1:1CA23EDF0692099D00951B8B" = {
PBXFileTableDataSourceColumnSortingDirectionKey = "-1";
PBXFileTableDataSourceColumnSortingKey = PBXBreakpointsDataSource_BreakpointID;
PBXFileTableDataSourceColumnWidthsKey = (
20,
20,
327,
20,
227,
227,
156,
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,
827,
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,
787,
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 = 231705029;
PBXWorkspaceStateSaveDate = 231705029;
};
sourceControlManager = 36C69D150DC9E7C30034504A /* Source Control */;
userBuildSettings = {
};
};
3620538A0DCE4FB70048F794 /* file.obj */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {1005, 23897}}";
sepNavSelRange = "{0, 0}";
sepNavVisRange = "{0, 1284}";
};
};
3699D19A0DCF64EE001D9494 /* SoftDemo.cpp */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {1713, 6007}}";
sepNavSelRange = "{0, 0}";
sepNavVisRange = "{0, 1773}";
};
};
36A05BBB0DCBA09000ADF289 /* English */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {1393, 270}}";
sepNavSelRange = "{126, 0}";
sepNavVisRect = "{{0, 0}, {1393, 270}}";
};
};
36A05DC70DCBBAC000ADF289 /* BTFullscreenWindow.h */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {1713, 523}}";
sepNavSelRange = "{973, 0}";
sepNavVisRange = "{0, 1071}";
};
};
36A05DC80DCBBAC000ADF289 /* BTFullscreenWindow.m */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {1713, 637}}";
sepNavSelRange = "{1017, 0}";
sepNavVisRange = "{464, 1072}";
};
};
36A05DC90DCBBAC000ADF289 /* BTGLUTKeyAdapter.h */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {1713, 611}}";
sepNavSelRange = "{949, 0}";
sepNavVisRange = "{0, 1547}";
};
};
36A05DCA0DCBBAC000ADF289 /* BTGLUTKeyAdapter.m */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {1713, 1410}}";
sepNavSelRange = "{949, 0}";
sepNavVisRange = "{0, 1483}";
};
};
36A05DCB0DCBBAC000ADF289 /* BTOpenGLDisplayDelegate.h */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {1713, 663}}";
sepNavSelRange = "{948, 0}";
sepNavVisRange = "{503, 1525}";
};
};
36A05DCC0DCBBAC000ADF289 /* BTOpenGLView.h */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {1713, 858}}";
sepNavSelRange = "{1773, 0}";
sepNavVisRange = "{1035, 919}";
};
};
36A05DCD0DCBBAC000ADF289 /* BTOpenGLView.m */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {1713, 4646}}";
sepNavSelRange = "{3853, 0}";
sepNavVisRange = "{3389, 750}";
};
};
36A05DCE0DCBBAC000ADF289 /* BTSimulationParameters.m */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {1713, 1118}}";
sepNavSelRange = "{1044, 0}";
sepNavVisRange = "{1466, 552}";
};
};
36A05DCF0DCBBAC000ADF289 /* BTDemosAppController.m */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {1713, 1578}}";
sepNavSelRange = "{1175, 0}";
sepNavVisRange = "{1623, 839}";
};
};
36A05DD00DCBBAC000ADF289 /* BTSimulationParameters.h */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {1713, 585}}";
sepNavSelRange = "{1140, 0}";
sepNavVisRange = "{137, 1474}";
};
};
36A05DD10DCBBAC000ADF289 /* BTDemosAppController.h */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {1713, 715}}";
sepNavSelRange = "{948, 0}";
sepNavVisRange = "{0, 1519}";
};
};
36A72EFD0DCC816F00BA8039 /* BTDemo.h */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {1713, 1352}}";
sepNavSelRange = "{1030, 0}";
sepNavVisRange = "{1827, 1143}";
};
};
36A72EFE0DCC816F00BA8039 /* BTDemo.mm */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {1713, 2372}}";
sepNavSelRange = "{948, 0}";
sepNavVisRange = "{0, 1551}";
};
};
36C69D030DC9E7BD0034504A /* AllBulletDemos */ = {
isa = PBXExecutable;
activeArgIndices = (
);
argumentStrings = (
);
autoAttachOnCrash = 1;
breakpointsEnabled = 0;
configStateDict = {
};
customDataFormattersEnabled = 1;
debuggerPlugin = GDBDebugging;
disassemblyDisplayState = 0;
dylibVariantSuffix = "";
enableDebugStr = 1;
environmentEntries = (
);
executableSystemSymbolLevel = 0;
executableUserSymbolLevel = 0;
libgmallocEnabled = 0;
name = AllBulletDemos;
savedGlobals = {
};
sourceDirectories = (
);
variableFormatDictionary = {
};
};
36C69D150DC9E7C30034504A /* Source Control */ = {
isa = PBXSourceControlManager;
fallbackIsa = XCSourceControlManager;
isSCMEnabled = 0;
scmConfiguration = {
};
};
36C69D160DC9E7C30034504A /* Code sense */ = {
isa = PBXCodeSenseManager;
indexTemplatePath = "";
};
8D1107260486CEB800E47090 /* AllBulletDemos */ = {
activeExec = 0;
executables = (
36C69D030DC9E7BD0034504A /* AllBulletDemos */,
);
};
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,7 @@
//
// Prefix header for all source files of the 'AllBulletDemos' target in the 'AllBulletDemos' project
//
#ifdef __OBJC__
#import <Cocoa/Cocoa.h>
#endif

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,11 @@
{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf270
{\fonttbl\f0\fnil\fcharset0 LucidaGrande;}
{\colortbl;\red255\green255\blue255;}
\deftab560
\pard\tx560\pardeftab560\qc\pardirnatural
\f0\b\fs28 \cf0 \CocoaLigature0 Bullet Continuous Collision Detection and Physics Library
\b0\fs22 \
\
Copyright (c) 2003-2008 Erwin Coumans \
{\field{\*\fldinst{HYPERLINK "http://www.bulletphysics.com/"}}{\fldrslt http://www.bulletphysics.com}}}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,28 @@
<?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>CFBundleIconFile</key>
<string>BulletIcon</string>
<key>CFBundleIdentifier</key>
<string>org.bullet.${PRODUCT_NAME:identifier}</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>${PRODUCT_NAME}</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1.0</string>
<key>NSMainNibFile</key>
<string>MainMenu</string>
<key>NSPrincipalClass</key>
<string>NSApplication</string>
</dict>
</plist>

View File

@@ -0,0 +1,6 @@
To build:
Place AllBulletDemosOSX in bullet-<version>/Extras and build with Xcode.
Questions:
contact Shamyl Zakariya
shamyl@zakariya.net

View File

@@ -0,0 +1,14 @@
//
// main.m
// AllBulletDemos
//
// Created by Shamyl Zakariya on 5/1/08.
// Copyright Shamyl Zakariya 2008. All rights reserved.
//
#import <Cocoa/Cocoa.h>
int main(int argc, char *argv[])
{
return NSApplicationMain(argc, (const char **) argv);
}

View File

@@ -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 <Cocoa/Cocoa.h>
#import "BTOpenGLDisplayDelegate.h"
@class BTDemoEntry;
@interface BTDemo : NSObject <BTOpenGLDisplayDelegate> {
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

View File

@@ -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

View File

@@ -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 <Cocoa/Cocoa.h>
#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

View File

@@ -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

View File

@@ -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 <Cocoa/Cocoa.h>
/*
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

View File

@@ -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

View File

@@ -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 <Cocoa/Cocoa.h>
@interface BTFullScreenWindow : NSWindow {
}
- (id) initForScreen: (NSScreen *) screen;
@end

View File

@@ -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

View File

@@ -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 <GLUT/glut.h>
#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

View File

@@ -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 <Cocoa/Cocoa.h>
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;
}

View File

@@ -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 <Cocoa/Cocoa.h>
@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

View File

@@ -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 <Cocoa/Cocoa.h>
#import <OpenGL/OpenGL.h>
#import "BTOpenGLDisplayDelegate.h"
@interface BTOpenGLView : NSView
{
IBOutlet id <BTOpenGLDisplayDelegate> _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 <BTOpenGLDisplayDelegate>) delegate;
- (id <BTOpenGLDisplayDelegate>) 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

View File

@@ -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 <CoreFoundation/CoreFoundation.h>
#import <OpenGL/OpenGL.h>
#import <Carbon/Carbon.h>
#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 <BTOpenGLDisplayDelegate>) delegate
{
// we don't retain delegates
_delegate = delegate;
}
- (id <BTOpenGLDisplayDelegate>) 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