diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..0ef1ffb --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +*.pbxproj -crlf -diff -merge \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9cd5f31 --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +# xcode noise +build/* +*.pbxuser +*.mode1v3 + +# osx noise +.DS_Store +profile \ No newline at end of file diff --git a/.gitignore~ b/.gitignore~ new file mode 100644 index 0000000..9cd5f31 --- /dev/null +++ b/.gitignore~ @@ -0,0 +1,8 @@ +# xcode noise +build/* +*.pbxuser +*.mode1v3 + +# osx noise +.DS_Store +profile \ No newline at end of file diff --git a/Final/Classes/EAGLView.h b/Final/Classes/EAGLView.h new file mode 100644 index 0000000..d045b0a --- /dev/null +++ b/Final/Classes/EAGLView.h @@ -0,0 +1,40 @@ +// +// EAGLView.h +// Final +// +// Created by David Nolen on 10/18/09. +// Copyright David Nolen 2009. All rights reserved. +// + +#import +#import + +#import "ESRenderer.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 EAGLView : UIView +{ +@private + id renderer; + + BOOL animating; + BOOL displayLinkSupported; + NSInteger animationFrameInterval; + // Use of the CADisplayLink class is the preferred method for controlling your animation timing. + // CADisplayLink will link to the main display and fire every vsync when added to a given run-loop. + // The NSTimer class is used only as fallback when running on a pre 3.1 device where CADisplayLink + // isn't available. + id displayLink; + NSTimer *animationTimer; +} + +@property (readonly, nonatomic, getter=isAnimating) BOOL animating; +@property (nonatomic) NSInteger animationFrameInterval; + +- (void) startAnimation; +- (void) stopAnimation; +- (void) drawView:(id)sender; + +@end diff --git a/Final/Classes/EAGLView.m b/Final/Classes/EAGLView.m new file mode 100644 index 0000000..a028e7b --- /dev/null +++ b/Final/Classes/EAGLView.m @@ -0,0 +1,150 @@ +// +// EAGLView.m +// Final +// +// Created by David Nolen on 10/18/09. +// Copyright David Nolen 2009. All rights reserved. +// + +#import "EAGLView.h" + +#import "ES1Renderer.h" +#import "ES2Renderer.h" + +@implementation EAGLView + +@synthesize animating; +@dynamic animationFrameInterval; + +// 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 = TRUE; + eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys: + [NSNumber numberWithBool:FALSE], kEAGLDrawablePropertyRetainedBacking, kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat, nil]; + + renderer = [[ES2Renderer alloc] init]; + + if (!renderer) + { + renderer = [[ES1Renderer alloc] init]; + + if (!renderer) + { + [self release]; + return nil; + } + } + + animating = FALSE; + displayLinkSupported = FALSE; + animationFrameInterval = 1; + displayLink = nil; + animationTimer = nil; + + // A system version of 3.1 or greater is required to use CADisplayLink. The NSTimer + // class is used as fallback when it isn't available. + NSString *reqSysVer = @"3.1"; + NSString *currSysVer = [[UIDevice currentDevice] systemVersion]; + if ([currSysVer compare:reqSysVer options:NSNumericSearch] != NSOrderedAscending) + displayLinkSupported = TRUE; + } + + return self; +} + +- (void) drawView:(id)sender +{ + [renderer render]; +} + +- (void) layoutSubviews +{ + [renderer resizeFromLayer:(CAEAGLLayer*)self.layer]; + [self drawView:nil]; +} + +- (NSInteger) animationFrameInterval +{ + return animationFrameInterval; +} + +- (void) setAnimationFrameInterval:(NSInteger)frameInterval +{ + // Frame interval defines how many display frames must pass between each time the + // display link fires. The display link will only fire 30 times a second when the + // frame internal is two on a display that refreshes 60 times a second. The default + // frame interval setting of one will fire 60 times a second when the display refreshes + // at 60 times a second. A frame interval setting of less than one results in undefined + // behavior. + if (frameInterval >= 1) + { + animationFrameInterval = frameInterval; + + if (animating) + { + [self stopAnimation]; + [self startAnimation]; + } + } +} + +- (void) startAnimation +{ + if (!animating) + { + if (displayLinkSupported) + { + // CADisplayLink is API new to iPhone SDK 3.1. Compiling against earlier versions will result in a warning, but can be dismissed + // if the system version runtime check for CADisplayLink exists in -initWithCoder:. The runtime check ensures this code will + // not be called in system versions earlier than 3.1. + + displayLink = [NSClassFromString(@"CADisplayLink") displayLinkWithTarget:self selector:@selector(drawView:)]; + [displayLink setFrameInterval:animationFrameInterval]; + [displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; + } + else + animationTimer = [NSTimer scheduledTimerWithTimeInterval:(NSTimeInterval)((1.0 / 60.0) * animationFrameInterval) target:self selector:@selector(drawView:) userInfo:nil repeats:TRUE]; + + animating = TRUE; + } +} + +- (void)stopAnimation +{ + if (animating) + { + if (displayLinkSupported) + { + [displayLink invalidate]; + displayLink = nil; + } + else + { + [animationTimer invalidate]; + animationTimer = nil; + } + + animating = FALSE; + } +} + +- (void) dealloc +{ + [renderer release]; + + [super dealloc]; +} + +@end diff --git a/Final/Classes/ES1Renderer.h b/Final/Classes/ES1Renderer.h new file mode 100644 index 0000000..b7e8099 --- /dev/null +++ b/Final/Classes/ES1Renderer.h @@ -0,0 +1,30 @@ +// +// ES1Renderer.h +// Final +// +// Created by David Nolen on 10/18/09. +// Copyright David Nolen 2009. All rights reserved. +// + +#import "ESRenderer.h" + +#import +#import + +@interface ES1Renderer : NSObject +{ +@private + EAGLContext *context; + + // The pixel dimensions of the CAEAGLLayer + GLint backingWidth; + GLint backingHeight; + + // The OpenGL names for the framebuffer and renderbuffer used to render to this view + GLuint defaultFramebuffer, colorRenderbuffer; +} + +- (void) render; +- (BOOL) resizeFromLayer:(CAEAGLLayer *)layer; + +@end diff --git a/Final/Classes/ES1Renderer.m b/Final/Classes/ES1Renderer.m new file mode 100644 index 0000000..dc91d21 --- /dev/null +++ b/Final/Classes/ES1Renderer.m @@ -0,0 +1,131 @@ +// +// ES1Renderer.m +// Final +// +// Created by David Nolen on 10/18/09. +// Copyright David Nolen 2009. All rights reserved. +// + +#import "ES1Renderer.h" + +@implementation ES1Renderer + +// Create an ES 1.1 context +- (id) init +{ + if (self = [super init]) + { + context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1]; + + if (!context || ![EAGLContext setCurrentContext:context]) + { + [self release]; + return nil; + } + + // Create default framebuffer object. The backing will be allocated for the current layer in -resizeFromLayer + glGenFramebuffersOES(1, &defaultFramebuffer); + glGenRenderbuffersOES(1, &colorRenderbuffer); + glBindFramebufferOES(GL_FRAMEBUFFER_OES, defaultFramebuffer); + glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer); + glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, colorRenderbuffer); + } + + return self; +} + +- (void) render +{ + // Replace the implementation of this method to do your own custom drawing + + static const GLfloat squareVertices[] = { + -0.5f, -0.33f, + 0.5f, -0.33f, + -0.5f, 0.33f, + 0.5f, 0.33f, + }; + + static const GLubyte squareColors[] = { + 255, 255, 0, 255, + 0, 255, 255, 255, + 0, 0, 0, 0, + 255, 0, 255, 255, + }; + + static float transY = 0.0f; + + // This application only creates a single context which is already set current at this point. + // This call is redundant, but needed if dealing with multiple contexts. + [EAGLContext setCurrentContext:context]; + + // This application only creates a single default framebuffer which is already bound at this point. + // This call is redundant, but needed if dealing with multiple framebuffers. + glBindFramebufferOES(GL_FRAMEBUFFER_OES, defaultFramebuffer); + glViewport(0, 0, backingWidth, backingHeight); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glTranslatef(0.0f, (GLfloat)(sinf(transY)/2.0f), 0.0f); + transY += 0.075f; + + glClearColor(0.5f, 0.5f, 0.5f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + + glVertexPointer(2, GL_FLOAT, 0, squareVertices); + glEnableClientState(GL_VERTEX_ARRAY); + glColorPointer(4, GL_UNSIGNED_BYTE, 0, squareColors); + glEnableClientState(GL_COLOR_ARRAY); + + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + + // This application only creates a single color renderbuffer which is already bound at this point. + // This call is redundant, but needed if dealing with multiple renderbuffers. + glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer); + [context presentRenderbuffer:GL_RENDERBUFFER_OES]; +} + +- (BOOL) resizeFromLayer:(CAEAGLLayer *)layer +{ + // Allocate color buffer backing based on the current layer size + glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer); + [context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:layer]; + glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth); + glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight); + + 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) dealloc +{ + // Tear down GL + if (defaultFramebuffer) + { + glDeleteFramebuffersOES(1, &defaultFramebuffer); + defaultFramebuffer = 0; + } + + if (colorRenderbuffer) + { + glDeleteRenderbuffersOES(1, &colorRenderbuffer); + colorRenderbuffer = 0; + } + + // Tear down context + if ([EAGLContext currentContext] == context) + [EAGLContext setCurrentContext:nil]; + + [context release]; + context = nil; + + [super dealloc]; +} + +@end diff --git a/Final/Classes/ES2Renderer.h b/Final/Classes/ES2Renderer.h new file mode 100644 index 0000000..868e151 --- /dev/null +++ b/Final/Classes/ES2Renderer.h @@ -0,0 +1,33 @@ +// +// ES2Renderer.h +// Final +// +// Created by David Nolen on 10/18/09. +// Copyright David Nolen 2009. All rights reserved. +// + +#import "ESRenderer.h" + +#import +#import + +@interface ES2Renderer : NSObject +{ +@private + EAGLContext *context; + + // The pixel dimensions of the CAEAGLLayer + GLint backingWidth; + GLint backingHeight; + + // The OpenGL names for the framebuffer and renderbuffer used to render to this view + GLuint defaultFramebuffer, colorRenderbuffer; + + GLuint program; +} + +- (void) render; +- (BOOL) resizeFromLayer:(CAEAGLLayer *)layer; + +@end + diff --git a/Final/Classes/ES2Renderer.m b/Final/Classes/ES2Renderer.m new file mode 100644 index 0000000..caca262 --- /dev/null +++ b/Final/Classes/ES2Renderer.m @@ -0,0 +1,308 @@ +// +// ES2Renderer.m +// Final +// +// Created by David Nolen on 10/18/09. +// Copyright David Nolen 2009. All rights reserved. +// + +#import "ES2Renderer.h" + +// uniform index +enum { + UNIFORM_TRANSLATE, + NUM_UNIFORMS +}; +GLint uniforms[NUM_UNIFORMS]; + +// attribute index +enum { + ATTRIB_VERTEX, + ATTRIB_COLOR, + NUM_ATTRIBUTES +}; + +@interface ES2Renderer (PrivateMethods) +- (BOOL) loadShaders; +- (BOOL) compileShader:(GLuint *)shader type:(GLenum)type file:(NSString *)file; +- (BOOL) linkProgram:(GLuint)prog; +- (BOOL) validateProgram:(GLuint)prog; +@end + +@implementation ES2Renderer + +// Create an ES 2.0 context +- (id) init +{ + if (self = [super init]) + { + context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2]; + + if (!context || ![EAGLContext setCurrentContext:context] || ![self loadShaders]) + { + [self release]; + return nil; + } + + // Create default framebuffer object. The backing will be allocated for the current layer in -resizeFromLayer + glGenFramebuffers(1, &defaultFramebuffer); + glGenRenderbuffers(1, &colorRenderbuffer); + glBindFramebuffer(GL_FRAMEBUFFER, defaultFramebuffer); + glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorRenderbuffer); + } + + return self; +} + +- (void) render +{ + // Replace the implementation of this method to do your own custom drawing + + static const GLfloat squareVertices[] = { + -0.5f, -0.33f, + 0.5f, -0.33f, + -0.5f, 0.33f, + 0.5f, 0.33f, + }; + + static const GLubyte squareColors[] = { + 255, 255, 0, 255, + 0, 255, 255, 255, + 0, 0, 0, 0, + 255, 0, 255, 255, + }; + + static float transY = 0.0f; + + // This application only creates a single context which is already set current at this point. + // This call is redundant, but needed if dealing with multiple contexts. + [EAGLContext setCurrentContext:context]; + + // This application only creates a single default framebuffer which is already bound at this point. + // This call is redundant, but needed if dealing with multiple framebuffers. + glBindFramebuffer(GL_FRAMEBUFFER, defaultFramebuffer); + glViewport(0, 0, backingWidth, backingHeight); + + glClearColor(0.5f, 0.5f, 0.5f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + + // Use shader program + glUseProgram(program); + + // Update uniform value + glUniform1f(uniforms[UNIFORM_TRANSLATE], (GLfloat)transY); + transY += 0.075f; + + // Update attribute values + glVertexAttribPointer(ATTRIB_VERTEX, 2, GL_FLOAT, 0, 0, squareVertices); + glEnableVertexAttribArray(ATTRIB_VERTEX); + glVertexAttribPointer(ATTRIB_COLOR, 4, GL_UNSIGNED_BYTE, 1, 0, squareColors); + glEnableVertexAttribArray(ATTRIB_COLOR); + + // Validate program before drawing. This is a good check, but only really necessary in a debug build. + // DEBUG macro must be defined in your debug configurations if that's not already the case. +#if defined(DEBUG) + if (![self validateProgram:program]) + { + NSLog(@"Failed to validate program: %d", program); + return; + } +#endif + + // Draw + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + + // This application only creates a single color renderbuffer which is already bound at this point. + // This call is redundant, but needed if dealing with multiple renderbuffers. + glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer); + [context presentRenderbuffer:GL_RENDERBUFFER]; +} + +- (BOOL) compileShader:(GLuint *)shader type:(GLenum)type file:(NSString *)file +{ + GLint status; + const GLchar *source; + + source = (GLchar *)[[NSString stringWithContentsOfFile:file encoding:NSUTF8StringEncoding error:nil] UTF8String]; + if (!source) + { + NSLog(@"Failed to load vertex shader"); + return FALSE; + } + + *shader = glCreateShader(type); + glShaderSource(*shader, 1, &source, NULL); + glCompileShader(*shader); + +#if defined(DEBUG) + GLint logLength; + glGetShaderiv(*shader, GL_INFO_LOG_LENGTH, &logLength); + if (logLength > 0) + { + GLchar *log = (GLchar *)malloc(logLength); + glGetShaderInfoLog(*shader, logLength, &logLength, log); + NSLog(@"Shader compile log:\n%s", log); + free(log); + } +#endif + + glGetShaderiv(*shader, GL_COMPILE_STATUS, &status); + if (status == 0) + { + glDeleteShader(*shader); + return FALSE; + } + + return TRUE; +} + +- (BOOL) linkProgram:(GLuint)prog +{ + GLint status; + + glLinkProgram(prog); + +#if defined(DEBUG) + GLint logLength; + glGetProgramiv(prog, GL_INFO_LOG_LENGTH, &logLength); + if (logLength > 0) + { + GLchar *log = (GLchar *)malloc(logLength); + glGetProgramInfoLog(prog, logLength, &logLength, log); + NSLog(@"Program link log:\n%s", log); + free(log); + } +#endif + + glGetProgramiv(prog, GL_LINK_STATUS, &status); + if (status == 0) + return FALSE; + + return TRUE; +} + +- (BOOL) validateProgram:(GLuint)prog +{ + GLint logLength, status; + + glValidateProgram(prog); + glGetProgramiv(prog, GL_INFO_LOG_LENGTH, &logLength); + if (logLength > 0) + { + GLchar *log = (GLchar *)malloc(logLength); + glGetProgramInfoLog(prog, logLength, &logLength, log); + NSLog(@"Program validate log:\n%s", log); + free(log); + } + + glGetProgramiv(prog, GL_VALIDATE_STATUS, &status); + if (status == 0) + return FALSE; + + return TRUE; +} + +- (BOOL) loadShaders +{ + GLuint vertShader, fragShader; + NSString *vertShaderPathname, *fragShaderPathname; + + // create shader program + program = glCreateProgram(); + + // create and compile vertex shader + vertShaderPathname = [[NSBundle mainBundle] pathForResource:@"Shader" ofType:@"vsh"]; + if (![self compileShader:&vertShader type:GL_VERTEX_SHADER file:vertShaderPathname]) + { + NSLog(@"Failed to compile vertex shader"); + return FALSE; + } + + // create and compile fragment shader + fragShaderPathname = [[NSBundle mainBundle] pathForResource:@"Shader" ofType:@"fsh"]; + if (![self compileShader:&fragShader type:GL_FRAGMENT_SHADER file:fragShaderPathname]) + { + NSLog(@"Failed to compile fragment shader"); + return FALSE; + } + + // attach vertex shader to program + glAttachShader(program, vertShader); + + // attach fragment shader to program + glAttachShader(program, fragShader); + + // bind attribute locations + // this needs to be done prior to linking + glBindAttribLocation(program, ATTRIB_VERTEX, "position"); + glBindAttribLocation(program, ATTRIB_COLOR, "color"); + + // link program + if (![self linkProgram:program]) + { + NSLog(@"Failed to link program: %d", program); + return FALSE; + } + + // get uniform locations + uniforms[UNIFORM_TRANSLATE] = glGetUniformLocation(program, "translate"); + + // release vertex and fragment shaders + if (vertShader) + glDeleteShader(vertShader); + if (fragShader) + glDeleteShader(fragShader); + + return TRUE; +} + +- (BOOL) resizeFromLayer:(CAEAGLLayer *)layer +{ + // Allocate color buffer backing based on the current layer size + glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer); + [context renderbufferStorage:GL_RENDERBUFFER fromDrawable:layer]; + glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &backingWidth); + glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &backingHeight); + + if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) + { + NSLog(@"Failed to make complete framebuffer object %x", glCheckFramebufferStatus(GL_FRAMEBUFFER)); + return NO; + } + + return YES; +} + +- (void) dealloc +{ + // Tear down GL + if (defaultFramebuffer) + { + glDeleteFramebuffers(1, &defaultFramebuffer); + defaultFramebuffer = 0; + } + + if (colorRenderbuffer) + { + glDeleteRenderbuffers(1, &colorRenderbuffer); + colorRenderbuffer = 0; + } + + if (program) + { + glDeleteProgram(program); + program = 0; + } + + // Tear down context + if ([EAGLContext currentContext] == context) + [EAGLContext setCurrentContext:nil]; + + [context release]; + context = nil; + + [super dealloc]; +} + +@end diff --git a/Final/Classes/ESRenderer.h b/Final/Classes/ESRenderer.h new file mode 100644 index 0000000..a30f6a6 --- /dev/null +++ b/Final/Classes/ESRenderer.h @@ -0,0 +1,19 @@ +// +// ESRenderer.h +// Final +// +// Created by David Nolen on 10/18/09. +// Copyright David Nolen 2009. All rights reserved. +// + +#import + +#import +#import + +@protocol ESRenderer + +- (void) render; +- (BOOL) resizeFromLayer:(CAEAGLLayer *)layer; + +@end diff --git a/Final/Classes/FinalAppDelegate.h b/Final/Classes/FinalAppDelegate.h new file mode 100644 index 0000000..fede19c --- /dev/null +++ b/Final/Classes/FinalAppDelegate.h @@ -0,0 +1,22 @@ +// +// FinalAppDelegate.h +// Final +// +// Created by David Nolen on 10/18/09. +// Copyright David Nolen 2009. All rights reserved. +// + +#import + +@class EAGLView; + +@interface FinalAppDelegate : NSObject { + UIWindow *window; + EAGLView *glView; +} + +@property (nonatomic, retain) IBOutlet UIWindow *window; +@property (nonatomic, retain) IBOutlet EAGLView *glView; + +@end + diff --git a/Final/Classes/FinalAppDelegate.m b/Final/Classes/FinalAppDelegate.m new file mode 100644 index 0000000..2470c67 --- /dev/null +++ b/Final/Classes/FinalAppDelegate.m @@ -0,0 +1,45 @@ +// +// FinalAppDelegate.m +// Final +// +// Created by David Nolen on 10/18/09. +// Copyright David Nolen 2009. All rights reserved. +// + +#import "FinalAppDelegate.h" +#import "EAGLView.h" + +@implementation FinalAppDelegate + +@synthesize window; +@synthesize glView; + +- (void) applicationDidFinishLaunching:(UIApplication *)application +{ + [glView startAnimation]; +} + +- (void) applicationWillResignActive:(UIApplication *)application +{ + [glView stopAnimation]; +} + +- (void) applicationDidBecomeActive:(UIApplication *)application +{ + [glView startAnimation]; +} + +- (void)applicationWillTerminate:(UIApplication *)application +{ + [glView stopAnimation]; +} + +- (void) dealloc +{ + [window release]; + [glView release]; + + [super dealloc]; +} + +@end diff --git a/Final/Final-Info.plist b/Final/Final-Info.plist new file mode 100644 index 0000000..3289444 --- /dev/null +++ b/Final/Final-Info.plist @@ -0,0 +1,30 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleDisplayName + ${PRODUCT_NAME} + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIconFile + + CFBundleIdentifier + com.yourcompany.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + APPL + CFBundleSignature + ???? + CFBundleVersion + 1.0 + LSRequiresIPhoneOS + + NSMainNibFile + MainWindow + + diff --git a/Final/Final.xcodeproj/project.pbxproj b/Final/Final.xcodeproj/project.pbxproj new file mode 100755 index 0000000..bcc2f22 --- /dev/null +++ b/Final/Final.xcodeproj/project.pbxproj @@ -0,0 +1,282 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 45; + objects = { + +/* Begin PBXBuildFile section */ + 1D3623260D0F684500981E51 /* FinalAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D3623250D0F684500981E51 /* FinalAppDelegate.m */; }; + 1D60589B0D05DD56006BFB54 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; }; + 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; }; + 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; }; + 2514C27210084DB100A42282 /* ES1Renderer.m in Sources */ = {isa = PBXBuildFile; fileRef = 2514C26E10084DB100A42282 /* ES1Renderer.m */; }; + 2514C27310084DB100A42282 /* ES2Renderer.m in Sources */ = {isa = PBXBuildFile; fileRef = 2514C27010084DB100A42282 /* ES2Renderer.m */; }; + 2514C27B10084DCA00A42282 /* Shader.fsh in Resources */ = {isa = PBXBuildFile; fileRef = 2514C27910084DCA00A42282 /* Shader.fsh */; }; + 2514C27C10084DCA00A42282 /* Shader.vsh in Resources */ = {isa = PBXBuildFile; fileRef = 2514C27A10084DCA00A42282 /* Shader.vsh */; }; + 28AD733F0D9D9553002E5188 /* MainWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 28AD733E0D9D9553002E5188 /* MainWindow.xib */; }; + 28FD14FE0DC6FC130079059D /* EAGLView.m in Sources */ = {isa = PBXBuildFile; fileRef = 28FD14FD0DC6FC130079059D /* EAGLView.m */; }; + 28FD15000DC6FC520079059D /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 28FD14FF0DC6FC520079059D /* OpenGLES.framework */; }; + 28FD15080DC6FC5B0079059D /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 28FD15070DC6FC5B0079059D /* QuartzCore.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 1D30AB110D05D00D00671497 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; + 1D3623240D0F684500981E51 /* FinalAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FinalAppDelegate.h; sourceTree = ""; }; + 1D3623250D0F684500981E51 /* FinalAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FinalAppDelegate.m; sourceTree = ""; }; + 1D6058910D05DD3D006BFB54 /* Final.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Final.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; + 2514C26D10084DB100A42282 /* ES1Renderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ES1Renderer.h; sourceTree = ""; }; + 2514C26E10084DB100A42282 /* ES1Renderer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ES1Renderer.m; sourceTree = ""; }; + 2514C26F10084DB100A42282 /* ES2Renderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ES2Renderer.h; sourceTree = ""; }; + 2514C27010084DB100A42282 /* ES2Renderer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ES2Renderer.m; sourceTree = ""; }; + 2514C27110084DB100A42282 /* ESRenderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ESRenderer.h; sourceTree = ""; }; + 2514C27910084DCA00A42282 /* Shader.fsh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.glsl; name = Shader.fsh; path = Shaders/Shader.fsh; sourceTree = ""; }; + 2514C27A10084DCA00A42282 /* Shader.vsh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.glsl; name = Shader.vsh; path = Shaders/Shader.vsh; sourceTree = ""; }; + 28AD733E0D9D9553002E5188 /* MainWindow.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MainWindow.xib; sourceTree = ""; }; + 28FD14FC0DC6FC130079059D /* EAGLView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EAGLView.h; sourceTree = ""; }; + 28FD14FD0DC6FC130079059D /* EAGLView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EAGLView.m; sourceTree = ""; }; + 28FD14FF0DC6FC520079059D /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; }; + 28FD15070DC6FC5B0079059D /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; + 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 32CA4F630368D1EE00C91783 /* Final_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Final_Prefix.pch; sourceTree = ""; }; + 8D1107310486CEB800E47090 /* Final-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "Final-Info.plist"; plistStructureDefinitionIdentifier = "com.apple.xcode.plist.structure-definition.iphone.info-plist"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 1D60588F0D05DD3D006BFB54 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */, + 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */, + 28FD15000DC6FC520079059D /* OpenGLES.framework in Frameworks */, + 28FD15080DC6FC5B0079059D /* QuartzCore.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 080E96DDFE201D6D7F000001 /* Classes */ = { + isa = PBXGroup; + children = ( + 2514C26D10084DB100A42282 /* ES1Renderer.h */, + 2514C26E10084DB100A42282 /* ES1Renderer.m */, + 2514C26F10084DB100A42282 /* ES2Renderer.h */, + 2514C27010084DB100A42282 /* ES2Renderer.m */, + 2514C27110084DB100A42282 /* ESRenderer.h */, + 28FD14FC0DC6FC130079059D /* EAGLView.h */, + 28FD14FD0DC6FC130079059D /* EAGLView.m */, + 1D3623240D0F684500981E51 /* FinalAppDelegate.h */, + 1D3623250D0F684500981E51 /* FinalAppDelegate.m */, + ); + path = Classes; + sourceTree = ""; + }; + 19C28FACFE9D520D11CA2CBB /* Products */ = { + isa = PBXGroup; + children = ( + 1D6058910D05DD3D006BFB54 /* Final.app */, + ); + name = Products; + sourceTree = ""; + }; + 2514C27610084DB600A42282 /* Shaders */ = { + isa = PBXGroup; + children = ( + 2514C27910084DCA00A42282 /* Shader.fsh */, + 2514C27A10084DCA00A42282 /* Shader.vsh */, + ); + name = Shaders; + sourceTree = ""; + }; + 29B97314FDCFA39411CA2CEA /* CustomTemplate */ = { + isa = PBXGroup; + children = ( + 080E96DDFE201D6D7F000001 /* Classes */, + 2514C27610084DB600A42282 /* Shaders */, + 29B97315FDCFA39411CA2CEA /* Other Sources */, + 29B97317FDCFA39411CA2CEA /* Resources */, + 29B97323FDCFA39411CA2CEA /* Frameworks */, + 19C28FACFE9D520D11CA2CBB /* Products */, + ); + name = CustomTemplate; + sourceTree = ""; + }; + 29B97315FDCFA39411CA2CEA /* Other Sources */ = { + isa = PBXGroup; + children = ( + 32CA4F630368D1EE00C91783 /* Final_Prefix.pch */, + 29B97316FDCFA39411CA2CEA /* main.m */, + ); + name = "Other Sources"; + sourceTree = ""; + }; + 29B97317FDCFA39411CA2CEA /* Resources */ = { + isa = PBXGroup; + children = ( + 28AD733E0D9D9553002E5188 /* MainWindow.xib */, + 8D1107310486CEB800E47090 /* Final-Info.plist */, + ); + name = Resources; + sourceTree = ""; + }; + 29B97323FDCFA39411CA2CEA /* Frameworks */ = { + isa = PBXGroup; + children = ( + 28FD15070DC6FC5B0079059D /* QuartzCore.framework */, + 28FD14FF0DC6FC520079059D /* OpenGLES.framework */, + 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */, + 1D30AB110D05D00D00671497 /* Foundation.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 1D6058900D05DD3D006BFB54 /* Final */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "Final" */; + buildPhases = ( + 1D60588D0D05DD3D006BFB54 /* Resources */, + 1D60588E0D05DD3D006BFB54 /* Sources */, + 1D60588F0D05DD3D006BFB54 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Final; + productName = Final; + productReference = 1D6058910D05DD3D006BFB54 /* Final.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 29B97313FDCFA39411CA2CEA /* Project object */ = { + isa = PBXProject; + buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "Final" */; + compatibilityVersion = "Xcode 3.1"; + hasScannedForEncodings = 1; + mainGroup = 29B97314FDCFA39411CA2CEA /* CustomTemplate */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 1D6058900D05DD3D006BFB54 /* Final */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 1D60588D0D05DD3D006BFB54 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 2514C27B10084DCA00A42282 /* Shader.fsh in Resources */, + 2514C27C10084DCA00A42282 /* Shader.vsh in Resources */, + 28AD733F0D9D9553002E5188 /* MainWindow.xib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 1D60588E0D05DD3D006BFB54 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 1D60589B0D05DD56006BFB54 /* main.m in Sources */, + 1D3623260D0F684500981E51 /* FinalAppDelegate.m in Sources */, + 28FD14FE0DC6FC130079059D /* EAGLView.m in Sources */, + 2514C27210084DB100A42282 /* ES1Renderer.m in Sources */, + 2514C27310084DB100A42282 /* ES2Renderer.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 1D6058940D05DD3E006BFB54 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + COPY_PHASE_STRIP = NO; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = Final_Prefix.pch; + "GCC_THUMB_SUPPORT[arch=armv6]" = ""; + INFOPLIST_FILE = "Final-Info.plist"; + PRODUCT_NAME = Final; + }; + name = Debug; + }; + 1D6058950D05DD3E006BFB54 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + COPY_PHASE_STRIP = YES; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = Final_Prefix.pch; + "GCC_THUMB_SUPPORT[arch=armv6]" = ""; + INFOPLIST_FILE = "Final-Info.plist"; + PRODUCT_NAME = Final; + }; + name = Release; + }; + C01FCF4F08A954540054247B /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + GCC_C_LANGUAGE_STANDARD = c99; + GCC_PREPROCESSOR_DEFINITIONS = DEBUG; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + PREBINDING = NO; + SDKROOT = iphoneos3.1.2; + }; + name = Debug; + }; + C01FCF5008A954540054247B /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + GCC_C_LANGUAGE_STANDARD = c99; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + PREBINDING = NO; + SDKROOT = iphoneos3.1.2; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "Final" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1D6058940D05DD3E006BFB54 /* Debug */, + 1D6058950D05DD3E006BFB54 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + C01FCF4E08A954540054247B /* Build configuration list for PBXProject "Final" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C01FCF4F08A954540054247B /* Debug */, + C01FCF5008A954540054247B /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; +} diff --git a/Final/Final_Prefix.pch b/Final/Final_Prefix.pch new file mode 100644 index 0000000..7f2b77f --- /dev/null +++ b/Final/Final_Prefix.pch @@ -0,0 +1,14 @@ +// +// Prefix header for all source files of the 'Final' target in the 'Final' 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/Final/MainWindow.xib b/Final/MainWindow.xib new file mode 100644 index 0000000..17356ec --- /dev/null +++ b/Final/MainWindow.xib @@ -0,0 +1,231 @@ + + + + 784 + 10A394 + 732 + 1027.1 + 430.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 60 + + + YES + + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + YES + + YES + + + YES + + + + YES + + IBFilesOwner + + + IBFirstResponder + + + + + 1316 + + YES + + + 1298 + {320, 480} + + + 3 + MQA + + NO + + + + {320, 480} + + + 1 + MSAxIDEAA + + NO + YES + + + + + YES + + + delegate + + + + 4 + + + + window + + + + 5 + + + + glView + + + + 9 + + + + + YES + + 0 + + + + + + 2 + + + YES + + + + + + -1 + + + File's Owner + + + 3 + + + + + 8 + + + + + -2 + + + + + + + YES + + YES + -1.CustomClassName + -2.CustomClassName + 2.IBAttributePlaceholdersKey + 2.IBEditorWindowLastContentRect + 2.IBPluginDependency + 3.CustomClassName + 3.IBPluginDependency + 8.CustomClassName + 8.IBPluginDependency + + + YES + UIApplication + UIResponder + + YES + + + YES + + + {{500, 343}, {320, 480}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + FinalAppDelegate + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + EAGLView + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + YES + + + YES + + + + + YES + + + YES + + + + 9 + + + + YES + + EAGLView + UIView + + IBProjectSource + Classes/EAGLView.h + + + + FinalAppDelegate + NSObject + + YES + + YES + glView + window + + + YES + EAGLView + UIWindow + + + + IBProjectSource + Classes/FinalAppDelegate.h + + + + + 0 + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + Final.xcodeproj + 3 + 3.1 + + diff --git a/Final/Shaders/Shader.fsh b/Final/Shaders/Shader.fsh new file mode 100644 index 0000000..2559872 --- /dev/null +++ b/Final/Shaders/Shader.fsh @@ -0,0 +1,14 @@ +// +// Shader.fsh +// Final +// +// Created by David Nolen on 10/18/09. +// Copyright David Nolen 2009. All rights reserved. +// + +varying lowp vec4 colorVarying; + +void main() +{ + gl_FragColor = colorVarying; +} diff --git a/Final/Shaders/Shader.vsh b/Final/Shaders/Shader.vsh new file mode 100644 index 0000000..1df62f6 --- /dev/null +++ b/Final/Shaders/Shader.vsh @@ -0,0 +1,22 @@ +// +// Shader.vsh +// Final +// +// Created by David Nolen on 10/18/09. +// Copyright David Nolen 2009. All rights reserved. +// + +attribute vec4 position; +attribute vec4 color; + +varying vec4 colorVarying; + +uniform float translate; + +void main() +{ + gl_Position = position; + gl_Position.y += sin(translate) / 2.0; + + colorVarying = color; +} diff --git a/Final/build/Final.build/Final.pbxindex/categories.pbxbtree b/Final/build/Final.build/Final.pbxindex/categories.pbxbtree new file mode 100644 index 0000000..eafb872 Binary files /dev/null and b/Final/build/Final.build/Final.pbxindex/categories.pbxbtree differ diff --git a/Final/build/Final.build/Final.pbxindex/cdecls.pbxbtree b/Final/build/Final.build/Final.pbxindex/cdecls.pbxbtree new file mode 100644 index 0000000..6964195 Binary files /dev/null and b/Final/build/Final.build/Final.pbxindex/cdecls.pbxbtree differ diff --git a/Final/build/Final.build/Final.pbxindex/decls.pbxbtree b/Final/build/Final.build/Final.pbxindex/decls.pbxbtree new file mode 100644 index 0000000..c99c73f Binary files /dev/null and b/Final/build/Final.build/Final.pbxindex/decls.pbxbtree differ diff --git a/Final/build/Final.build/Final.pbxindex/files.pbxbtree b/Final/build/Final.build/Final.pbxindex/files.pbxbtree new file mode 100644 index 0000000..4858655 Binary files /dev/null and b/Final/build/Final.build/Final.pbxindex/files.pbxbtree differ diff --git a/Final/build/Final.build/Final.pbxindex/imports.pbxbtree b/Final/build/Final.build/Final.pbxindex/imports.pbxbtree new file mode 100644 index 0000000..b076ab9 Binary files /dev/null and b/Final/build/Final.build/Final.pbxindex/imports.pbxbtree differ diff --git a/Final/build/Final.build/Final.pbxindex/pbxindex.header b/Final/build/Final.build/Final.pbxindex/pbxindex.header new file mode 100644 index 0000000..1a0a2a6 Binary files /dev/null and b/Final/build/Final.build/Final.pbxindex/pbxindex.header differ diff --git a/Final/build/Final.build/Final.pbxindex/protocols.pbxbtree b/Final/build/Final.build/Final.pbxindex/protocols.pbxbtree new file mode 100644 index 0000000..aabb448 Binary files /dev/null and b/Final/build/Final.build/Final.pbxindex/protocols.pbxbtree differ diff --git a/Final/build/Final.build/Final.pbxindex/refs.pbxbtree b/Final/build/Final.build/Final.pbxindex/refs.pbxbtree new file mode 100644 index 0000000..0af9ceb Binary files /dev/null and b/Final/build/Final.build/Final.pbxindex/refs.pbxbtree differ diff --git a/Final/build/Final.build/Final.pbxindex/strings.pbxstrings/control b/Final/build/Final.build/Final.pbxindex/strings.pbxstrings/control new file mode 100644 index 0000000..107c86c Binary files /dev/null and b/Final/build/Final.build/Final.pbxindex/strings.pbxstrings/control differ diff --git a/Final/build/Final.build/Final.pbxindex/strings.pbxstrings/strings b/Final/build/Final.build/Final.pbxindex/strings.pbxstrings/strings new file mode 100644 index 0000000..52f8d60 Binary files /dev/null and b/Final/build/Final.build/Final.pbxindex/strings.pbxstrings/strings differ diff --git a/Final/build/Final.build/Final.pbxindex/subclasses.pbxbtree b/Final/build/Final.build/Final.pbxindex/subclasses.pbxbtree new file mode 100644 index 0000000..f01d10a Binary files /dev/null and b/Final/build/Final.build/Final.pbxindex/subclasses.pbxbtree differ diff --git a/Final/build/Final.build/Final.pbxindex/symbols0.pbxsymbols b/Final/build/Final.build/Final.pbxindex/symbols0.pbxsymbols new file mode 100644 index 0000000..99877d7 Binary files /dev/null and b/Final/build/Final.build/Final.pbxindex/symbols0.pbxsymbols differ diff --git a/Final/main.m b/Final/main.m new file mode 100644 index 0000000..5677bd7 --- /dev/null +++ b/Final/main.m @@ -0,0 +1,17 @@ +// +// main.m +// Final +// +// Created by David Nolen on 10/18/09. +// Copyright David Nolen 2009. 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; +}