From c42c7d64eb000a1a2f39b3043150a01c39e704f8 Mon Sep 17 00:00:00 2001 From: dsc Date: Sat, 7 May 2011 21:19:08 -0700 Subject: [PATCH] Adds Sparrow as source dep, as linker flags -ObjC -all_load break Box2D. --- etc/en.lproj/InfoPlist.strings | 2 + etc/tanks-Info.plist | 48 + src/RootAppDelegate.h | 21 + src/RootAppDelegate.m | 50 + src/main.m | 17 + src/prefix.pch | 14 + src/render/Box2DAppDelegate.h | 24 + src/render/Box2DAppDelegate.mm | 62 ++ src/render/Box2DView.h | 63 ++ src/render/Box2DView.mm | 295 ++++++ src/render/Delegates.h | 14 + src/render/GLES-Render.h | 58 ++ src/render/GLES-Render.mm | 149 +++ src/render/TestEntriesViewController.h | 19 + src/render/TestEntriesViewController.mm | 75 ++ src/render/iPhoneTest.h | 185 ++++ src/render/iPhoneTest.mm | 411 +++++++++ src/render/iPhoneTestEntries.mm | 92 ++ src/tanks/Game.h | 15 + src/tanks/Game.m | 30 + src/ui/iPad/RootAppDelegate_iPad.h | 16 + src/ui/iPad/RootAppDelegate_iPad.m | 18 + src/ui/iPad/en.lproj/MainWindow_iPad.xib | 237 +++++ src/ui/iPhone/RootAppDelegate_iPhone.h | 16 + src/ui/iPhone/RootAppDelegate_iPhone.m | 18 + src/ui/iPhone/en.lproj/MainWindow_iPhone.xib | 238 +++++ tanks.xcodeproj/project.pbxproj | 1002 +++++++++++++++++++++ tanks/tanks.xcodeproj/project.pbxproj | 593 ------------ tanks/tanks/Game.h | 15 - tanks/tanks/Game.m | 30 - tanks/tanks/en.lproj/InfoPlist.strings | 2 - tanks/tanks/iPad/en.lproj/MainWindow_iPad.xib | 296 ------ tanks/tanks/iPad/tanksAppDelegate_iPad.h | 16 - tanks/tanks/iPad/tanksAppDelegate_iPad.m | 18 - tanks/tanks/iPhone/en.lproj/MainWindow_iPhone.xib | 302 ------- tanks/tanks/iPhone/tanksAppDelegate_iPhone.h | 16 - tanks/tanks/iPhone/tanksAppDelegate_iPhone.m | 18 - tanks/tanks/main.m | 17 - tanks/tanks/tanks-Info.plist | 47 - tanks/tanks/tanks-Prefix.pch | 14 - tanks/tanks/tanksAppDelegate.h | 21 - tanks/tanks/tanksAppDelegate.m | 50 - tanks/tanksTests/en.lproj/InfoPlist.strings | 2 - tanks/tanksTests/tanksTests-Info.plist | 22 - tanks/tanksTests/tanksTests-Prefix.pch | 7 - tanks/tanksTests/tanksTests.h | 17 - tanks/tanksTests/tanksTests.m | 33 - 47 files changed, 3189 insertions(+), 1536 deletions(-) create mode 100644 etc/en.lproj/InfoPlist.strings create mode 100644 etc/tanks-Info.plist create mode 100644 src/RootAppDelegate.h create mode 100644 src/RootAppDelegate.m create mode 100644 src/main.m create mode 100644 src/prefix.pch create mode 100644 src/render/Box2DAppDelegate.h create mode 100644 src/render/Box2DAppDelegate.mm create mode 100644 src/render/Box2DView.h create mode 100644 src/render/Box2DView.mm create mode 100644 src/render/Delegates.h create mode 100644 src/render/GLES-Render.h create mode 100644 src/render/GLES-Render.mm create mode 100644 src/render/TestEntriesViewController.h create mode 100644 src/render/TestEntriesViewController.mm create mode 100644 src/render/iPhoneTest.h create mode 100644 src/render/iPhoneTest.mm create mode 100644 src/render/iPhoneTestEntries.mm create mode 100644 src/tanks/Game.h create mode 100644 src/tanks/Game.m create mode 100644 src/ui/iPad/RootAppDelegate_iPad.h create mode 100644 src/ui/iPad/RootAppDelegate_iPad.m create mode 100644 src/ui/iPad/en.lproj/MainWindow_iPad.xib create mode 100644 src/ui/iPhone/RootAppDelegate_iPhone.h create mode 100644 src/ui/iPhone/RootAppDelegate_iPhone.m create mode 100644 src/ui/iPhone/en.lproj/MainWindow_iPhone.xib create mode 100644 tanks.xcodeproj/project.pbxproj delete mode 100644 tanks/tanks.xcodeproj/project.pbxproj delete mode 100644 tanks/tanks/Game.h delete mode 100644 tanks/tanks/Game.m delete mode 100644 tanks/tanks/en.lproj/InfoPlist.strings delete mode 100644 tanks/tanks/iPad/en.lproj/MainWindow_iPad.xib delete mode 100644 tanks/tanks/iPad/tanksAppDelegate_iPad.h delete mode 100644 tanks/tanks/iPad/tanksAppDelegate_iPad.m delete mode 100644 tanks/tanks/iPhone/en.lproj/MainWindow_iPhone.xib delete mode 100644 tanks/tanks/iPhone/tanksAppDelegate_iPhone.h delete mode 100644 tanks/tanks/iPhone/tanksAppDelegate_iPhone.m delete mode 100644 tanks/tanks/main.m delete mode 100644 tanks/tanks/tanks-Info.plist delete mode 100644 tanks/tanks/tanks-Prefix.pch delete mode 100644 tanks/tanks/tanksAppDelegate.h delete mode 100644 tanks/tanks/tanksAppDelegate.m delete mode 100644 tanks/tanksTests/en.lproj/InfoPlist.strings delete mode 100644 tanks/tanksTests/tanksTests-Info.plist delete mode 100644 tanks/tanksTests/tanksTests-Prefix.pch delete mode 100644 tanks/tanksTests/tanksTests.h delete mode 100644 tanks/tanksTests/tanksTests.m diff --git a/etc/en.lproj/InfoPlist.strings b/etc/en.lproj/InfoPlist.strings new file mode 100644 index 0000000..477b28f --- /dev/null +++ b/etc/en.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/etc/tanks-Info.plist b/etc/tanks-Info.plist new file mode 100644 index 0000000..2a1e14a --- /dev/null +++ b/etc/tanks-Info.plist @@ -0,0 +1,48 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleDisplayName + ${PRODUCT_NAME} + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIconFile + + CFBundleIdentifier + com.lttlst.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + LSRequiresIPhoneOS + + NSMainNibFile + MainWindow_iPhone + NSMainNibFile~ipad + MainWindow_iPad + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + UIInterfaceOrientationPortraitUpsideDown + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/src/RootAppDelegate.h b/src/RootAppDelegate.h new file mode 100644 index 0000000..b3d29e3 --- /dev/null +++ b/src/RootAppDelegate.h @@ -0,0 +1,21 @@ +// +// RootAppDelegate.h +// tanks +// +// Created by dsc on 4/27/11. +// Copyright 2011 lttlst.com. All rights reserved. +// + +#import +#import "Sparrow.h" + +@interface RootAppDelegate : NSObject +{ + UIWindow *window; + SPView *sparrowView; +} + +@property (nonatomic, retain) IBOutlet UIWindow *window; +@property (nonatomic, retain) IBOutlet SPView *sparrowView; + +@end \ No newline at end of file diff --git a/src/RootAppDelegate.m b/src/RootAppDelegate.m new file mode 100644 index 0000000..0cdfe1d --- /dev/null +++ b/src/RootAppDelegate.m @@ -0,0 +1,50 @@ +// +// RootAppDelegate.m +// tanks +// +// Created by dsc on 4/27/11. +// Copyright 2011 lttlst.com. All rights reserved. +// + +#import "RootAppDelegate.h" +#import "Game.h" + +@implementation RootAppDelegate + +@synthesize window; +@synthesize sparrowView; + +- (void)applicationDidFinishLaunching:(UIApplication *)application +{ + SP_CREATE_POOL(pool); + + [SPStage setSupportHighResolutions:YES]; + [SPAudioEngine start]; + + Game *game = [[Game alloc] init]; + sparrowView.stage = game; + [game release]; + + [window makeKeyAndVisible]; + [sparrowView start]; + + SP_RELEASE_POOL(pool); +} + +- (void)applicationWillResignActive:(UIApplication *)application +{ + [sparrowView stop]; +} + +- (void)applicationDidBecomeActive:(UIApplication *)application +{ + [sparrowView start]; +} + +- (void)dealloc +{ + [sparrowView release]; + [window release]; + [super dealloc]; +} +@end \ No newline at end of file diff --git a/src/main.m b/src/main.m new file mode 100644 index 0000000..6b5e5b5 --- /dev/null +++ b/src/main.m @@ -0,0 +1,17 @@ +// +// main.m +// tanks +// +// Created by dsc on 4/27/11. +// Copyright 2011 lttlst.com. All rights reserved. +// + +#import + +int main(int argc, char *argv[]) +{ + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + int retVal = UIApplicationMain(argc, argv, nil, nil); + [pool release]; + return retVal; +} diff --git a/src/prefix.pch b/src/prefix.pch new file mode 100644 index 0000000..45a03fd --- /dev/null +++ b/src/prefix.pch @@ -0,0 +1,14 @@ +// +// Prefix header for all source files of the 'tanks' target in the 'tanks' project +// + +#import + +#ifndef __IPHONE_3_0 +#warning "This project uses features only available in iPhone SDK 3.0 and later." +#endif + +#ifdef __OBJC__ + #import + #import +#endif diff --git a/src/render/Box2DAppDelegate.h b/src/render/Box2DAppDelegate.h new file mode 100644 index 0000000..f081ba3 --- /dev/null +++ b/src/render/Box2DAppDelegate.h @@ -0,0 +1,24 @@ +// +// Box2DAppDelegate.h +// Box2D +// +// Box2D iPhone port by Simon Oliver - http://www.simonoliver.com - http://www.handcircus.com +// + +#import +#import "TestEntriesViewController.h" +#import "Delegates.h" + +@class Box2DView; + +@interface Box2DAppDelegate : NSObject { + UIWindow *window; + Box2DView *glView; + TestEntriesViewController *testEntriesView; +} + +@property (nonatomic, retain) IBOutlet UIWindow *window; +@property (nonatomic, retain) IBOutlet Box2DView *glView; + +@end + diff --git a/src/render/Box2DAppDelegate.mm b/src/render/Box2DAppDelegate.mm new file mode 100644 index 0000000..e04a09e --- /dev/null +++ b/src/render/Box2DAppDelegate.mm @@ -0,0 +1,62 @@ +// +// Box2DAppDelegate.m +// Box2D +// +// Box2D iPhone port by Simon Oliver - http://www.simonoliver.com - http://www.handcircus.com +// + +#import +#import "Box2DAppDelegate.h" +#import "Box2DView.h" + +@implementation Box2DAppDelegate + +@synthesize window; +@synthesize glView; + +- (void)applicationDidFinishLaunching:(UIApplication *)application { + [application setStatusBarHidden:true]; + + [glView removeFromSuperview]; + + glView.animationInterval = 1.0 / 60.0; + + testEntriesView=[[TestEntriesViewController alloc] initWithStyle:UITableViewStylePlain]; + [testEntriesView setDelegate:self]; + [glView setDelegate:self]; + + [window addSubview:[testEntriesView view]]; +} + +-(void) selectTest:(int) testIndex +{ + [[testEntriesView view] removeFromSuperview]; + [window addSubview:glView]; + [glView startAnimation]; + [glView selectTestEntry:testIndex]; +} + +-(void) leaveTest +{ + [glView stopAnimation]; + [glView removeFromSuperview]; + [window addSubview:[testEntriesView view]]; +} + +- (void)applicationWillResignActive:(UIApplication *)application { + glView.animationInterval = 1.0 / 5.0; +} + + +- (void)applicationDidBecomeActive:(UIApplication *)application { + glView.animationInterval = 1.0 / 60.0; +} + + +- (void)dealloc { + [window release]; + [glView release]; + [super dealloc]; +} + +@end diff --git a/src/render/Box2DView.h b/src/render/Box2DView.h new file mode 100644 index 0000000..81d50b3 --- /dev/null +++ b/src/render/Box2DView.h @@ -0,0 +1,63 @@ +// +// Box2DView.h +// Box2D OpenGL View +// +// Box2D iPhone port by Simon Oliver - http://www.simonoliver.com - http://www.handcircus.com +// + + +#import +#import +#import +#import + +#import "iPhoneTest.h" +#import "Delegates.h" + +/* +This class wraps the CAEAGLLayer from CoreAnimation into a convenient UIView subclass. +The view content is basically an EAGL surface you render your OpenGL scene into. +Note that setting the view non-opaque will only work if the EAGL surface has an alpha channel. +*/ +@interface Box2DView : UIView { + +@private + /* The pixel dimensions of the backbuffer */ + GLint backingWidth; + GLint backingHeight; + + EAGLContext *context; + + /* OpenGL names for the renderbuffer and framebuffers used to render to this view */ + GLuint viewRenderbuffer, viewFramebuffer; + + /* OpenGL name for the depth buffer that is attached to viewFramebuffer, if it exists (0 if it does not exist) */ + GLuint depthRenderbuffer; + + NSTimer *animationTimer; + NSTimeInterval animationInterval; + + TestEntry* entry; + Test* test; + + // Position offset and scale + float sceneScale; + CGPoint positionOffset; + CGPoint lastWorldTouch; + CGPoint lastScreenTouch; + + bool panning; + int doubleClickValidCountdown; + + id _delegate; + +} +@property(assign) id delegate; +@property NSTimeInterval animationInterval; + +- (void)startAnimation; +- (void)stopAnimation; +- (void)drawView; +-(void) selectTestEntry:(int) testIndex; + +@end diff --git a/src/render/Box2DView.mm b/src/render/Box2DView.mm new file mode 100644 index 0000000..11743b0 --- /dev/null +++ b/src/render/Box2DView.mm @@ -0,0 +1,295 @@ +// +// Box2DView.mm +// Box2D OpenGL View +// +// Box2D iPhone port by Simon Oliver - http://www.simonoliver.com - http://www.handcircus.com +// + +#import +#import + +#import "Box2DView.h" + +#define USE_DEPTH_BUFFER 0 +#define kAccelerometerFrequency 30 +#define FRAMES_BETWEEN_PRESSES_FOR_DOUBLE_CLICK 10 + +Settings settings; + +// A class extension to declare private methods +@interface Box2DView () + +@property (nonatomic, retain) EAGLContext *context; +@property (nonatomic, assign) NSTimer *animationTimer; + +- (BOOL) createFramebuffer; +- (void) destroyFramebuffer; + +@end + + +@implementation Box2DView + +@synthesize context; +@synthesize animationTimer; +@synthesize animationInterval; +@synthesize delegate=_delegate; + +// You must implement this method ++ (Class)layerClass { + return [CAEAGLLayer class]; +} + + +//The GL view is stored in the nib file. When it's unarchived it's sent -initWithCoder: +- (id)initWithCoder:(NSCoder*)coder { + + if ((self = [super initWithCoder:coder])) { + // Get the layer + CAEAGLLayer *eaglLayer = (CAEAGLLayer *)self.layer; + + eaglLayer.opaque = YES; + eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys: + [NSNumber numberWithBool:NO], kEAGLDrawablePropertyRetainedBacking, kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat, nil]; + + context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1]; + + if (!context || ![EAGLContext setCurrentContext:context]) { + [self release]; + return nil; + } + + animationInterval = 1.0 / 60.0; + sceneScale=10.0f; + positionOffset=CGPointMake(0, 0); + lastWorldTouch=CGPointMake(0, 0); + + [[UIAccelerometer sharedAccelerometer] setUpdateInterval:(1.0 / kAccelerometerFrequency)]; + [[UIAccelerometer sharedAccelerometer] setDelegate:self]; + } + + + return self; +} + +-(void) selectTestEntry:(int) testIndex +{ + // Destroy existing scene + delete test; + + entry = g_testEntries + testIndex; + test = entry->createFcn(); + + doubleClickValidCountdown=0; + + sceneScale=10.0f; + positionOffset=CGPointMake(0, 0); + lastWorldTouch=CGPointMake(0, 0); +} + + + +- (void)drawView { + + + + if (doubleClickValidCountdown>0) doubleClickValidCountdown--; + + [EAGLContext setCurrentContext:context]; + + glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer); + glViewport(0, 0, backingWidth, backingHeight); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + + glOrthof(-sceneScale, sceneScale, -sceneScale*1.5f, sceneScale*1.5f, -1.0f, 1.0f); + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glTranslatef(positionOffset.x, positionOffset.y,0); + glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + glEnableClientState(GL_VERTEX_ARRAY); + + test->Step(&settings); + + glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer); + [context presentRenderbuffer:GL_RENDERBUFFER_OES]; +} + + +- (void)layoutSubviews { + [EAGLContext setCurrentContext:context]; + [self destroyFramebuffer]; + [self createFramebuffer]; + [self drawView]; +} + + +- (BOOL)createFramebuffer { + + glGenFramebuffersOES(1, &viewFramebuffer); + glGenRenderbuffersOES(1, &viewRenderbuffer); + + glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer); + glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer); + [context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(CAEAGLLayer*)self.layer]; + glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, viewRenderbuffer); + + glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth); + glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight); + + if (USE_DEPTH_BUFFER) { + glGenRenderbuffersOES(1, &depthRenderbuffer); + glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer); + glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, backingWidth, backingHeight); + glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer); + } + + if(glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES) { + NSLog(@"failed to make complete framebuffer object %x", glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES)); + return NO; + } + + return YES; +} + + +- (void)destroyFramebuffer { + + glDeleteFramebuffersOES(1, &viewFramebuffer); + viewFramebuffer = 0; + glDeleteRenderbuffersOES(1, &viewRenderbuffer); + viewRenderbuffer = 0; + + if(depthRenderbuffer) { + glDeleteRenderbuffersOES(1, &depthRenderbuffer); + depthRenderbuffer = 0; + } +} + + +- (void)startAnimation { + self.animationTimer = [NSTimer scheduledTimerWithTimeInterval:animationInterval target:self selector:@selector(drawView) userInfo:nil repeats:YES]; +} + + +- (void)stopAnimation { + self.animationTimer = nil; +} + + +- (void)setAnimationTimer:(NSTimer *)newTimer { + [animationTimer invalidate]; + animationTimer = newTimer; +} + + +- (void)setAnimationInterval:(NSTimeInterval)interval { + + animationInterval = interval; + if (animationTimer) { + [self stopAnimation]; + [self startAnimation]; + } +} + + +- (void)dealloc { + + [self stopAnimation]; + + if ([EAGLContext currentContext] == context) { + [EAGLContext setCurrentContext:nil]; + } + + [context release]; + [super dealloc]; +} + +-(CGPoint) screenSpaceToWorldSpace:(CGPoint) screenLocation +{ + screenLocation.x-=160; + screenLocation.y-=240; + screenLocation.x/=160; + screenLocation.y/=160; + screenLocation.x*=sceneScale; + screenLocation.y*=-sceneScale; + + screenLocation.x-=positionOffset.x; + screenLocation.y-=positionOffset.y; + return screenLocation; +} + +- (void) touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event +{ + + if (doubleClickValidCountdown>0) + { + [_delegate leaveTest]; + return; + } + + doubleClickValidCountdown=FRAMES_BETWEEN_PRESSES_FOR_DOUBLE_CLICK; + + + panning=false; + for (UITouch *touch in touches) + { + CGPoint touchLocation=[touch locationInView:self]; + CGPoint worldPosition=[self screenSpaceToWorldSpace:touchLocation]; + //printf("Screen touched %f,%f -> %f,%f\n",touchLocation.x,touchLocation.y,worldPosition.x,worldPosition.y); + lastScreenTouch=touchLocation; + lastWorldTouch=worldPosition; + test->MouseDown(b2Vec2(lastWorldTouch.x,lastWorldTouch.y)); + + if (!test->m_mouseJoint) panning=true; + } +} + +- (void) touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event +{ + for (UITouch *touch in touches) + { + CGPoint touchLocation=[touch locationInView:self]; + CGPoint worldPosition=[self screenSpaceToWorldSpace:touchLocation]; + //printf("Screen touched %f,%f -> %f,%f\n",touchLocation.x,touchLocation.y,worldPosition.x,worldPosition.y); + + + CGPoint screenDistanceMoved=CGPointMake(touchLocation.x-lastScreenTouch.x,touchLocation.y-lastScreenTouch.y); + if (panning) + { + screenDistanceMoved.x/=160; + screenDistanceMoved.y/=160; + screenDistanceMoved.x*=sceneScale; + screenDistanceMoved.y*=-sceneScale; + positionOffset.x+=screenDistanceMoved.x; + positionOffset.y+=screenDistanceMoved.y; + } + + lastScreenTouch=touchLocation; + lastWorldTouch=worldPosition; + test->MouseMove(b2Vec2(lastWorldTouch.x,lastWorldTouch.y)); + + } +} +- (void) touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event +{ + test->MouseUp(b2Vec2(lastWorldTouch.x,lastWorldTouch.y)); +} + +- (void) accelerometer:(UIAccelerometer*)accelerometer didAccelerate:(UIAcceleration*)acceleration +{ + // Only run for valid values + if (acceleration.y!=0 && acceleration.x!=0) + { + if (test) test->SetGravity(acceleration.x,acceleration.y); + } +} + +@end diff --git a/src/render/Delegates.h b/src/render/Delegates.h new file mode 100644 index 0000000..b4b7976 --- /dev/null +++ b/src/render/Delegates.h @@ -0,0 +1,14 @@ +/* + * Delegates.h + * Box2D + * + * Box2D iPhone port by Simon Oliver - http://www.simonoliver.com - http://www.handcircus.com + * + * + */ + +@protocol TestSelectDelegate + -(void) selectTest:(int) testIndex; + -(void) leaveTest; + +@end \ No newline at end of file diff --git a/src/render/GLES-Render.h b/src/render/GLES-Render.h new file mode 100644 index 0000000..2551666 --- /dev/null +++ b/src/render/GLES-Render.h @@ -0,0 +1,58 @@ +/* +* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com +* +* iPhone port by Simon Oliver - http://www.simonoliver.com - http://www.handcircus.com +* +* 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 RENDER_H +#define RENDER_H + +#import +#import +#import +#import + +#include + +struct b2AABB; + +// This class implements debug drawing callbacks that are invoked +// inside b2World::Step. +class GLESDebugDraw : public b2DebugDraw +{ +public: + void DrawPolygon(const b2Vec2* vertices, int32 vertexCount, const b2Color& color); + + void DrawSolidPolygon(const b2Vec2* vertices, int32 vertexCount, const b2Color& color); + + void DrawCircle(const b2Vec2& center, float32 radius, const b2Color& color); + + void DrawSolidCircle(const b2Vec2& center, float32 radius, const b2Vec2& axis, const b2Color& color); + + void DrawSegment(const b2Vec2& p1, const b2Vec2& p2, const b2Color& color); + + void DrawTransform(const b2Transform& xf); + + void DrawPoint(const b2Vec2& p, float32 size, const b2Color& color); + + void DrawString(int x, int y, const char* string, ...); + + void DrawAABB(b2AABB* aabb, const b2Color& color); +}; + + +#endif diff --git a/src/render/GLES-Render.mm b/src/render/GLES-Render.mm new file mode 100644 index 0000000..abf5c57 --- /dev/null +++ b/src/render/GLES-Render.mm @@ -0,0 +1,149 @@ +/* +* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com +* +* iPhone port by Simon Oliver - http://www.simonoliver.com - http://www.handcircus.com +* +* 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. +*/ + +#include "GLES-Render.h" + + +#include +#include + +#include + +void GLESDebugDraw::DrawPolygon(const b2Vec2* vertices, int32 vertexCount, const b2Color& color) +{ + glColor4f(color.r, color.g, color.b,1); + glVertexPointer(2, GL_FLOAT, 0, vertices); + glDrawArrays(GL_LINE_LOOP, 0, vertexCount); +} + +void GLESDebugDraw::DrawSolidPolygon(const b2Vec2* vertices, int32 vertexCount, const b2Color& color) +{ + glVertexPointer(2, GL_FLOAT, 0, vertices); + + glColor4f(color.r, color.g, color.b,0.5f); + glDrawArrays(GL_TRIANGLE_FAN, 0, vertexCount); + + glColor4f(color.r, color.g, color.b,1); + glDrawArrays(GL_LINE_LOOP, 0, vertexCount); +} + +void GLESDebugDraw::DrawCircle(const b2Vec2& center, float32 radius, const b2Color& color) +{ + const float32 k_segments = 16.0f; + int vertexCount=16; + const float32 k_increment = 2.0f * b2_pi / k_segments; + float32 theta = 0.0f; + + GLfloat glVertices[vertexCount*2]; + for (int32 i = 0; i < k_segments; ++i) + { + b2Vec2 v = center + radius * b2Vec2(cosf(theta), sinf(theta)); + glVertices[i*2]=v.x; + glVertices[i*2+1]=v.y; + theta += k_increment; + } + + glColor4f(color.r, color.g, color.b,1); + glVertexPointer(2, GL_FLOAT, 0, glVertices); + + glDrawArrays(GL_TRIANGLE_FAN, 0, vertexCount); +} + +void GLESDebugDraw::DrawSolidCircle(const b2Vec2& center, float32 radius, const b2Vec2& axis, const b2Color& color) +{ + const float32 k_segments = 16.0f; + int vertexCount=16; + const float32 k_increment = 2.0f * b2_pi / k_segments; + float32 theta = 0.0f; + + GLfloat glVertices[vertexCount*2]; + for (int32 i = 0; i < k_segments; ++i) + { + b2Vec2 v = center + radius * b2Vec2(cosf(theta), sinf(theta)); + glVertices[i*2]=v.x; + glVertices[i*2+1]=v.y; + theta += k_increment; + } + + glColor4f(color.r, color.g, color.b,0.5f); + glVertexPointer(2, GL_FLOAT, 0, glVertices); + glDrawArrays(GL_TRIANGLE_FAN, 0, vertexCount); + glColor4f(color.r, color.g, color.b,1); + glDrawArrays(GL_LINE_LOOP, 0, vertexCount); + + // Draw the axis line + DrawSegment(center,center+radius*axis,color); +} + +void GLESDebugDraw::DrawSegment(const b2Vec2& p1, const b2Vec2& p2, const b2Color& color) +{ + glColor4f(color.r, color.g, color.b,1); + GLfloat glVertices[] = { + p1.x,p1.y,p2.x,p2.y + }; + glVertexPointer(2, GL_FLOAT, 0, glVertices); + glDrawArrays(GL_LINES, 0, 2); +} + +void GLESDebugDraw::DrawTransform(const b2Transform& xf) +{ + b2Vec2 p1 = xf.position, p2; + const float32 k_axisScale = 0.4f; + + p2 = p1 + k_axisScale * xf.R.col1; + DrawSegment(p1,p2,b2Color(1,0,0)); + + p2 = p1 + k_axisScale * xf.R.col2; + DrawSegment(p1,p2,b2Color(0,1,0)); +} + +void GLESDebugDraw::DrawPoint(const b2Vec2& p, float32 size, const b2Color& color) +{ + glColor4f(color.r, color.g, color.b,1); + glPointSize(size); + GLfloat glVertices[] = { + p.x,p.y + }; + glVertexPointer(2, GL_FLOAT, 0, glVertices); + glDrawArrays(GL_POINTS, 0, 1); + glPointSize(1.0f); +} + +void GLESDebugDraw::DrawString(int x, int y, const char *string, ...) +{ + + /* Unsupported as yet. Could replace with bitmap font renderer at a later date */ +} + +void GLESDebugDraw::DrawAABB(b2AABB* aabb, const b2Color& c) +{ + + glColor4f(c.r, c.g, c.b,1); + + GLfloat glVertices[] = { + aabb->lowerBound.x, aabb->lowerBound.y, + aabb->upperBound.x, aabb->lowerBound.y, + aabb->upperBound.x, aabb->upperBound.y, + aabb->lowerBound.x, aabb->upperBound.y + }; + glVertexPointer(2, GL_FLOAT, 0, glVertices); + glDrawArrays(GL_LINE_LOOP, 0, 8); + +} diff --git a/src/render/TestEntriesViewController.h b/src/render/TestEntriesViewController.h new file mode 100644 index 0000000..d28a655 --- /dev/null +++ b/src/render/TestEntriesViewController.h @@ -0,0 +1,19 @@ +// +// TestEntriesViewController.h +// Box2D +// +// Box2D iPhone port by Simon Oliver - http://www.simonoliver.com - http://www.handcircus.com +// + +#import +#import "iPhoneTest.h" +#import "Delegates.h" + +@interface TestEntriesViewController : UITableViewController { + int32 testCount; + id _delegate; +} + +@property(assign) id delegate; + +@end diff --git a/src/render/TestEntriesViewController.mm b/src/render/TestEntriesViewController.mm new file mode 100644 index 0000000..2e016b3 --- /dev/null +++ b/src/render/TestEntriesViewController.mm @@ -0,0 +1,75 @@ +// +// TestEntriesViewController.m +// Box2D +// +// Box2D iPhone port by Simon Oliver - http://www.simonoliver.com - http://www.handcircus.com +// + +#import "TestEntriesViewController.h" + + +@implementation TestEntriesViewController + +@synthesize delegate=_delegate; + +- (id)initWithStyle:(UITableViewStyle)style { + if ((self = [super initWithStyle:style])) { + testCount = 0; + TestEntry* e = g_testEntries; + while (e->createFcn) + { + ++testCount; + ++e; + } + } + return self; +} + +- (void)didReceiveMemoryWarning { + [super didReceiveMemoryWarning]; // Releases the view if it doesn't have a superview + // Release anything that's not essential, such as cached data +} + +#pragma mark Table view methods + +- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { + return 1; +} + + +// Customize the number of rows in the table view. +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { + return testCount; +} + + +// Customize the appearance of table view cells. +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { + + static NSString *CellIdentifier = @"Cell"; + + UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; + if (cell == nil) { + cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease]; + } + + // Set up the cell... + TestEntry* e = g_testEntries; + e+=indexPath.row; + + [cell.textLabel setText:[NSString stringWithCString:e->name encoding:NSUTF8StringEncoding]]; + return cell; +} + + +- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { + [_delegate selectTest:indexPath.row]; +} + +- (void)dealloc { + [super dealloc]; +} + + +@end + diff --git a/src/render/iPhoneTest.h b/src/render/iPhoneTest.h new file mode 100644 index 0000000..dc82ed5 --- /dev/null +++ b/src/render/iPhoneTest.h @@ -0,0 +1,185 @@ +/* +* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com +* +* iPhone port by Simon Oliver - http://www.simonoliver.com - http://www.handcircus.com +* +* 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 TEST_H +#define TEST_H + +#import +#include +#include "GLES-Render.h" + +#include + +class Test; +struct Settings; + +typedef Test* TestCreateFcn(); + +#define RAND_LIMIT 32767 + +/// Random number in range [-1,1] +inline float32 RandomFloat() +{ + float32 r = (float32)(rand() & (RAND_LIMIT)); + r /= RAND_LIMIT; + r = 2.0f * r - 1.0f; + return r; +} + +/// Random floating point number in range [lo, hi] +inline float32 RandomFloat(float32 lo, float32 hi) +{ + float32 r = (float32)(rand() & (RAND_LIMIT)); + r /= RAND_LIMIT; + r = (hi - lo) * r + lo; + return r; +} + +/// Test settings. Some can be controlled in the GUI. +struct Settings +{ + Settings() : + hz(60.0f), + velocityIterations(10), + positionIterations(4), + drawStats(0), + drawShapes(1), + drawJoints(1), + drawAABBs(0), + drawPairs(0), + drawContactPoints(0), + drawContactNormals(0), + drawContactForces(0), + drawFrictionForces(0), + drawCOMs(0), + enableWarmStarting(1), + enableContinuous(1), + pause(0), + singleStep(0) + {} + + float32 hz; + int32 velocityIterations; + int32 positionIterations; + int32 drawShapes; + int32 drawJoints; + int32 drawAABBs; + int32 drawPairs; + int32 drawContactPoints; + int32 drawContactNormals; + int32 drawContactForces; + int32 drawFrictionForces; + int32 drawCOMs; + int32 drawStats; + int32 enableWarmStarting; + int32 enableContinuous; + int32 pause; + int32 singleStep; +}; + +struct TestEntry +{ + const char *name; + TestCreateFcn *createFcn; +}; + +extern TestEntry g_testEntries[]; +// This is called when a joint in the world is implicitly destroyed +// because an attached body is destroyed. This gives us a chance to +// nullify the mouse joint. +class DestructionListener : public b2DestructionListener + { + public: + void SayGoodbye(b2Fixture* fixture) { B2_NOT_USED(fixture); } + void SayGoodbye(b2Joint* joint); + + Test* test; + }; + +const int32 k_maxContactPoints = 2048; + +struct ContactPoint +{ + b2Fixture* fixtureA; + b2Fixture* fixtureB; + b2Vec2 normal; + b2Vec2 position; + b2PointState state; +}; + +class Test : public b2ContactListener + { + public: + + Test(); + virtual ~Test(); + + void SetGravity(float x,float y); + void SetTextLine(int32 line) { m_textLine = line; } + void DrawTitle(int x, int y, const char *string); + virtual void Step(Settings* settings); + virtual void Keyboard(unsigned char key) { B2_NOT_USED(key); } + void ShiftMouseDown(const b2Vec2& p); + virtual void MouseDown(const b2Vec2& p); + virtual void MouseUp(const b2Vec2& p); + void MouseMove(const b2Vec2& p); + void LaunchBomb(); + void LaunchBomb(const b2Vec2& position, const b2Vec2& velocity); + + void SpawnBomb(const b2Vec2& worldPt); + void CompleteBombSpawn(const b2Vec2& p); + + // Let derived tests know that a joint was destroyed. + virtual void JointDestroyed(b2Joint* joint) { B2_NOT_USED(joint); } + + // Callbacks for derived classes. + virtual void BeginContact(b2Contact* contact) { B2_NOT_USED(contact); } + virtual void EndContact(b2Contact* contact) { B2_NOT_USED(contact); } + virtual void PreSolve(b2Contact* contact, const b2Manifold* oldManifold); + virtual void PostSolve(b2Contact* contact, const b2ContactImpulse* impulse) + { + B2_NOT_USED(contact); + B2_NOT_USED(impulse); + } + + protected: + friend class DestructionListener; + friend class BoundaryListener; + friend class ContactListener; + + b2Body* m_groundBody; + b2AABB m_worldAABB; + ContactPoint m_points[k_maxContactPoints]; + int32 m_pointCount; + DestructionListener m_destructionListener; + GLESDebugDraw m_debugDraw; + int32 m_textLine; + b2World* m_world; + b2Body* m_bomb; + b2MouseJoint* m_mouseJoint; + b2Vec2 m_bombSpawnPoint; + bool m_bombSpawning; + b2Vec2 m_mouseWorld; + int32 m_stepCount; + }; + +#endif diff --git a/src/render/iPhoneTest.mm b/src/render/iPhoneTest.mm new file mode 100644 index 0000000..16cc5da --- /dev/null +++ b/src/render/iPhoneTest.mm @@ -0,0 +1,411 @@ +/* +* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com +* +* iPhone port by Simon Oliver - http://www.simonoliver.com - http://www.handcircus.com +* +* 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. +*/ + +#include "iPhoneTest.h" +#include "GLES-Render.h" + +#include + +void DestructionListener::SayGoodbye(b2Joint* joint) +{ + if (test->m_mouseJoint == joint) + { + test->m_mouseJoint = NULL; + } + else + { + test->JointDestroyed(joint); + } +} + +Test::Test() +: m_debugDraw() +{ + b2Vec2 gravity; + gravity.Set(0.0f, -10.0f); + bool doSleep = true; + m_world = new b2World(gravity, doSleep); + m_bomb = NULL; + m_textLine = 30; + m_mouseJoint = NULL; + m_pointCount = 0; + + m_destructionListener.test = this; + m_world->SetDestructionListener(&m_destructionListener); + m_world->SetContactListener(this); + m_world->SetDebugDraw(&m_debugDraw); + + m_bombSpawning = false; + + m_stepCount = 0; + + b2BodyDef bodyDef; + m_groundBody = m_world->CreateBody(&bodyDef); +} + +Test::~Test() +{ + // By deleting the world, we delete the bomb, mouse joint, etc. + delete m_world; + m_world = NULL; + +} + +void Test::SetGravity( float x, float y) +{ + float tVectorLength=sqrt(x*x+y*y); + float newGravityX=9.81f*x/tVectorLength; + float newGravityY=9.81f*y/tVectorLength; + m_world->SetGravity(b2Vec2(newGravityX,newGravityY)); +} + +void Test::PreSolve(b2Contact* contact, const b2Manifold* oldManifold) +{ + const b2Manifold* manifold = contact->GetManifold(); + + if (manifold->pointCount == 0) + { + return; + } + + b2Fixture* fixtureA = contact->GetFixtureA(); + b2Fixture* fixtureB = contact->GetFixtureB(); + + b2PointState state1[b2_maxManifoldPoints], state2[b2_maxManifoldPoints]; + b2GetPointStates(state1, state2, oldManifold, manifold); + + b2WorldManifold worldManifold; + contact->GetWorldManifold(&worldManifold); + + for (int32 i = 0; i < manifold->pointCount && m_pointCount < k_maxContactPoints; ++i) + { + ContactPoint* cp = m_points + m_pointCount; + cp->fixtureA = fixtureA; + cp->fixtureB = fixtureB; + cp->position = worldManifold.points[i]; + cp->normal = worldManifold.normal; + cp->state = state2[i]; + ++m_pointCount; + } +} + +void Test::DrawTitle(int x, int y, const char *string) +{ + m_debugDraw.DrawString(x, y, string); +} + +class QueryCallback : public b2QueryCallback + { + public: + QueryCallback(const b2Vec2& point) + { + m_point = point; + m_fixture = NULL; + } + + bool ReportFixture(b2Fixture* fixture) + { + b2Body* body = fixture->GetBody(); + if (body->GetType() == b2_dynamicBody) + { + bool inside = fixture->TestPoint(m_point); + if (inside) + { + m_fixture = fixture; + + // We are done, terminate the query. + return false; + } + } + + // Continue the query. + return true; + } + + b2Vec2 m_point; + b2Fixture* m_fixture; + }; + + +void Test::MouseDown(const b2Vec2& p) +{ + m_mouseWorld = p; + + if (m_mouseJoint != NULL) + { + return; + } + + // Make a small box. + b2AABB aabb; + b2Vec2 d; + d.Set(0.001f, 0.001f); + aabb.lowerBound = p - d; + aabb.upperBound = p + d; + + // Query the world for overlapping shapes. + QueryCallback callback(p); + m_world->QueryAABB(&callback, aabb); + + if (callback.m_fixture) + { + b2Body* body = callback.m_fixture->GetBody(); + b2MouseJointDef md; + md.bodyA = m_groundBody; + md.bodyB = body; + md.target = p; +#ifdef TARGET_FLOAT32_IS_FIXED + md.maxForce = (body->GetMass() < 16.0)? + (1000.0f * body->GetMass()) : float32(16000.0); +#else + md.maxForce = 1000.0f * body->GetMass(); +#endif + m_mouseJoint = (b2MouseJoint*)m_world->CreateJoint(&md); + body->SetAwake(true); + } +} + +void Test::SpawnBomb(const b2Vec2& worldPt) +{ + m_bombSpawnPoint = worldPt; + m_bombSpawning = true; +} + +void Test::CompleteBombSpawn(const b2Vec2& p) +{ + if (m_bombSpawning == false) + { + return; + } + + const float multiplier = 30.0f; + b2Vec2 vel = m_bombSpawnPoint - p; + vel *= multiplier; + LaunchBomb(m_bombSpawnPoint,vel); + m_bombSpawning = false; +} + +void Test::ShiftMouseDown(const b2Vec2& p) +{ + m_mouseWorld = p; + + if (m_mouseJoint != NULL) + { + return; + } + + SpawnBomb(p); +} + +void Test::MouseUp(const b2Vec2& p) +{ + if (m_mouseJoint) + { + m_world->DestroyJoint(m_mouseJoint); + m_mouseJoint = NULL; + } + + if (m_bombSpawning) + { + CompleteBombSpawn(p); + } +} + +void Test::MouseMove(const b2Vec2& p) +{ + m_mouseWorld = p; + + if (m_mouseJoint) + { + m_mouseJoint->SetTarget(p); + } +} + +void Test::LaunchBomb() +{ + b2Vec2 p(RandomFloat(-15.0f, 15.0f), 30.0f); + b2Vec2 v = -5.0f * p; + LaunchBomb(p, v); +} + +void Test::LaunchBomb(const b2Vec2& position, const b2Vec2& velocity) +{ + if (m_bomb) + { + m_world->DestroyBody(m_bomb); + m_bomb = NULL; + } + + b2BodyDef bd; + bd.type = b2_dynamicBody; + bd.position = position; + bd.bullet = true; + m_bomb = m_world->CreateBody(&bd); + m_bomb->SetLinearVelocity(velocity); + + b2CircleShape circle; + circle.m_radius = 0.3f; + + b2FixtureDef fd; + fd.shape = &circle; + fd.density = 20.0f; + fd.restitution = 0.1f; + + b2Vec2 minV = position - b2Vec2(0.3f,0.3f); + b2Vec2 maxV = position + b2Vec2(0.3f,0.3f); + + b2AABB aabb; + aabb.lowerBound = minV; + aabb.upperBound = maxV; + + m_bomb->CreateFixture(&fd); +} + +void Test::Step(Settings* settings) +{ + float32 timeStep = settings->hz > 0.0f ? 1.0f / settings->hz : float32(0.0f); + + if (settings->pause) + { + if (settings->singleStep) + { + settings->singleStep = 0; + } + else + { + timeStep = 0.0f; + } + + m_debugDraw.DrawString(5, m_textLine, "****PAUSED****"); + m_textLine += 15; + } + + uint32 flags = 0; + flags += settings->drawShapes * b2DebugDraw::e_shapeBit; + flags += settings->drawJoints * b2DebugDraw::e_jointBit; + flags += settings->drawAABBs * b2DebugDraw::e_aabbBit; + flags += settings->drawPairs * b2DebugDraw::e_pairBit; + flags += settings->drawCOMs * b2DebugDraw::e_centerOfMassBit; + m_debugDraw.SetFlags(flags); + + m_world->SetWarmStarting(settings->enableWarmStarting > 0); + m_world->SetContinuousPhysics(settings->enableContinuous > 0); + + m_pointCount = 0; + + m_world->Step(timeStep, settings->velocityIterations, settings->positionIterations); + + m_world->DrawDebugData(); + + if (timeStep > 0.0f) + { + ++m_stepCount; + } + + if (settings->drawStats) + { + m_debugDraw.DrawString(5, m_textLine, "bodies/contacts/joints/proxies = %d/%d/%d", + m_world->GetBodyCount(), m_world->GetContactCount(), m_world->GetJointCount(), m_world->GetProxyCount()); + m_textLine += 15; + +// m_debugDraw.DrawString(5, m_textLine, "heap bytes = %d", b2_byteCount); +// m_textLine += 15; + } + + if (m_mouseJoint) + { +// b2Body* body = m_mouseJoint->GetBodyB(); +// b2Vec2 p1 = body->GetWorldPoint(m_mouseJoint->m_localAnchor); +// b2Vec2 p2 = m_mouseJoint->m_target; +// +// glPointSize(4.0f); +// glColor3f(0.0f, 1.0f, 0.0f); +// glBegin(GL_POINTS); +// glVertex2f(p1.x, p1.y); +// glVertex2f(p2.x, p2.y); +// glEnd(); +// glPointSize(1.0f); +// +// glColor3f(0.8f, 0.8f, 0.8f); +// glBegin(GL_LINES); +// glVertex2f(p1.x, p1.y); +// glVertex2f(p2.x, p2.y); +// glEnd(); + } + + if (m_bombSpawning) + { +// glPointSize(4.0f); +// glColor3f(0.0f, 0.0f, 1.0f); +// glBegin(GL_POINTS); +// glColor3f(0.0f, 0.0f, 1.0f); +// glVertex2f(m_bombSpawnPoint.x, m_bombSpawnPoint.y); +// glEnd(); +// +// glColor3f(0.8f, 0.8f, 0.8f); +// glBegin(GL_LINES); +// glVertex2f(m_mouseWorld.x, m_mouseWorld.y); +// glVertex2f(m_bombSpawnPoint.x, m_bombSpawnPoint.y); +// glEnd(); + } + + if (settings->drawContactPoints) + { + //const float32 k_impulseScale = 0.1f; + const float32 k_axisScale = 0.3f; + + for (int32 i = 0; i < m_pointCount; ++i) + { + ContactPoint* point = m_points + i; + + if (point->state == b2_addState) + { + // Add + m_debugDraw.DrawPoint(point->position, 10.0f, b2Color(0.3f, 0.95f, 0.3f)); + } + else if (point->state == b2_persistState) + { + // Persist + m_debugDraw.DrawPoint(point->position, 5.0f, b2Color(0.3f, 0.3f, 0.95f)); + } + + if (settings->drawContactNormals == 1) + { + b2Vec2 p1 = point->position; + b2Vec2 p2 = p1 + k_axisScale * point->normal; + m_debugDraw.DrawSegment(p1, p2, b2Color(0.4f, 0.9f, 0.4f)); + } + else if (settings->drawContactForces == 1) + { + //b2Vec2 p1 = point->position; + //b2Vec2 p2 = p1 + k_forceScale * point->normalForce * point->normal; + //DrawSegment(p1, p2, b2Color(0.9f, 0.9f, 0.3f)); + } + + if (settings->drawFrictionForces == 1) + { + //b2Vec2 tangent = b2Cross(point->normal, 1.0f); + //b2Vec2 p1 = point->position; + //b2Vec2 p2 = p1 + k_forceScale * point->tangentForce * tangent; + //DrawSegment(p1, p2, b2Color(0.9f, 0.9f, 0.3f)); + } + } + } +} diff --git a/src/render/iPhoneTestEntries.mm b/src/render/iPhoneTestEntries.mm new file mode 100644 index 0000000..02da5f5 --- /dev/null +++ b/src/render/iPhoneTestEntries.mm @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com + * + * 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. + */ + +#include "iPhoneTest.h" +//#include "GLES-Render.h" + +#include "ApplyForce.h" +#include "BodyTypes.h" + +#include "Breakable.h" +#include "Bridge.h" +#include "Chain.h" +#include "CollisionFiltering.h" +#include "CollisionProcessing.h" +#include "CompoundShapes.h" +#include "Confined.h" +#include "DistanceTest.h" +#include "Dominos.h" +#include "DynamicTreeTest.h" +#include "Gears.h" +#include "LineJoint.h" +#include "OneSidedPlatform.h" +#include "PolyCollision.h" +#include "PolyShapes.h" +#include "Prismatic.h" +#include "Pulleys.h" +#include "Pyramid.h" +#include "RayCast.h" +#include "Revolute.h" +#include "SensorTest.h" +#include "ShapeEditing.h" +#include "SliderCrank.h" +#include "SphereStack.h" +#include "TheoJansen.h" +#include "TimeOfImpact.h" +#include "VaryingFriction.h" +#include "VaryingRestitution.h" +#include "VerticalStack.h" +#include "Web.h" + +TestEntry g_testEntries[] = +{ +{"Body Types", BodyTypes::Create}, +{"SphereStack", SphereStack::Create}, +{"Vertical Stack", VerticalStack::Create}, +{"Confined", Confined::Create}, +{"Bridge", Bridge::Create}, +{"Breakable", Breakable::Create}, +{"Varying Restitution", VaryingRestitution::Create}, +{"Ray-Cast", RayCast::Create}, +{"Pyramid", Pyramid::Create}, +{"PolyCollision", PolyCollision::Create}, +{"One-Sided Platform", OneSidedPlatform::Create}, +{"Apply Force", ApplyForce::Create}, +{"Chain", Chain::Create}, +{"Collision Filtering", CollisionFiltering::Create}, +{"Collision Processing", CollisionProcessing::Create}, +{"Compound Shapes", CompoundShapes::Create}, +{"Distance Test", DistanceTest::Create}, +{"Dominos", Dominos::Create}, +{"Dynamic Tree", DynamicTreeTest::Create}, +{"Gears", Gears::Create}, +{"Line Joint", LineJoint::Create}, +{"Polygon Shapes", PolyShapes::Create}, +{"Prismatic", Prismatic::Create}, +{"Pulleys", Pulleys::Create}, +{"Revolute", Revolute::Create}, +{"Sensor Test", SensorTest::Create}, +{"Shape Editing", ShapeEditing::Create}, +{"Slider Crank", SliderCrank::Create}, +{"Theo Jansen's Walker", TheoJansen::Create}, +{"Time of Impact", TimeOfImpact::Create}, +{"Varying Friction", VaryingFriction::Create}, +{"Web", Web::Create}, +{NULL, NULL} + +}; diff --git a/src/tanks/Game.h b/src/tanks/Game.h new file mode 100644 index 0000000..92a1fec --- /dev/null +++ b/src/tanks/Game.h @@ -0,0 +1,15 @@ +// +// Game.h +// tanks +// +// Created by dsc on 4/27/11. +// Copyright 2011 lttlst.com. All rights reserved. +// + +#import +#import "Sparrow.h" + + +@interface Game : SPStage + +@end diff --git a/src/tanks/Game.m b/src/tanks/Game.m new file mode 100644 index 0000000..7948dbb --- /dev/null +++ b/src/tanks/Game.m @@ -0,0 +1,30 @@ +// +// Game.m +// tanks +// +// Created by dsc on 4/27/11. +// Copyright 2011 lttlst.com. All rights reserved. +// + +#import "Game.h" + + +@implementation Game + +- (id)initWithWidth:(float)width height:(float)height +{ + if ((self = [super initWithWidth:width height:height])) + { + // this is where the code of your game will start. + // in this sample, we add just a simple quad to see + // if it works. + + SPQuad *quad = [SPQuad quadWithWidth:100 height:100]; + quad.color = 0xff0000; + quad.x = 50; + quad.y = 50; + [self addChild:quad]; + } + return self; +} +@end \ No newline at end of file diff --git a/src/ui/iPad/RootAppDelegate_iPad.h b/src/ui/iPad/RootAppDelegate_iPad.h new file mode 100644 index 0000000..36cc1ab --- /dev/null +++ b/src/ui/iPad/RootAppDelegate_iPad.h @@ -0,0 +1,16 @@ +// +// RootAppDelegate_iPad.h +// tanks +// +// Created by dsc on 4/27/11. +// Copyright 2011 lttlst.com. All rights reserved. +// + +#import +#import "RootAppDelegate.h" + +@interface RootAppDelegate_iPad : RootAppDelegate { + +} + +@end diff --git a/src/ui/iPad/RootAppDelegate_iPad.m b/src/ui/iPad/RootAppDelegate_iPad.m new file mode 100644 index 0000000..75c6d5d --- /dev/null +++ b/src/ui/iPad/RootAppDelegate_iPad.m @@ -0,0 +1,18 @@ +// +// RootAppDelegate_iPad.m +// tanks +// +// Created by dsc on 4/27/11. +// Copyright 2011 lttlst.com. All rights reserved. +// + +#import "RootAppDelegate_iPad.h" + +@implementation RootAppDelegate_iPad + +- (void)dealloc +{ + [super dealloc]; +} + +@end diff --git a/src/ui/iPad/en.lproj/MainWindow_iPad.xib b/src/ui/iPad/en.lproj/MainWindow_iPad.xib new file mode 100644 index 0000000..68e46d8 --- /dev/null +++ b/src/ui/iPad/en.lproj/MainWindow_iPad.xib @@ -0,0 +1,237 @@ + + + + 1024 + 10J869 + 1306 + 1038.35 + 461.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 301 + + + IBUIWindow + IBUICustomObject + IBUILabel + IBUIView + IBProxyObject + + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + + IBFilesOwner + IBIPadFramework + + + IBFirstResponder + IBIPadFramework + + + + 292 + + + + 301 + {{284, 501}, {200, 22}} + + + + NO + YES + 7 + NO + IBIPadFramework + My Universal App on iPad + + 1 + MCAwIDAAA + + + 1 + 10 + + + + 292 + {{0, 21}, {768, 1003}} + + + + + 3 + MQA + + 2 + + + YES + IBIPadFramework + + + {768, 1024} + + + + + 1 + MSAxIDEAA + + NO + NO + + 2 + + IBIPadFramework + YES + + + IBIPadFramework + + + + + + + window + + + + 7 + + + + delegate + + + + 8 + + + + sparrowView + + + + 14 + + + + + + 0 + + + + + + -1 + + + File's Owner + + + -2 + + + + + 2 + + + + + + + + + 6 + + + + + 11 + + + + + 12 + + + + + + + UIApplication + UIResponder + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + SPView + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + {{202, 84}, {783, 772}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + RootAppDelegate_iPad + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + + + 14 + + + + + RootAppDelegate + NSObject + + SPView + UIWindow + + + + sparrowView + SPView + + + window + UIWindow + + + + IBProjectSource + ./Classes/RootAppDelegate.h + + + + RootAppDelegate_iPad + RootAppDelegate + + IBProjectSource + ./Classes/RootAppDelegate_iPad.h + + + + SPView + UIView + + IBProjectSource + ./Classes/SPView.h + + + + + 0 + IBIPadFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + YES + 3 + 301 + + diff --git a/src/ui/iPhone/RootAppDelegate_iPhone.h b/src/ui/iPhone/RootAppDelegate_iPhone.h new file mode 100644 index 0000000..57fd121 --- /dev/null +++ b/src/ui/iPhone/RootAppDelegate_iPhone.h @@ -0,0 +1,16 @@ +// +// RootAppDelegate_iPhone.h +// tanks +// +// Created by dsc on 4/27/11. +// Copyright 2011 lttlst.com. All rights reserved. +// + +#import +#import "RootAppDelegate.h" + +@interface RootAppDelegate_iPhone : RootAppDelegate { + +} + +@end diff --git a/src/ui/iPhone/RootAppDelegate_iPhone.m b/src/ui/iPhone/RootAppDelegate_iPhone.m new file mode 100644 index 0000000..84c85b0 --- /dev/null +++ b/src/ui/iPhone/RootAppDelegate_iPhone.m @@ -0,0 +1,18 @@ +// +// RootAppDelegate_iPhone.m +// tanks +// +// Created by dsc on 4/27/11. +// Copyright 2011 lttlst.com. All rights reserved. +// + +#import "RootAppDelegate_iPhone.h" + +@implementation RootAppDelegate_iPhone + +- (void)dealloc +{ + [super dealloc]; +} + +@end diff --git a/src/ui/iPhone/en.lproj/MainWindow_iPhone.xib b/src/ui/iPhone/en.lproj/MainWindow_iPhone.xib new file mode 100644 index 0000000..7d8d44b --- /dev/null +++ b/src/ui/iPhone/en.lproj/MainWindow_iPhone.xib @@ -0,0 +1,238 @@ + + + + 1024 + 10J869 + 1306 + 1038.35 + 461.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 301 + + + IBUIWindow + IBUICustomObject + IBUILabel + IBUIView + IBProxyObject + + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + IBCocoaTouchFramework + + + + 1316 + + + + 1325 + {{51, 229}, {218, 22}} + + + + NO + YES + 7 + NO + IBCocoaTouchFramework + My Universal App on iPhone + + 1 + MCAwIDAAA + + + 1 + 10 + + + + 1316 + {{0, 21}, {320, 459}} + + + + + 3 + MQA + + 2 + + + YES + IBCocoaTouchFramework + + + + {320, 480} + + + + + 1 + MSAxIDEAA + + NO + NO + + IBCocoaTouchFramework + YES + + + + + + + delegate + + + + 5 + + + + window + + + + 6 + + + + sparrowView + + + + 11 + + + + + + 0 + + + + + + 2 + + + + + + + + + -1 + + + File's Owner + + + 4 + + + + + -2 + + + + + 8 + + + + + 9 + + + + + + + UIApplication + UIResponder + + {{520, 376}, {320, 480}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + RootAppDelegate_iPhone + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + SPView + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + + + 11 + + + + + RootAppDelegate + NSObject + + SPView + UIWindow + + + + sparrowView + SPView + + + window + UIWindow + + + + IBProjectSource + ./Classes/RootAppDelegate.h + + + + RootAppDelegate_iPhone + RootAppDelegate + + IBProjectSource + ./Classes/RootAppDelegate_iPhone.h + + + + SPView + UIView + + IBProjectSource + ./Classes/SPView.h + + + + + 0 + IBCocoaTouchFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + YES + 3 + 301 + + diff --git a/tanks.xcodeproj/project.pbxproj b/tanks.xcodeproj/project.pbxproj new file mode 100644 index 0000000..f593d0b --- /dev/null +++ b/tanks.xcodeproj/project.pbxproj @@ -0,0 +1,1002 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 499668C713692E2D006E8125 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 499668C613692E2D006E8125 /* UIKit.framework */; }; + 499668C913692E2D006E8125 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 499668C813692E2D006E8125 /* Foundation.framework */; }; + 499668CB13692E2D006E8125 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 499668CA13692E2D006E8125 /* CoreGraphics.framework */; }; + 49966917136930E8006E8125 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 49966912136930E8006E8125 /* AudioToolbox.framework */; }; + 49966918136930E8006E8125 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 49966913136930E8006E8125 /* AVFoundation.framework */; }; + 49966919136930E8006E8125 /* OpenAL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 49966914136930E8006E8125 /* OpenAL.framework */; }; + 4996691A136930E8006E8125 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 49966915136930E8006E8125 /* OpenGLES.framework */; }; + 4996691B136930E8006E8125 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 49966916136930E8006E8125 /* QuartzCore.framework */; }; + 49F2D99A137645BF000B6B8C /* libSparrow.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 49F2D999137645BF000B6B8C /* libSparrow.a */; }; + 49F2D9AD1376462B000B6B8C /* libBox2D.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 49F2D9AC1376462B000B6B8C /* libBox2D.a */; }; + 49F2D9C413764666000B6B8C /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 49F2D9B013764666000B6B8C /* main.m */; }; + 49F2D9C513764666000B6B8C /* RootAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 49F2D9B513764666000B6B8C /* RootAppDelegate.m */; }; + 49F2D9C613764666000B6B8C /* Game.m in Sources */ = {isa = PBXBuildFile; fileRef = 49F2D9B813764666000B6B8C /* Game.m */; }; + 49F2D9C713764666000B6B8C /* MainWindow_iPad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 49F2D9BB13764666000B6B8C /* MainWindow_iPad.xib */; }; + 49F2D9C813764666000B6B8C /* RootAppDelegate_iPad.m in Sources */ = {isa = PBXBuildFile; fileRef = 49F2D9BE13764666000B6B8C /* RootAppDelegate_iPad.m */; }; + 49F2D9C913764666000B6B8C /* MainWindow_iPhone.xib in Resources */ = {isa = PBXBuildFile; fileRef = 49F2D9C013764666000B6B8C /* MainWindow_iPhone.xib */; }; + 49F2D9CA13764666000B6B8C /* RootAppDelegate_iPhone.m in Sources */ = {isa = PBXBuildFile; fileRef = 49F2D9C313764666000B6B8C /* RootAppDelegate_iPhone.m */; }; + 49F2D9CD13764710000B6B8C /* RootAppDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 49F2D9B413764666000B6B8C /* RootAppDelegate.h */; }; + 49F2D9CE13764710000B6B8C /* Game.h in Headers */ = {isa = PBXBuildFile; fileRef = 49F2D9B713764666000B6B8C /* Game.h */; }; + 49F2D9CF13764710000B6B8C /* RootAppDelegate_iPad.h in Headers */ = {isa = PBXBuildFile; fileRef = 49F2D9BD13764666000B6B8C /* RootAppDelegate_iPad.h */; }; + 49F2D9D013764710000B6B8C /* RootAppDelegate_iPhone.h in Headers */ = {isa = PBXBuildFile; fileRef = 49F2D9C213764666000B6B8C /* RootAppDelegate_iPhone.h */; }; + 49F2D9D213764763000B6B8C /* prefix.pch in Sources */ = {isa = PBXBuildFile; fileRef = 49F2D9B213764666000B6B8C /* prefix.pch */; }; + 49F2D9D713764A9B000B6B8C /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 49F2D9D413764A9B000B6B8C /* InfoPlist.strings */; }; + 49F2D9D813764A9B000B6B8C /* tanks-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 49F2D9D613764A9B000B6B8C /* tanks-Info.plist */; }; + 49F2DA8213764ED6000B6B8C /* SPAVSound.h in Headers */ = {isa = PBXBuildFile; fileRef = 49F2DA2613764ED5000B6B8C /* SPAVSound.h */; }; + 49F2DA8313764ED6000B6B8C /* SPAVSound.m in Sources */ = {isa = PBXBuildFile; fileRef = 49F2DA2713764ED5000B6B8C /* SPAVSound.m */; }; + 49F2DA8413764ED6000B6B8C /* SPAVSoundChannel.h in Headers */ = {isa = PBXBuildFile; fileRef = 49F2DA2813764ED5000B6B8C /* SPAVSoundChannel.h */; }; + 49F2DA8513764ED6000B6B8C /* SPAVSoundChannel.m in Sources */ = {isa = PBXBuildFile; fileRef = 49F2DA2913764ED5000B6B8C /* SPAVSoundChannel.m */; }; + 49F2DA8613764ED6000B6B8C /* SPALSound.h in Headers */ = {isa = PBXBuildFile; fileRef = 49F2DA2A13764ED5000B6B8C /* SPALSound.h */; }; + 49F2DA8713764ED6000B6B8C /* SPALSound.m in Sources */ = {isa = PBXBuildFile; fileRef = 49F2DA2B13764ED5000B6B8C /* SPALSound.m */; }; + 49F2DA8813764ED6000B6B8C /* SPALSoundChannel.h in Headers */ = {isa = PBXBuildFile; fileRef = 49F2DA2C13764ED5000B6B8C /* SPALSoundChannel.h */; }; + 49F2DA8913764ED6000B6B8C /* SPALSoundChannel.m in Sources */ = {isa = PBXBuildFile; fileRef = 49F2DA2D13764ED5000B6B8C /* SPALSoundChannel.m */; }; + 49F2DA8A13764ED6000B6B8C /* SPAudioEngine.h in Headers */ = {isa = PBXBuildFile; fileRef = 49F2DA2013764ED5000B6B8C /* SPAudioEngine.h */; }; + 49F2DA8B13764ED6000B6B8C /* SPAudioEngine.m in Sources */ = {isa = PBXBuildFile; fileRef = 49F2DA2113764ED5000B6B8C /* SPAudioEngine.m */; }; + 49F2DA8C13764ED6000B6B8C /* SPSound.h in Headers */ = {isa = PBXBuildFile; fileRef = 49F2DA2213764ED5000B6B8C /* SPSound.h */; }; + 49F2DA8D13764ED6000B6B8C /* SPSound.m in Sources */ = {isa = PBXBuildFile; fileRef = 49F2DA2313764ED5000B6B8C /* SPSound.m */; }; + 49F2DA8E13764ED6000B6B8C /* SPSoundChannel.h in Headers */ = {isa = PBXBuildFile; fileRef = 49F2DA2413764ED5000B6B8C /* SPSoundChannel.h */; }; + 49F2DA8F13764ED6000B6B8C /* SPSoundChannel.m in Sources */ = {isa = PBXBuildFile; fileRef = 49F2DA2513764ED5000B6B8C /* SPSoundChannel.m */; }; + 49F2DA9013764ED6000B6B8C /* SPView.h in Headers */ = {isa = PBXBuildFile; fileRef = 49F2DA2E13764ED5000B6B8C /* SPView.h */; }; + 49F2DA9113764ED6000B6B8C /* SPView.m in Sources */ = {isa = PBXBuildFile; fileRef = 49F2DA2F13764ED5000B6B8C /* SPView.m */; }; + 49F2DA9213764ED6000B6B8C /* SPTouch_Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 49F2DA3B13764ED5000B6B8C /* SPTouch_Internal.h */; }; + 49F2DA9313764ED6000B6B8C /* SPEvent_Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 49F2DA3C13764ED5000B6B8C /* SPEvent_Internal.h */; }; + 49F2DA9413764ED6000B6B8C /* SPEvent.h in Headers */ = {isa = PBXBuildFile; fileRef = 49F2DA3113764ED5000B6B8C /* SPEvent.h */; }; + 49F2DA9513764ED6000B6B8C /* SPEvent.m in Sources */ = {isa = PBXBuildFile; fileRef = 49F2DA3213764ED5000B6B8C /* SPEvent.m */; }; + 49F2DA9613764ED6000B6B8C /* SPEventDispatcher.h in Headers */ = {isa = PBXBuildFile; fileRef = 49F2DA3313764ED5000B6B8C /* SPEventDispatcher.h */; }; + 49F2DA9713764ED6000B6B8C /* SPEventDispatcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 49F2DA3413764ED5000B6B8C /* SPEventDispatcher.m */; }; + 49F2DA9813764ED6000B6B8C /* SPTouch.h in Headers */ = {isa = PBXBuildFile; fileRef = 49F2DA3513764ED5000B6B8C /* SPTouch.h */; }; + 49F2DA9913764ED6000B6B8C /* SPTouch.m in Sources */ = {isa = PBXBuildFile; fileRef = 49F2DA3613764ED5000B6B8C /* SPTouch.m */; }; + 49F2DA9A13764ED6000B6B8C /* SPTouchEvent.h in Headers */ = {isa = PBXBuildFile; fileRef = 49F2DA3713764ED5000B6B8C /* SPTouchEvent.h */; }; + 49F2DA9B13764ED6000B6B8C /* SPTouchEvent.m in Sources */ = {isa = PBXBuildFile; fileRef = 49F2DA3813764ED5000B6B8C /* SPTouchEvent.m */; }; + 49F2DA9C13764ED6000B6B8C /* SPEnterFrameEvent.h in Headers */ = {isa = PBXBuildFile; fileRef = 49F2DA3913764ED5000B6B8C /* SPEnterFrameEvent.h */; }; + 49F2DA9D13764ED6000B6B8C /* SPEnterFrameEvent.m in Sources */ = {isa = PBXBuildFile; fileRef = 49F2DA3A13764ED5000B6B8C /* SPEnterFrameEvent.m */; }; + 49F2DA9E13764ED6000B6B8C /* SPRendering.m in Sources */ = {isa = PBXBuildFile; fileRef = 49F2DA5213764ED5000B6B8C /* SPRendering.m */; }; + 49F2DA9F13764ED6000B6B8C /* SPRenderSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = 49F2DA5313764ED5000B6B8C /* SPRenderSupport.h */; }; + 49F2DAA013764ED6000B6B8C /* SPRenderSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = 49F2DA5413764ED5000B6B8C /* SPRenderSupport.m */; }; + 49F2DAA113764ED6000B6B8C /* SPTextField.h in Headers */ = {isa = PBXBuildFile; fileRef = 49F2DA5513764ED5000B6B8C /* SPTextField.h */; }; + 49F2DAA213764ED6000B6B8C /* SPTextField.m in Sources */ = {isa = PBXBuildFile; fileRef = 49F2DA5613764ED5000B6B8C /* SPTextField.m */; }; + 49F2DAA313764ED6000B6B8C /* SPBitmapFont.h in Headers */ = {isa = PBXBuildFile; fileRef = 49F2DA5713764ED5000B6B8C /* SPBitmapFont.h */; }; + 49F2DAA413764ED6000B6B8C /* SPBitmapFont.m in Sources */ = {isa = PBXBuildFile; fileRef = 49F2DA5813764ED5000B6B8C /* SPBitmapFont.m */; }; + 49F2DAA513764ED6000B6B8C /* SPBitmapChar.h in Headers */ = {isa = PBXBuildFile; fileRef = 49F2DA5913764ED5000B6B8C /* SPBitmapChar.h */; }; + 49F2DAA613764ED6000B6B8C /* SPBitmapChar.m in Sources */ = {isa = PBXBuildFile; fileRef = 49F2DA5A13764ED5000B6B8C /* SPBitmapChar.m */; }; + 49F2DAA713764ED6000B6B8C /* SPTouchProcessor.h in Headers */ = {isa = PBXBuildFile; fileRef = 49F2DA5B13764ED5000B6B8C /* SPTouchProcessor.h */; }; + 49F2DAA813764ED6000B6B8C /* SPTouchProcessor.m in Sources */ = {isa = PBXBuildFile; fileRef = 49F2DA5C13764ED5000B6B8C /* SPTouchProcessor.m */; }; + 49F2DAA913764ED6000B6B8C /* SPDisplayObject_Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 49F2DA5D13764ED5000B6B8C /* SPDisplayObject_Internal.h */; }; + 49F2DAAA13764ED6000B6B8C /* SPStage_Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 49F2DA5E13764ED5000B6B8C /* SPStage_Internal.h */; }; + 49F2DAAB13764ED6000B6B8C /* SPDisplayObject.h in Headers */ = {isa = PBXBuildFile; fileRef = 49F2DA4013764ED5000B6B8C /* SPDisplayObject.h */; }; + 49F2DAAC13764ED6000B6B8C /* SPDisplayObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 49F2DA4113764ED5000B6B8C /* SPDisplayObject.m */; }; + 49F2DAAD13764ED6000B6B8C /* SPDisplayObjectContainer.h in Headers */ = {isa = PBXBuildFile; fileRef = 49F2DA4213764ED5000B6B8C /* SPDisplayObjectContainer.h */; }; + 49F2DAAE13764ED6000B6B8C /* SPDisplayObjectContainer.m in Sources */ = {isa = PBXBuildFile; fileRef = 49F2DA4313764ED5000B6B8C /* SPDisplayObjectContainer.m */; }; + 49F2DAAF13764ED6000B6B8C /* SPSprite.h in Headers */ = {isa = PBXBuildFile; fileRef = 49F2DA4413764ED5000B6B8C /* SPSprite.h */; }; + 49F2DAB013764ED6000B6B8C /* SPSprite.m in Sources */ = {isa = PBXBuildFile; fileRef = 49F2DA4513764ED5000B6B8C /* SPSprite.m */; }; + 49F2DAB113764ED6000B6B8C /* SPStage.h in Headers */ = {isa = PBXBuildFile; fileRef = 49F2DA4613764ED5000B6B8C /* SPStage.h */; }; + 49F2DAB213764ED6000B6B8C /* SPStage.m in Sources */ = {isa = PBXBuildFile; fileRef = 49F2DA4713764ED5000B6B8C /* SPStage.m */; }; + 49F2DAB313764ED6000B6B8C /* SPQuad.h in Headers */ = {isa = PBXBuildFile; fileRef = 49F2DA4813764ED5000B6B8C /* SPQuad.h */; }; + 49F2DAB413764ED6000B6B8C /* SPQuad.m in Sources */ = {isa = PBXBuildFile; fileRef = 49F2DA4913764ED5000B6B8C /* SPQuad.m */; }; + 49F2DAB513764ED6000B6B8C /* SPImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 49F2DA4A13764ED5000B6B8C /* SPImage.h */; }; + 49F2DAB613764ED6000B6B8C /* SPImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 49F2DA4B13764ED5000B6B8C /* SPImage.m */; }; + 49F2DAB713764ED6000B6B8C /* SPButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 49F2DA4C13764ED5000B6B8C /* SPButton.h */; }; + 49F2DAB813764ED6000B6B8C /* SPButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 49F2DA4D13764ED5000B6B8C /* SPButton.m */; }; + 49F2DAB913764ED6000B6B8C /* SPMovieClip.h in Headers */ = {isa = PBXBuildFile; fileRef = 49F2DA4E13764ED5000B6B8C /* SPMovieClip.h */; }; + 49F2DABA13764ED6000B6B8C /* SPMovieClip.m in Sources */ = {isa = PBXBuildFile; fileRef = 49F2DA4F13764ED5000B6B8C /* SPMovieClip.m */; }; + 49F2DABB13764ED6000B6B8C /* SPCompiledSprite.h in Headers */ = {isa = PBXBuildFile; fileRef = 49F2DA5013764ED5000B6B8C /* SPCompiledSprite.h */; }; + 49F2DABC13764ED6000B6B8C /* SPCompiledSprite.m in Sources */ = {isa = PBXBuildFile; fileRef = 49F2DA5113764ED5000B6B8C /* SPCompiledSprite.m */; }; + 49F2DABD13764ED6000B6B8C /* SPTexture.h in Headers */ = {isa = PBXBuildFile; fileRef = 49F2DA5F13764ED5000B6B8C /* SPTexture.h */; }; + 49F2DABE13764ED6000B6B8C /* SPTexture.m in Sources */ = {isa = PBXBuildFile; fileRef = 49F2DA6013764ED5000B6B8C /* SPTexture.m */; }; + 49F2DABF13764ED6000B6B8C /* SPGLTexture.h in Headers */ = {isa = PBXBuildFile; fileRef = 49F2DA6113764ED5000B6B8C /* SPGLTexture.h */; }; + 49F2DAC013764ED6000B6B8C /* SPGLTexture.m in Sources */ = {isa = PBXBuildFile; fileRef = 49F2DA6213764ED5000B6B8C /* SPGLTexture.m */; }; + 49F2DAC113764ED6000B6B8C /* SPSubTexture.h in Headers */ = {isa = PBXBuildFile; fileRef = 49F2DA6313764ED5000B6B8C /* SPSubTexture.h */; }; + 49F2DAC213764ED6000B6B8C /* SPSubTexture.m in Sources */ = {isa = PBXBuildFile; fileRef = 49F2DA6413764ED5000B6B8C /* SPSubTexture.m */; }; + 49F2DAC313764ED6000B6B8C /* SPRenderTexture.h in Headers */ = {isa = PBXBuildFile; fileRef = 49F2DA6513764ED5000B6B8C /* SPRenderTexture.h */; }; + 49F2DAC413764ED6000B6B8C /* SPRenderTexture.m in Sources */ = {isa = PBXBuildFile; fileRef = 49F2DA6613764ED5000B6B8C /* SPRenderTexture.m */; }; + 49F2DAC513764ED6000B6B8C /* SPTextureAtlas.h in Headers */ = {isa = PBXBuildFile; fileRef = 49F2DA6713764ED5000B6B8C /* SPTextureAtlas.h */; }; + 49F2DAC613764ED6000B6B8C /* SPTextureAtlas.m in Sources */ = {isa = PBXBuildFile; fileRef = 49F2DA6813764ED5000B6B8C /* SPTextureAtlas.m */; }; + 49F2DAC713764ED6000B6B8C /* SPTweenedProperty.h in Headers */ = {isa = PBXBuildFile; fileRef = 49F2DA7313764ED5000B6B8C /* SPTweenedProperty.h */; }; + 49F2DAC813764ED6000B6B8C /* SPTweenedProperty.m in Sources */ = {isa = PBXBuildFile; fileRef = 49F2DA7413764ED5000B6B8C /* SPTweenedProperty.m */; }; + 49F2DAC913764ED6000B6B8C /* SPAnimatable.h in Headers */ = {isa = PBXBuildFile; fileRef = 49F2DA6A13764ED5000B6B8C /* SPAnimatable.h */; }; + 49F2DACA13764ED6000B6B8C /* SPJuggler.h in Headers */ = {isa = PBXBuildFile; fileRef = 49F2DA6B13764ED5000B6B8C /* SPJuggler.h */; }; + 49F2DACB13764ED6000B6B8C /* SPJuggler.m in Sources */ = {isa = PBXBuildFile; fileRef = 49F2DA6C13764ED5000B6B8C /* SPJuggler.m */; }; + 49F2DACC13764ED6000B6B8C /* SPTransitions.h in Headers */ = {isa = PBXBuildFile; fileRef = 49F2DA6D13764ED5000B6B8C /* SPTransitions.h */; }; + 49F2DACD13764ED6000B6B8C /* SPTransitions.m in Sources */ = {isa = PBXBuildFile; fileRef = 49F2DA6E13764ED5000B6B8C /* SPTransitions.m */; }; + 49F2DACE13764ED6000B6B8C /* SPTween.h in Headers */ = {isa = PBXBuildFile; fileRef = 49F2DA6F13764ED5000B6B8C /* SPTween.h */; }; + 49F2DACF13764ED6000B6B8C /* SPTween.m in Sources */ = {isa = PBXBuildFile; fileRef = 49F2DA7013764ED5000B6B8C /* SPTween.m */; }; + 49F2DAD013764ED6000B6B8C /* SPDelayedInvocation.h in Headers */ = {isa = PBXBuildFile; fileRef = 49F2DA7113764ED5000B6B8C /* SPDelayedInvocation.h */; }; + 49F2DAD113764ED6000B6B8C /* SPDelayedInvocation.m in Sources */ = {isa = PBXBuildFile; fileRef = 49F2DA7213764ED5000B6B8C /* SPDelayedInvocation.m */; }; + 49F2DAD213764ED6000B6B8C /* SPMacros.h in Headers */ = {isa = PBXBuildFile; fileRef = 49F2DA7513764ED6000B6B8C /* SPMacros.h */; }; + 49F2DAD313764ED6000B6B8C /* SPMatrix.h in Headers */ = {isa = PBXBuildFile; fileRef = 49F2DA7613764ED6000B6B8C /* SPMatrix.h */; }; + 49F2DAD413764ED6000B6B8C /* SPMatrix.m in Sources */ = {isa = PBXBuildFile; fileRef = 49F2DA7713764ED6000B6B8C /* SPMatrix.m */; }; + 49F2DAD513764ED6000B6B8C /* SPPoint.h in Headers */ = {isa = PBXBuildFile; fileRef = 49F2DA7813764ED6000B6B8C /* SPPoint.h */; }; + 49F2DAD613764ED6000B6B8C /* SPPoint.m in Sources */ = {isa = PBXBuildFile; fileRef = 49F2DA7913764ED6000B6B8C /* SPPoint.m */; }; + 49F2DAD713764ED6000B6B8C /* SPRectangle.h in Headers */ = {isa = PBXBuildFile; fileRef = 49F2DA7A13764ED6000B6B8C /* SPRectangle.h */; }; + 49F2DAD813764ED6000B6B8C /* SPRectangle.m in Sources */ = {isa = PBXBuildFile; fileRef = 49F2DA7B13764ED6000B6B8C /* SPRectangle.m */; }; + 49F2DAD913764ED6000B6B8C /* SPNSExtensions.h in Headers */ = {isa = PBXBuildFile; fileRef = 49F2DA7C13764ED6000B6B8C /* SPNSExtensions.h */; }; + 49F2DADA13764ED6000B6B8C /* SPNSExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 49F2DA7D13764ED6000B6B8C /* SPNSExtensions.m */; }; + 49F2DADB13764ED6000B6B8C /* SPPoolObject.h in Headers */ = {isa = PBXBuildFile; fileRef = 49F2DA7E13764ED6000B6B8C /* SPPoolObject.h */; }; + 49F2DADC13764ED6000B6B8C /* SPPoolObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 49F2DA7F13764ED6000B6B8C /* SPPoolObject.m */; }; + 49F2DADD13764ED6000B6B8C /* SPUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 49F2DA8013764ED6000B6B8C /* SPUtils.h */; }; + 49F2DADE13764ED6000B6B8C /* SPUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 49F2DA8113764ED6000B6B8C /* SPUtils.m */; }; + 49F2DADF13764ED6000B6B8C /* Sparrow.h in Headers */ = {isa = PBXBuildFile; fileRef = 49F2DA1D13764ED5000B6B8C /* Sparrow.h */; }; + 49F2DAF213765004000B6B8C /* GLES-Render.h in Headers */ = {isa = PBXBuildFile; fileRef = 49F2DAE613765004000B6B8C /* GLES-Render.h */; }; + 49F2DAF313765004000B6B8C /* GLES-Render.mm in Sources */ = {isa = PBXBuildFile; fileRef = 49F2DAE713765004000B6B8C /* GLES-Render.mm */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 49F2D9A2137645E0000B6B8C /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 49F2D99B137645DF000B6B8C /* box2d-ios.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 4913305F1372610400DFB46D; + remoteInfo = Box2D; + }; + 49F2D9AA13764624000B6B8C /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 49F2D99B137645DF000B6B8C /* box2d-ios.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = 4913305E1372610400DFB46D; + remoteInfo = Box2D; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 499668C213692E2D006E8125 /* Tanks.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Tanks.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 499668C613692E2D006E8125 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; + 499668C813692E2D006E8125 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; + 499668CA13692E2D006E8125 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; + 49966912136930E8006E8125 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; + 49966913136930E8006E8125 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; + 49966914136930E8006E8125 /* OpenAL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenAL.framework; path = System/Library/Frameworks/OpenAL.framework; sourceTree = SDKROOT; }; + 49966915136930E8006E8125 /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; }; + 49966916136930E8006E8125 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; + 49F2D999137645BF000B6B8C /* libSparrow.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = libSparrow.a; sourceTree = SOURCE_ROOT; }; + 49F2D99B137645DF000B6B8C /* box2d-ios.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = "box2d-ios.xcodeproj"; path = "libs/box2d/box2d-ios.xcodeproj"; sourceTree = ""; }; + 49F2D9AC1376462B000B6B8C /* libBox2D.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = libBox2D.a; sourceTree = SOURCE_ROOT; }; + 49F2D9B013764666000B6B8C /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 49F2D9B213764666000B6B8C /* prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = prefix.pch; sourceTree = ""; }; + 49F2D9B413764666000B6B8C /* RootAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RootAppDelegate.h; sourceTree = ""; }; + 49F2D9B513764666000B6B8C /* RootAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RootAppDelegate.m; sourceTree = ""; }; + 49F2D9B713764666000B6B8C /* Game.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Game.h; sourceTree = ""; }; + 49F2D9B813764666000B6B8C /* Game.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Game.m; sourceTree = ""; }; + 49F2D9BC13764666000B6B8C /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/MainWindow_iPad.xib; sourceTree = ""; }; + 49F2D9BD13764666000B6B8C /* RootAppDelegate_iPad.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RootAppDelegate_iPad.h; sourceTree = ""; }; + 49F2D9BE13764666000B6B8C /* RootAppDelegate_iPad.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RootAppDelegate_iPad.m; sourceTree = ""; }; + 49F2D9C113764666000B6B8C /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/MainWindow_iPhone.xib; sourceTree = ""; }; + 49F2D9C213764666000B6B8C /* RootAppDelegate_iPhone.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RootAppDelegate_iPhone.h; sourceTree = ""; }; + 49F2D9C313764666000B6B8C /* RootAppDelegate_iPhone.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RootAppDelegate_iPhone.m; sourceTree = ""; }; + 49F2D9D513764A9B000B6B8C /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; + 49F2D9D613764A9B000B6B8C /* tanks-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "tanks-Info.plist"; sourceTree = ""; }; + 49F2DA1D13764ED5000B6B8C /* Sparrow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Sparrow.h; sourceTree = ""; }; + 49F2DA2013764ED5000B6B8C /* SPAudioEngine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPAudioEngine.h; sourceTree = ""; }; + 49F2DA2113764ED5000B6B8C /* SPAudioEngine.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPAudioEngine.m; sourceTree = ""; }; + 49F2DA2213764ED5000B6B8C /* SPSound.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPSound.h; sourceTree = ""; }; + 49F2DA2313764ED5000B6B8C /* SPSound.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPSound.m; sourceTree = ""; }; + 49F2DA2413764ED5000B6B8C /* SPSoundChannel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPSoundChannel.h; sourceTree = ""; }; + 49F2DA2513764ED5000B6B8C /* SPSoundChannel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPSoundChannel.m; sourceTree = ""; }; + 49F2DA2613764ED5000B6B8C /* SPAVSound.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPAVSound.h; sourceTree = ""; }; + 49F2DA2713764ED5000B6B8C /* SPAVSound.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPAVSound.m; sourceTree = ""; }; + 49F2DA2813764ED5000B6B8C /* SPAVSoundChannel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPAVSoundChannel.h; sourceTree = ""; }; + 49F2DA2913764ED5000B6B8C /* SPAVSoundChannel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPAVSoundChannel.m; sourceTree = ""; }; + 49F2DA2A13764ED5000B6B8C /* SPALSound.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPALSound.h; sourceTree = ""; }; + 49F2DA2B13764ED5000B6B8C /* SPALSound.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPALSound.m; sourceTree = ""; }; + 49F2DA2C13764ED5000B6B8C /* SPALSoundChannel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPALSoundChannel.h; sourceTree = ""; }; + 49F2DA2D13764ED5000B6B8C /* SPALSoundChannel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPALSoundChannel.m; sourceTree = ""; }; + 49F2DA2E13764ED5000B6B8C /* SPView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPView.h; sourceTree = ""; }; + 49F2DA2F13764ED5000B6B8C /* SPView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPView.m; sourceTree = ""; }; + 49F2DA3113764ED5000B6B8C /* SPEvent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPEvent.h; sourceTree = ""; }; + 49F2DA3213764ED5000B6B8C /* SPEvent.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPEvent.m; sourceTree = ""; }; + 49F2DA3313764ED5000B6B8C /* SPEventDispatcher.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPEventDispatcher.h; sourceTree = ""; }; + 49F2DA3413764ED5000B6B8C /* SPEventDispatcher.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPEventDispatcher.m; sourceTree = ""; }; + 49F2DA3513764ED5000B6B8C /* SPTouch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPTouch.h; sourceTree = ""; }; + 49F2DA3613764ED5000B6B8C /* SPTouch.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPTouch.m; sourceTree = ""; }; + 49F2DA3713764ED5000B6B8C /* SPTouchEvent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPTouchEvent.h; sourceTree = ""; }; + 49F2DA3813764ED5000B6B8C /* SPTouchEvent.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPTouchEvent.m; sourceTree = ""; }; + 49F2DA3913764ED5000B6B8C /* SPEnterFrameEvent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPEnterFrameEvent.h; sourceTree = ""; }; + 49F2DA3A13764ED5000B6B8C /* SPEnterFrameEvent.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPEnterFrameEvent.m; sourceTree = ""; }; + 49F2DA3B13764ED5000B6B8C /* SPTouch_Internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPTouch_Internal.h; sourceTree = ""; }; + 49F2DA3C13764ED5000B6B8C /* SPEvent_Internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPEvent_Internal.h; sourceTree = ""; }; + 49F2DA4013764ED5000B6B8C /* SPDisplayObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPDisplayObject.h; sourceTree = ""; }; + 49F2DA4113764ED5000B6B8C /* SPDisplayObject.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPDisplayObject.m; sourceTree = ""; }; + 49F2DA4213764ED5000B6B8C /* SPDisplayObjectContainer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPDisplayObjectContainer.h; sourceTree = ""; }; + 49F2DA4313764ED5000B6B8C /* SPDisplayObjectContainer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPDisplayObjectContainer.m; sourceTree = ""; }; + 49F2DA4413764ED5000B6B8C /* SPSprite.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPSprite.h; sourceTree = ""; }; + 49F2DA4513764ED5000B6B8C /* SPSprite.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPSprite.m; sourceTree = ""; }; + 49F2DA4613764ED5000B6B8C /* SPStage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPStage.h; sourceTree = ""; }; + 49F2DA4713764ED5000B6B8C /* SPStage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPStage.m; sourceTree = ""; }; + 49F2DA4813764ED5000B6B8C /* SPQuad.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPQuad.h; sourceTree = ""; }; + 49F2DA4913764ED5000B6B8C /* SPQuad.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPQuad.m; sourceTree = ""; }; + 49F2DA4A13764ED5000B6B8C /* SPImage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPImage.h; sourceTree = ""; }; + 49F2DA4B13764ED5000B6B8C /* SPImage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPImage.m; sourceTree = ""; }; + 49F2DA4C13764ED5000B6B8C /* SPButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPButton.h; sourceTree = ""; }; + 49F2DA4D13764ED5000B6B8C /* SPButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPButton.m; sourceTree = ""; }; + 49F2DA4E13764ED5000B6B8C /* SPMovieClip.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPMovieClip.h; sourceTree = ""; }; + 49F2DA4F13764ED5000B6B8C /* SPMovieClip.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPMovieClip.m; sourceTree = ""; }; + 49F2DA5013764ED5000B6B8C /* SPCompiledSprite.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPCompiledSprite.h; sourceTree = ""; }; + 49F2DA5113764ED5000B6B8C /* SPCompiledSprite.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPCompiledSprite.m; sourceTree = ""; }; + 49F2DA5213764ED5000B6B8C /* SPRendering.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPRendering.m; sourceTree = ""; }; + 49F2DA5313764ED5000B6B8C /* SPRenderSupport.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPRenderSupport.h; sourceTree = ""; }; + 49F2DA5413764ED5000B6B8C /* SPRenderSupport.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPRenderSupport.m; sourceTree = ""; }; + 49F2DA5513764ED5000B6B8C /* SPTextField.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPTextField.h; sourceTree = ""; }; + 49F2DA5613764ED5000B6B8C /* SPTextField.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPTextField.m; sourceTree = ""; }; + 49F2DA5713764ED5000B6B8C /* SPBitmapFont.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPBitmapFont.h; sourceTree = ""; }; + 49F2DA5813764ED5000B6B8C /* SPBitmapFont.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPBitmapFont.m; sourceTree = ""; }; + 49F2DA5913764ED5000B6B8C /* SPBitmapChar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPBitmapChar.h; sourceTree = ""; }; + 49F2DA5A13764ED5000B6B8C /* SPBitmapChar.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPBitmapChar.m; sourceTree = ""; }; + 49F2DA5B13764ED5000B6B8C /* SPTouchProcessor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPTouchProcessor.h; sourceTree = ""; }; + 49F2DA5C13764ED5000B6B8C /* SPTouchProcessor.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPTouchProcessor.m; sourceTree = ""; }; + 49F2DA5D13764ED5000B6B8C /* SPDisplayObject_Internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPDisplayObject_Internal.h; sourceTree = ""; }; + 49F2DA5E13764ED5000B6B8C /* SPStage_Internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPStage_Internal.h; sourceTree = ""; }; + 49F2D