Adds Sparrow as source dep, as linker flags -ObjC -all_load break Box2D. sparrow
authordsc <david.schoonover@gmail.com>
Sun, 8 May 2011 04:19:08 +0000 (21:19 -0700)
committerdsc <david.schoonover@gmail.com>
Sun, 8 May 2011 04:19:08 +0000 (21:19 -0700)
33 files changed:
etc/en.lproj/InfoPlist.strings [moved from tanks/tanks/en.lproj/InfoPlist.strings with 100% similarity]
etc/tanks-Info.plist [moved from tanks/tanks/tanks-Info.plist with 96% similarity]
src/RootAppDelegate.h [moved from tanks/tanks/tanksAppDelegate.h with 77% similarity]
src/RootAppDelegate.m [moved from tanks/tanks/tanksAppDelegate.m with 85% similarity]
src/main.m [moved from tanks/tanks/main.m with 100% similarity]
src/prefix.pch [moved from tanks/tanks/tanks-Prefix.pch with 100% similarity]
src/render/Box2DAppDelegate.h [new file with mode: 0644]
src/render/Box2DAppDelegate.mm [new file with mode: 0644]
src/render/Box2DView.h [new file with mode: 0644]
src/render/Box2DView.mm [new file with mode: 0644]
src/render/Delegates.h [new file with mode: 0644]
src/render/GLES-Render.h [new file with mode: 0644]
src/render/GLES-Render.mm [new file with mode: 0644]
src/render/TestEntriesViewController.h [new file with mode: 0644]
src/render/TestEntriesViewController.mm [new file with mode: 0644]
src/render/iPhoneTest.h [new file with mode: 0644]
src/render/iPhoneTest.mm [new file with mode: 0644]
src/render/iPhoneTestEntries.mm [new file with mode: 0644]
src/tanks/Game.h [moved from tanks/tanks/Game.h with 100% similarity]
src/tanks/Game.m [moved from tanks/tanks/Game.m with 100% similarity]
src/ui/iPad/RootAppDelegate_iPad.h [moved from tanks/tanks/iPad/tanksAppDelegate_iPad.h with 55% similarity]
src/ui/iPad/RootAppDelegate_iPad.m [moved from tanks/tanks/iPad/tanksAppDelegate_iPad.m with 59% similarity]
src/ui/iPad/en.lproj/MainWindow_iPad.xib [moved from tanks/tanks/iPad/en.lproj/MainWindow_iPad.xib with 61% similarity]
src/ui/iPhone/RootAppDelegate_iPhone.h [moved from tanks/tanks/iPhone/tanksAppDelegate_iPhone.h with 55% similarity]
src/ui/iPhone/RootAppDelegate_iPhone.m [moved from tanks/tanks/iPhone/tanksAppDelegate_iPhone.m with 58% similarity]
src/ui/iPhone/en.lproj/MainWindow_iPhone.xib [moved from tanks/tanks/iPhone/en.lproj/MainWindow_iPhone.xib with 59% similarity]
tanks.xcodeproj/project.pbxproj [new file with mode: 0644]
tanks/tanks.xcodeproj/project.pbxproj [deleted file]
tanks/tanksTests/en.lproj/InfoPlist.strings [deleted file]
tanks/tanksTests/tanksTests-Info.plist [deleted file]
tanks/tanksTests/tanksTests-Prefix.pch [deleted file]
tanks/tanksTests/tanksTests.h [deleted file]
tanks/tanksTests/tanksTests.m [deleted file]

similarity index 96%
rename from tanks/tanks/tanks-Info.plist
rename to etc/tanks-Info.plist
index 3d0f19a..2a1e14a 100644 (file)
@@ -35,6 +35,7 @@
                <string>UIInterfaceOrientationPortrait</string>
                <string>UIInterfaceOrientationLandscapeLeft</string>
                <string>UIInterfaceOrientationLandscapeRight</string>
+               <string>UIInterfaceOrientationPortraitUpsideDown</string>
        </array>
        <key>UISupportedInterfaceOrientations~ipad</key>
        <array>
similarity index 77%
rename from tanks/tanks/tanksAppDelegate.h
rename to src/RootAppDelegate.h
index 2db3133..b3d29e3 100644 (file)
@@ -1,5 +1,5 @@
 //
-//  tanksAppDelegate.h
+//  RootAppDelegate.h
 //  tanks
 //
 //  Created by dsc on 4/27/11.
@@ -9,7 +9,7 @@
 #import <UIKit/UIKit.h>
 #import "Sparrow.h"
 
-@interface tanksAppDelegate : NSObject <UIApplicationDelegate>
+@interface RootAppDelegate : NSObject <UIApplicationDelegate>
 {
     UIWindow *window;
     SPView *sparrowView;
similarity index 85%
rename from tanks/tanks/tanksAppDelegate.m
rename to src/RootAppDelegate.m
index f936da6..0cdfe1d 100644 (file)
@@ -1,15 +1,15 @@
 //
-//  tanksAppDelegate.m
+//  RootAppDelegate.m
 //  tanks
 //
 //  Created by dsc on 4/27/11.
 //  Copyright 2011 lttlst.com. All rights reserved.
 //
 
-#import "tanksAppDelegate.h"
+#import "RootAppDelegate.h"
 #import "Game.h"
 
-@implementation tanksAppDelegate
+@implementation RootAppDelegate
 
 @synthesize window;
 @synthesize sparrowView;
@@ -21,7 +21,7 @@
     [SPStage setSupportHighResolutions:YES];
     [SPAudioEngine start];
     
-    Game *game = [[Game alloc] init];        
+    Game *game = [[Game alloc] init];
     sparrowView.stage = game;
     [game release];
     
similarity index 100%
rename from tanks/tanks/main.m
rename to src/main.m
similarity index 100%
rename from tanks/tanks/tanks-Prefix.pch
rename to src/prefix.pch
diff --git a/src/render/Box2DAppDelegate.h b/src/render/Box2DAppDelegate.h
new file mode 100644 (file)
index 0000000..f081ba3
--- /dev/null
@@ -0,0 +1,24 @@
+//
+//  Box2DAppDelegate.h
+//  Box2D
+//
+//  Box2D iPhone port by Simon Oliver - http://www.simonoliver.com - http://www.handcircus.com
+//
+
+#import <UIKit/UIKit.h>
+#import "TestEntriesViewController.h"
+#import "Delegates.h"
+
+@class Box2DView;
+
+@interface Box2DAppDelegate : NSObject <UIApplicationDelegate,TestSelectDelegate> {
+    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 (file)
index 0000000..e04a09e
--- /dev/null
@@ -0,0 +1,62 @@
+//
+//  Box2DAppDelegate.m
+//  Box2D
+//
+//  Box2D iPhone port by Simon Oliver - http://www.simonoliver.com - http://www.handcircus.com
+//
+
+#import <UIKit/UIKit.h>
+#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 (file)
index 0000000..81d50b3
--- /dev/null
@@ -0,0 +1,63 @@
+//
+//  Box2DView.h
+//  Box2D OpenGL View
+//
+//  Box2D iPhone port by Simon Oliver - http://www.simonoliver.com - http://www.handcircus.com
+//
+
+
+#import <UIKit/UIKit.h>
+#import <OpenGLES/EAGL.h>
+#import <OpenGLES/ES1/gl.h>
+#import <OpenGLES/ES1/glext.h>
+
+#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 <UIAccelerometerDelegate> {
+    
+@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<TestSelectDelegate> _delegate;
+       
+}
+@property(assign) id<TestSelectDelegate> 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 (file)
index 0000000..11743b0
--- /dev/null
@@ -0,0 +1,295 @@
+//
+//  Box2DView.mm
+//  Box2D OpenGL View
+//
+//  Box2D iPhone port by Simon Oliver - http://www.simonoliver.com - http://www.handcircus.com
+//
+
+#import <QuartzCore/QuartzCore.h>
+#import <OpenGLES/EAGLDrawable.h>
+
+#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 (file)
index 0000000..b4b7976
--- /dev/null
@@ -0,0 +1,14 @@
+/*
+ *  Delegates.h
+ *  Box2D
+ *
+ *  Box2D iPhone port by Simon Oliver - http://www.simonoliver.com - http://www.handcircus.com
+ *
+ *
+ */
+
+@protocol TestSelectDelegate <NSObject>
+       -(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 (file)
index 0000000..2551666<