nuclear@2: #include nuclear@2: #import nuclear@0: #import "viewctl.h" nuclear@2: #include "istereo.h" nuclear@0: nuclear@0: @interface ViewController () { nuclear@0: EAGLContext *ctx; nuclear@16: float pixel_scale, max_pixel_scale, low_pixel_scale; nuclear@1: nuclear@5: GLKView *glview; nuclear@1: ADBannerView *ad; nuclear@1: BOOL ad_visible; nuclear@16: BOOL ad_ready; nuclear@16: nuclear@16: int ios_ver_major, ios_ver_minor; nuclear@16: BOOL landscape_swap; nuclear@0: } nuclear@0: nuclear@1: nuclear@1: - (void)create_ad; nuclear@2: - (void)show_ad; nuclear@2: - (void)hide_ad; nuclear@1: nuclear@1: - (void)init_gl; nuclear@1: - (void)destroy_gl; nuclear@16: nuclear@16: - (void)enable_retina; nuclear@16: - (void)disable_retina; nuclear@16: - (BOOL)is_retina_enabled; nuclear@16: - (BOOL)have_retina; nuclear@0: @end nuclear@0: nuclear@16: static ViewController *view_ctl; nuclear@16: static BOOL ad_show_requested; nuclear@16: nuclear@16: void ad_banner_show(void) nuclear@16: { nuclear@16: if(view_ctl) { nuclear@16: [view_ctl show_ad]; nuclear@16: } nuclear@16: ad_show_requested = YES; nuclear@16: } nuclear@16: nuclear@16: void ad_banner_hide(void) nuclear@16: { nuclear@16: if(view_ctl) { nuclear@16: [view_ctl hide_ad]; nuclear@16: } nuclear@16: ad_show_requested = NO; nuclear@16: } nuclear@16: nuclear@16: void use_retina_res(int enable) nuclear@16: { nuclear@16: if(enable) { nuclear@16: [view_ctl enable_retina]; nuclear@16: } else { nuclear@16: [view_ctl disable_retina]; nuclear@16: } nuclear@16: } nuclear@16: nuclear@16: int using_retina_res(void) nuclear@16: { nuclear@16: return [view_ctl is_retina_enabled] ? 1 : 0; nuclear@16: } nuclear@16: nuclear@16: int have_retina(void) nuclear@16: { nuclear@16: if(view_ctl) { nuclear@16: return [view_ctl have_retina] ? 1 : 0; nuclear@16: } nuclear@16: return 0; nuclear@16: } nuclear@16: nuclear@16: nuclear@0: @implementation ViewController nuclear@0: nuclear@0: - (void)viewDidLoad nuclear@0: { nuclear@0: [super viewDidLoad]; nuclear@0: nuclear@16: view_ctl = self; nuclear@16: nuclear@16: NSString *str = [[UIDevice currentDevice] systemVersion]; nuclear@16: if(sscanf(str.UTF8String, "%d.%d", &ios_ver_major, &ios_ver_minor) != 2) { nuclear@16: ios_ver_major = 8; nuclear@16: ios_ver_minor = 0; nuclear@16: } nuclear@16: printf("iOS version: %d.%d\n", ios_ver_major, ios_ver_minor); nuclear@16: nuclear@16: // in iOS versions before 8, the view size and event coordinates are swapped in landscape nuclear@16: if((int)NSFoundationVersionNumber < NSFoundationVersionNumber_iOS_8_0) { nuclear@16: assert(ios_ver_major < 8); nuclear@16: landscape_swap = YES; nuclear@16: } else { nuclear@16: landscape_swap = NO; nuclear@16: } nuclear@3: nuclear@0: self->ctx = [[EAGLContext alloc] initWithAPI: kEAGLRenderingAPIOpenGLES2]; nuclear@0: if(!self->ctx) { nuclear@0: NSLog(@"Failed to create OpenGL ES 2.0 context"); nuclear@0: } nuclear@0: nuclear@5: glview = (GLKView*)self.view; nuclear@5: glview.context = self->ctx; nuclear@5: glview.drawableDepthFormat = GLKViewDrawableDepthFormat24; nuclear@0: nuclear@5: if([glview respondsToSelector: NSSelectorFromString(@"contentScaleFactor")]) { nuclear@16: max_pixel_scale = [[UIScreen mainScreen] scale]; nuclear@16: printf("max pixel scale: %g\n", pixel_scale); nuclear@3: } else { nuclear@16: max_pixel_scale = 1.0f; nuclear@3: } nuclear@16: low_pixel_scale = 1.0f; nuclear@16: [self disable_retina]; // default to non-retina mode nuclear@3: nuclear@1: [self create_ad]; nuclear@1: nuclear@1: [self init_gl]; nuclear@0: } nuclear@0: nuclear@0: - (void)dealloc nuclear@0: { nuclear@16: view_ctl = nil; nuclear@16: nuclear@1: [self destroy_gl]; nuclear@0: nuclear@0: if([EAGLContext currentContext] == self->ctx) { nuclear@0: [EAGLContext setCurrentContext: nil]; nuclear@0: } nuclear@0: } nuclear@0: nuclear@0: - (void)didReceiveMemoryWarning nuclear@0: { nuclear@0: [super didReceiveMemoryWarning]; nuclear@0: nuclear@0: if([self isViewLoaded] && ([[self view] window] == nil)) { nuclear@0: self.view = nil; nuclear@0: nuclear@1: [self destroy_gl]; nuclear@0: nuclear@0: if([EAGLContext currentContext] == self->ctx) { nuclear@0: [EAGLContext setCurrentContext: nil]; nuclear@0: } nuclear@0: self->ctx = nil; nuclear@0: } nuclear@0: nuclear@0: // Dispose of any resources that can be recreated. nuclear@0: } nuclear@0: nuclear@0: - (BOOL)prefersStatusBarHidden nuclear@0: { nuclear@0: return YES; nuclear@0: } nuclear@0: nuclear@4: - (BOOL)shouldAutorotate nuclear@4: { nuclear@4: return YES; nuclear@4: } nuclear@4: nuclear@4: - (UIInterfaceOrientationMask)supportedInterfaceOrientations nuclear@4: { nuclear@4: return UIInterfaceOrientationMaskLandscape; nuclear@4: //return UIInterfaceOrientationMaskAll; nuclear@4: } nuclear@4: nuclear@1: - (void)create_ad nuclear@1: { nuclear@1: ad = [[ADBannerView alloc] initWithAdType: ADAdTypeBanner]; nuclear@16: CGRect rect = ad.frame; nuclear@16: rect.size.width = glview.bounds.size.width; nuclear@16: ad.frame = rect; nuclear@1: [ad setAutoresizingMask: UIViewAutoresizingFlexibleWidth]; nuclear@16: nuclear@2: ad_visible = YES; nuclear@16: ad_ready = NO; nuclear@2: [self hide_ad]; nuclear@5: [glview addSubview: ad]; nuclear@1: ad.delegate = self; nuclear@1: } nuclear@1: nuclear@2: - (void)show_ad nuclear@1: { nuclear@16: if(!ad_visible && ad_ready) { nuclear@1: CGRect rect = ad.frame; nuclear@1: rect.origin.y = 0; nuclear@1: ad.frame = rect; nuclear@1: ad_visible = YES; nuclear@1: } nuclear@1: } nuclear@1: nuclear@2: - (void)hide_ad nuclear@2: { nuclear@2: if(ad_visible) { nuclear@2: ad.frame = CGRectOffset(ad.frame, 0, -ad.frame.size.height); nuclear@2: ad_visible = NO; nuclear@2: } nuclear@2: } nuclear@2: nuclear@2: - (void)init_gl nuclear@2: { nuclear@2: [EAGLContext setCurrentContext: self->ctx]; nuclear@2: nuclear@2: if(init() == -1) { nuclear@2: NSLog(@"app initialization failed"); nuclear@2: exit(0); nuclear@2: } nuclear@2: } nuclear@2: nuclear@2: - (void)destroy_gl nuclear@2: { nuclear@2: cleanup(); nuclear@2: [EAGLContext setCurrentContext: self->ctx]; nuclear@2: } nuclear@2: nuclear@16: - (void)enable_retina nuclear@16: { nuclear@16: pixel_scale = max_pixel_scale; nuclear@16: printf("enable_retina setting pixel scale: %g\n", pixel_scale); nuclear@16: glview.contentScaleFactor = pixel_scale; nuclear@16: [glview setNeedsLayout]; nuclear@16: } nuclear@16: nuclear@16: - (void)disable_retina nuclear@16: { nuclear@16: pixel_scale = low_pixel_scale; nuclear@16: printf("disable_retina setting pixel scale: %g\n", pixel_scale); nuclear@16: glview.contentScaleFactor = pixel_scale; nuclear@16: [glview setNeedsLayout]; nuclear@16: } nuclear@16: nuclear@16: - (BOOL)is_retina_enabled nuclear@16: { nuclear@16: return pixel_scale > low_pixel_scale; nuclear@16: } nuclear@16: nuclear@16: - (BOOL)have_retina nuclear@16: { nuclear@16: return max_pixel_scale > 1.0; nuclear@16: } nuclear@16: nuclear@2: nuclear@2: - (void)glkView: (GLKView*)view drawInRect: (CGRect)rect nuclear@2: { nuclear@2: redraw(); nuclear@2: } nuclear@2: nuclear@2: - (void)viewDidLayoutSubviews nuclear@2: { nuclear@2: CGRect rect = self.view.frame; nuclear@3: int xsz = rect.size.width * pixel_scale; nuclear@3: int ysz = rect.size.height * pixel_scale; nuclear@16: nuclear@16: BOOL is_landscape = UIInterfaceOrientationIsLandscape([UIApplication sharedApplication].statusBarOrientation); nuclear@16: if(is_landscape && landscape_swap) { nuclear@16: int tmp = xsz; nuclear@16: xsz = ysz; nuclear@16: ysz = tmp; nuclear@16: } nuclear@16: nuclear@3: reshape(xsz, ysz); nuclear@3: printf("viewport %dx%d (scale: %g)\n", xsz, ysz, pixel_scale); nuclear@2: } nuclear@2: nuclear@6: - (void)touchesBegan: (NSSet*)touches withEvent: (UIEvent*)event nuclear@6: { nuclear@6: UITouch *touch = [touches anyObject]; nuclear@16: CGPoint pt = [touch locationInView: glview]; nuclear@16: int x = (int)(pt.x * pixel_scale); nuclear@16: int y = (int)(pt.y * pixel_scale); nuclear@16: nuclear@16: mouse_button(0, 1, x, y); nuclear@6: } nuclear@6: nuclear@6: - (void)touchesMoved: (NSSet*)touches withEvent: (UIEvent*)event nuclear@6: { nuclear@6: UITouch *touch = [touches anyObject]; nuclear@16: CGPoint pt = [touch locationInView: glview]; nuclear@16: int x = (int)(pt.x * pixel_scale); nuclear@16: int y = (int)(pt.y * pixel_scale); nuclear@16: nuclear@16: mouse_motion(x, y); nuclear@6: } nuclear@6: nuclear@6: - (void)touchesEnded: (NSSet*)touches withEvent: (UIEvent*)event nuclear@6: { nuclear@6: UITouch *touch = [touches anyObject]; nuclear@16: CGPoint pt = [touch locationInView: glview]; nuclear@16: int x = (int)(pt.x * pixel_scale); nuclear@16: int y = (int)(pt.y * pixel_scale); nuclear@16: nuclear@16: mouse_button(0, 0, x, y); nuclear@16: printf("touch release %d %d\n", x, y); nuclear@6: } nuclear@6: nuclear@6: - (void)touchesCancelled: (NSSet*)touches withEvent: (UIEvent*)event nuclear@6: { nuclear@6: UITouch *touch = [touches anyObject]; nuclear@16: CGPoint pt = [touch locationInView: glview]; nuclear@16: int x = (int)(pt.x * pixel_scale); nuclear@16: int y = (int)(pt.y * pixel_scale); nuclear@16: nuclear@16: mouse_button(0, 0, x, y); nuclear@6: } nuclear@6: nuclear@2: // ADBannerDelegate functions nuclear@2: nuclear@2: - (void)bannerViewDidLoadAd: (ADBannerView*)banner nuclear@2: { nuclear@16: ad_ready = YES; nuclear@16: if(ad_show_requested) { nuclear@16: [self show_ad]; nuclear@16: } nuclear@2: } nuclear@2: nuclear@1: - (void)bannerView: (ADBannerView*)banner didFailToReceiveAdWithError: (NSError*)error nuclear@1: { nuclear@16: ad_ready = NO; nuclear@2: [self hide_ad]; nuclear@1: nuclear@1: NSLog(@"Failed to retrieve ad"); nuclear@1: } nuclear@1: nuclear@1: nuclear@0: @end /* implementation ViewController */