sgl

annotate src/wsys_ios.m @ 39:e1a27aa24956

fixed broken build
author John Tsiombikas <nuclear@mutantstargoat.com>
date Wed, 27 Jun 2012 05:54:57 +0300
parents b3374e30361c
children f7de32814f34
rev   line source
nuclear@39 1 /* SimplyGL window system module for iOS */
nuclear@39 2 /* mac-framework: -framework UIKit */
nuclear@39 3
nuclear@39 4 #include "config.h"
nuclear@39 5
nuclear@39 6 #ifdef USE_WSYS_MODULE_IOS
nuclear@39 7
nuclear@36 8 #include <assert.h>
nuclear@36 9 #import <UIKit/UIKit.h>
nuclear@37 10 #import <QuartzCore/QuartzCore.h>
nuclear@36 11 #include <OpenGLES/ES2/gl.h>
nuclear@36 12 #include <OpenGLES/ES2/glext.h>
nuclear@36 13
nuclear@37 14 @interface SGLView : UIView {
nuclear@36 15 @private
nuclear@36 16 BOOL active;
nuclear@36 17 BOOL use_disp_link;
nuclear@36 18 NSInteger frame_interval;
nuclear@36 19 id disp_link;
nuclear@36 20 NSTimer *anim_timer;
nuclear@36 21 EAGLContext *ctx;
nuclear@36 22 unsigned int fbo, rbuf_color, rbuf_depth;
nuclear@36 23 }
nuclear@36 24
nuclear@37 25 @property (readonly, nonatomic, getter=isAnimating) BOOL active;
nuclear@37 26 @property (nonatomic) NSInteger frame_interval;
nuclear@37 27
nuclear@36 28 -(void)start_anim;
nuclear@36 29 -(void)stop_anim;
nuclear@37 30 -(void)drawView: (id)sender;
nuclear@36 31 @end
nuclear@36 32
nuclear@36 33 @interface SGLDelegate : NSObject <UIApplicationDelegate> {
nuclear@36 34 UIWindow *win;
nuclear@37 35 SGLView *view;
nuclear@36 36 }
nuclear@37 37
nuclear@37 38 @property (nonatomic, retain) IBOutlet UIWindow *win;
nuclear@37 39 @property (nonatomic, retain) IBOutlet SGLView *view;
nuclear@36 40 @end
nuclear@36 41
nuclear@36 42
nuclear@36 43
nuclear@39 44 static int init(void);
nuclear@39 45 static void shutdown(void);
nuclear@39 46
nuclear@39 47 /* video mode switching */
nuclear@39 48 static int set_vidmode(int xsz, int ysz);
nuclear@39 49 static int get_vidmode(int *xsz, int *ysz);
nuclear@39 50
nuclear@39 51 /* create/destroy windows */
nuclear@39 52 static int create_window(int xsz, int ysz, unsigned int flags);
nuclear@39 53 static void close_window(int wid);
nuclear@39 54
nuclear@39 55 /* window management */
nuclear@39 56 static int set_active(int wid);
nuclear@39 57 static int set_title(const char *str);
nuclear@39 58 static void redisplay(void);
nuclear@39 59 static void swap_buffers(void);
nuclear@39 60
nuclear@39 61 static int get_modifiers(void);
nuclear@39 62
nuclear@39 63 /* event handling and friends */
nuclear@39 64 static void set_event(int idx, int enable);
nuclear@39 65 static int process_events(void);
nuclear@39 66
nuclear@39 67
nuclear@39 68 static struct wsys_module ws = {
nuclear@39 69 "ios", 0,
nuclear@39 70 init,
nuclear@39 71 shutdown,
nuclear@39 72 set_vidmode,
nuclear@39 73 get_vidmode,
nuclear@39 74 create_window,
nuclear@39 75 close_window,
nuclear@39 76 set_active,
nuclear@39 77 set_title,
nuclear@39 78 redisplay,
nuclear@39 79 swap_buffers,
nuclear@39 80 get_modifiers,
nuclear@39 81 set_event,
nuclear@39 82 process_events,
nuclear@39 83 0
nuclear@39 84 };
nuclear@39 85
nuclear@39 86
nuclear@39 87 void sgl_register_ios(void)
nuclear@39 88 {
nuclear@39 89 sgl_register_module(&ws);
nuclear@39 90 }
nuclear@39 91
nuclear@39 92
nuclear@37 93 @implementation SGLView
nuclear@36 94
nuclear@37 95 @synthesize active;
nuclear@36 96 @dynamic frame_interval;
nuclear@36 97
nuclear@36 98 +(Class)layerClass
nuclear@36 99 {
nuclear@36 100 return [CAEAGLLayer class];
nuclear@36 101 }
nuclear@36 102
nuclear@39 103 /*The EAGL view is stored in the nib file. When it's unarchived it's sent -initWithCoder: */
nuclear@36 104 -(id)initWithCoder: (NSCoder*)coder
nuclear@36 105 {
nuclear@36 106 if((self = [super initWithCoder: coder])) {
nuclear@39 107 /* Get the layer */
nuclear@36 108 CAEAGLLayer *layer = (CAEAGLLayer*)self.layer;
nuclear@36 109
nuclear@39 110 /*self.contentScaleFactor = 2.0; */
nuclear@36 111
nuclear@36 112 layer.opaque = TRUE;
nuclear@36 113 layer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:
nuclear@36 114 [NSNumber numberWithBool: FALSE],
nuclear@36 115 kEAGLDrawablePropertyRetainedBacking, kEAGLColorFormatRGBA8,
nuclear@36 116 kEAGLDrawablePropertyColorFormat,
nuclear@36 117 nil];
nuclear@36 118
nuclear@36 119 ctx = [[EAGLContext alloc] initWithAPI: kEAGLRenderingAPIOpenGLES2];
nuclear@36 120 if(!ctx || ![EAGLContext setCurrentContext: ctx]) {
nuclear@36 121 [self release];
nuclear@36 122 return nil;
nuclear@36 123 }
nuclear@36 124
nuclear@39 125 /* initialize fbos etc... */
nuclear@36 126 glGenFramebuffers(1, &fbo);
nuclear@36 127 glBindFramebuffer(GL_FRAMEBUFFER, fbo);
nuclear@36 128
nuclear@36 129 glGenRenderbuffers(1, &rbuf_color);
nuclear@36 130 glBindRenderbuffer(GL_RENDERBUFFER, rbuf_color);
nuclear@36 131 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbuf_color);
nuclear@36 132
nuclear@36 133 glGenRenderbuffers(1, &rbuf_depth);
nuclear@36 134 glBindRenderbuffer(GL_RENDERBUFFER, rbuf_depth);
nuclear@36 135 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rbuf_depth);
nuclear@36 136 assert(glGetError() == GL_NO_ERROR);
nuclear@36 137
nuclear@37 138 active = FALSE;
nuclear@36 139 use_disp_link = FALSE;
nuclear@36 140 frame_interval = 1;
nuclear@36 141 disp_link = nil;
nuclear@36 142 anim_timer = nil;
nuclear@36 143
nuclear@39 144 /* A system version of 3.1 or greater is required to use CADisplayLink. The NSTimer */
nuclear@39 145 /* class is used as fallback when it isn't available. */
nuclear@36 146 NSString *req_ver = @"3.1";
nuclear@36 147 NSString *cur_ver = [[UIDevice currentDevice] systemVersion];
nuclear@37 148 if([cur_ver compare: req_ver options: NSNumericSearch] != NSOrderedAscending) {
nuclear@36 149 use_disp_link = TRUE;
nuclear@36 150 }
nuclear@36 151
nuclear@39 152 /*self.multipleTouchEnabled = 1; */
nuclear@36 153
nuclear@39 154 /* TODO call user init ? */
nuclear@36 155 }
nuclear@36 156
nuclear@36 157 return self;
nuclear@36 158 }
nuclear@36 159
nuclear@36 160 -(void)drawView: (id)sender
nuclear@36 161 {
nuclear@39 162 /* TODO call display */
nuclear@36 163 }
nuclear@36 164
nuclear@36 165 -(void)layoutSubviews
nuclear@36 166 {
nuclear@39 167 /* TODO call reshape */
nuclear@39 168 /* XXX originally call to renderer resizeFromLayer */
nuclear@39 169 /* XXX originally call to [self drawView: nil] */
nuclear@36 170 }
nuclear@36 171
nuclear@36 172 -(void)setAnimationFrameInterval: (NSInteger)interval
nuclear@36 173 {
nuclear@36 174 /* Frame interval defines how many display frames must pass
nuclear@36 175 * between each time the display link fires. The display
nuclear@36 176 * link will only fire 30 times a second when the frame
nuclear@36 177 * internal is two on a display that refreshes 60 times a
nuclear@36 178 * second. The default frame interval setting of one will
nuclear@36 179 * fire 60 times a second when the display refreshes at 60
nuclear@36 180 * times a second. A frame interval setting of less than
nuclear@36 181 * one results in undefined behavior.
nuclear@36 182 */
nuclear@36 183 if(interval >= 1) {
nuclear@36 184 frame_interval = frame_interval;
nuclear@36 185
nuclear@36 186 if(active)
nuclear@36 187 {
nuclear@37 188 [self stop_anim];
nuclear@37 189 [self start_anim];
nuclear@36 190 }
nuclear@36 191 }
nuclear@36 192 }
nuclear@36 193
nuclear@37 194 -(void)start_anim
nuclear@36 195 {
nuclear@36 196 if(!active) {
nuclear@36 197 if(use_disp_link) {
nuclear@39 198 /* CADisplayLink is API new to iPhone SDK 3.1. Compiling against earlier versions will result in a warning, but can be dismissed
nuclear@39 199 * if the system version runtime check for CADisplayLink exists in -initWithCoder:. The runtime check ensures this code will
nuclear@39 200 * not be called in system versions earlier than 3.1.
nuclear@39 201 */
nuclear@36 202
nuclear@36 203 disp_link = [NSClassFromString(@"CADisplayLink") displayLinkWithTarget: self
nuclear@36 204 selector: @selector(drawView:)];
nuclear@37 205 [disp_link setFrameInterval: frame_interval];
nuclear@37 206 [disp_link addToRunLoop: [NSRunLoop currentRunLoop] forMode: NSDefaultRunLoopMode];
nuclear@36 207 } else {
nuclear@36 208 anim_timer = [NSTimer scheduledTimerWithTimeInterval: (NSTimeInterval)((1.0 / 60.0) * frame_interval)
nuclear@36 209 target: self selector: @selector(drawView:) userInfo: nil
nuclear@36 210 repeats: TRUE];
nuclear@36 211 }
nuclear@36 212
nuclear@36 213 active = TRUE;
nuclear@36 214 }
nuclear@36 215 }
nuclear@36 216
nuclear@37 217 - (void)stop_anim
nuclear@36 218 {
nuclear@36 219 if(active) {
nuclear@36 220 if(use_disp_link) {
nuclear@36 221 [disp_link invalidate];
nuclear@36 222 disp_link = nil;
nuclear@36 223 } else {
nuclear@36 224 [anim_timer invalidate];
nuclear@36 225 anim_timer = nil;
nuclear@36 226 }
nuclear@36 227
nuclear@36 228 active = FALSE;
nuclear@36 229 }
nuclear@36 230 }
nuclear@36 231
nuclear@36 232 -(void)dealloc
nuclear@36 233 {
nuclear@39 234 /* XXX originally [renderer release]; */
nuclear@36 235 [super dealloc];
nuclear@36 236 }
nuclear@36 237 @end
nuclear@36 238
nuclear@36 239 @implementation SGLDelegate
nuclear@36 240
nuclear@36 241 @synthesize win;
nuclear@36 242 @synthesize view;
nuclear@36 243
nuclear@36 244 -(BOOL)application: (UIApplication*)app didFinishLaunchingWithOptions: (NSDictionary*)opt
nuclear@36 245 {
nuclear@37 246 [view start_anim];
nuclear@36 247 return YES;
nuclear@36 248 }
nuclear@36 249
nuclear@36 250 -(void)applicationWillResignActive: (UIApplication*)app
nuclear@36 251 {
nuclear@37 252 [view stop_anim];
nuclear@36 253 }
nuclear@36 254
nuclear@36 255 -(void)applicationDidBecomeActive: (UIApplication*)app
nuclear@36 256 {
nuclear@37 257 [view start_anim];
nuclear@36 258 }
nuclear@36 259
nuclear@36 260 -(void)applicationWillTerminate: (UIApplication*)app
nuclear@36 261 {
nuclear@37 262 [view stop_anim];
nuclear@36 263 }
nuclear@36 264
nuclear@36 265 -(void)dealloc
nuclear@36 266 {
nuclear@36 267 [win release];
nuclear@36 268 [view release];
nuclear@36 269 [super dealloc];
nuclear@36 270 }
nuclear@36 271 @end
nuclear@39 272
nuclear@39 273
nuclear@39 274
nuclear@39 275 static int init(void)
nuclear@39 276 {
nuclear@39 277 return -1;
nuclear@39 278 }
nuclear@39 279
nuclear@39 280 static void shutdown(void)
nuclear@39 281 {
nuclear@39 282 }
nuclear@39 283
nuclear@39 284 /* video mode switching */
nuclear@39 285 static int set_vidmode(int xsz, int ysz)
nuclear@39 286 {
nuclear@39 287 return -1;
nuclear@39 288 }
nuclear@39 289
nuclear@39 290 static int get_vidmode(int *xsz, int *ysz)
nuclear@39 291 {
nuclear@39 292 return -1;
nuclear@39 293 }
nuclear@39 294
nuclear@39 295 /* create/destroy windows */
nuclear@39 296 static int create_window(int xsz, int ysz, unsigned int flags)
nuclear@39 297 {
nuclear@39 298 return -1;
nuclear@39 299 }
nuclear@39 300
nuclear@39 301 static void close_window(int wid)
nuclear@39 302 {
nuclear@39 303 }
nuclear@39 304
nuclear@39 305 /* window management */
nuclear@39 306 static int set_active(int wid)
nuclear@39 307 {
nuclear@39 308 return -1;
nuclear@39 309 }
nuclear@39 310
nuclear@39 311 static int set_title(const char *str)
nuclear@39 312 {
nuclear@39 313 return -1;
nuclear@39 314 }
nuclear@39 315
nuclear@39 316 static void redisplay(void)
nuclear@39 317 {
nuclear@39 318 }
nuclear@39 319
nuclear@39 320 static void swap_buffers(void)
nuclear@39 321 {
nuclear@39 322 }
nuclear@39 323
nuclear@39 324 static int get_modifiers(void)
nuclear@39 325 {
nuclear@39 326 return 0;
nuclear@39 327 }
nuclear@39 328
nuclear@39 329 /* event handling and friends */
nuclear@39 330 static void set_event(int idx, int enable)
nuclear@39 331 {
nuclear@39 332 }
nuclear@39 333
nuclear@39 334 static int process_events(void)
nuclear@39 335 {
nuclear@39 336 return -1;
nuclear@39 337 }
nuclear@39 338
nuclear@39 339
nuclear@39 340
nuclear@39 341
nuclear@39 342
nuclear@39 343 /* only compile the following if we're building in xcode and we
nuclear@39 344 * don't have generated modules.c file
nuclear@39 345 */
nuclear@39 346 #ifdef XCODE_BUILD
nuclear@39 347 @interface sgl : NSObject
nuclear@39 348 /* XXX no need for init yet... */
nuclear@39 349 @end
nuclear@39 350
nuclear@39 351 @implementation sgl
nuclear@39 352
nuclear@39 353 - (id)init
nuclear@39 354 {
nuclear@39 355 self = [super init];
nuclear@39 356 if(self) {
nuclear@39 357 /* XXX Initialization code here. */
nuclear@39 358 }
nuclear@39 359 return self;
nuclear@39 360 }
nuclear@39 361
nuclear@39 362 @end
nuclear@39 363
nuclear@39 364 void sgl_modules_init(void)
nuclear@39 365 {
nuclear@39 366 sgl_register_uikit();
nuclear@39 367 }
nuclear@39 368
nuclear@39 369 #endif /* XCODE_BUILD */
nuclear@39 370
nuclear@39 371
nuclear@39 372 #else
nuclear@39 373 int sgl_wsys_ios_silence_the_fucking_empty_file_warnings;
nuclear@39 374 #endif /* USE_WSYS_MODULE_IOS */