cocoaTouch/SDLOverrides/SDL_uikitopenglview.m
author koda
Fri, 29 Jan 2010 00:55:14 +0000
changeset 2723 eaa6ac1e95ea
permissions -rw-r--r--
LANDSCAPE ON IPHONE brings down fps, other localization features
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2723
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
     1
/*
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
     2
 SDL - Simple DirectMedia Layer
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
     3
 Copyright (C) 1997-2009 Sam Lantinga
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
     4
 
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
     5
 This library is free software; you can redistribute it and/or
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
     6
 modify it under the terms of the GNU Lesser General Public
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
     7
 License as published by the Free Software Foundation; either
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
     8
 version 2.1 of the License, or (at your option) any later version.
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
     9
 
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    10
 This library is distributed in the hope that it will be useful,
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    11
 but WITHOUT ANY WARRANTY; without even the implied warranty of
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    12
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    13
 Lesser General Public License for more details.
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    14
 
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    15
 You should have received a copy of the GNU Lesser General Public
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    16
 License along with this library; if not, write to the Free Software
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    17
 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    18
 
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    19
 Sam Lantinga
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    20
 slouken@libsdl.org
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    21
 */
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    22
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    23
#import <QuartzCore/QuartzCore.h>
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    24
#import <OpenGLES/EAGLDrawable.h>
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    25
#import "SDL_uikitopenglview.h"
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    26
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    27
@interface SDL_uikitopenglview (privateMethods)
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    28
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    29
- (BOOL) createFramebuffer;
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    30
- (void) destroyFramebuffer;
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    31
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    32
@end
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    33
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    34
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    35
@implementation SDL_uikitopenglview
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    36
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    37
@synthesize context;
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    38
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    39
+ (Class)layerClass {
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    40
	return [CAEAGLLayer class];
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    41
}
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    42
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    43
- (id)initWithFrame:(CGRect)frame \
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    44
retainBacking:(BOOL)retained \
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    45
rBits:(int)rBits \
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    46
gBits:(int)gBits \
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    47
bBits:(int)bBits \
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    48
aBits:(int)aBits \
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    49
depthBits:(int)depthBits \
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    50
{
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    51
	
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    52
	NSString *colorFormat=nil;
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    53
	GLuint depthBufferFormat;
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    54
	BOOL useDepthBuffer;
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    55
	
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    56
	if (rBits == 8 && gBits == 8 && bBits == 8) {
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    57
		/* if user specifically requests rbg888 or some color format higher than 16bpp */
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    58
		colorFormat = kEAGLColorFormatRGBA8;
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    59
	}
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    60
	else {
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    61
		/* default case (faster) */
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    62
		colorFormat = kEAGLColorFormatRGB565;
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    63
	}
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    64
	
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    65
	if (depthBits == 24) {
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    66
		useDepthBuffer = YES;
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    67
		depthBufferFormat = GL_DEPTH_COMPONENT24_OES;
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    68
	}
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    69
	else if (depthBits == 0) {
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    70
		useDepthBuffer = NO;
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    71
	}
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    72
	else {
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    73
		/* default case when depth buffer is not disabled */
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    74
		/* 
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    75
		 strange, even when we use this, we seem to get a 24 bit depth buffer on iPhone.
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    76
		 perhaps that's the only depth format iPhone actually supports
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    77
		 */
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    78
		useDepthBuffer = YES;
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    79
		depthBufferFormat = GL_DEPTH_COMPONENT16_OES;
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    80
	}
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    81
	
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    82
	
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    83
	// we invert heigh and size to get q landscape mode up
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    84
	CGRect rect = [[UIScreen mainScreen] bounds];
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    85
	float swapTemp = rect.size.height;
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    86
	rect.size.width = rect.size.height;
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    87
	rect.size.height = swapTemp;
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    88
	
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    89
	if ((self = [super initWithFrame:rect])) {
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    90
		// Get the layer
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    91
		CAEAGLLayer *eaglLayer = (CAEAGLLayer *)self.layer;
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    92
		
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    93
		eaglLayer.opaque = YES;
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    94
		eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    95
						[NSNumber numberWithBool: retained], kEAGLDrawablePropertyRetainedBacking, colorFormat, kEAGLDrawablePropertyColorFormat, nil];
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    96
		
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    97
		context = [[EAGLContext alloc] initWithAPI: kEAGLRenderingAPIOpenGLES1];
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    98
		
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
    99
		if (!context || ![EAGLContext setCurrentContext:context]) {
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   100
			[self release];
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   101
			return nil;
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   102
		}
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   103
		
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   104
		/* create the buffers */
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   105
		glGenFramebuffersOES(1, &viewFramebuffer);
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   106
		glGenRenderbuffersOES(1, &viewRenderbuffer);
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   107
		
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   108
		glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   109
		glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   110
		[context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(CAEAGLLayer*)self.layer];
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   111
		glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, viewRenderbuffer);
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   112
		
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   113
		glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth);
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   114
		glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight);
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   115
		
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   116
		if (useDepthBuffer) {
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   117
			glGenRenderbuffersOES(1, &depthRenderbuffer);
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   118
			glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer);
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   119
			glRenderbufferStorageOES(GL_RENDERBUFFER_OES, depthBufferFormat, backingWidth, backingHeight);
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   120
			glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer);
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   121
		}
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   122
		
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   123
		if(glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES) {
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   124
			return NO;
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   125
		}
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   126
		/* end create buffers */
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   127
	}
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   128
	return self;
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   129
}
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   130
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   131
- (void)setCurrentContext {
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   132
	[EAGLContext setCurrentContext:context];
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   133
}
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   134
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   135
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   136
- (void)swapBuffers {
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   137
	glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   138
	[context presentRenderbuffer:GL_RENDERBUFFER_OES];
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   139
}
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   140
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   141
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   142
- (void)layoutSubviews {
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   143
	[EAGLContext setCurrentContext:context];
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   144
}
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   145
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   146
- (void)destroyFramebuffer {
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   147
	
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   148
	glDeleteFramebuffersOES(1, &viewFramebuffer);
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   149
	viewFramebuffer = 0;
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   150
	glDeleteRenderbuffersOES(1, &viewRenderbuffer);
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   151
	viewRenderbuffer = 0;
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   152
	
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   153
	if (depthRenderbuffer) {
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   154
		glDeleteRenderbuffersOES(1, &depthRenderbuffer);
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   155
		depthRenderbuffer = 0;
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   156
	}
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   157
}
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   158
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   159
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   160
- (void)dealloc {
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   161
	
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   162
	[self destroyFramebuffer];
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   163
	if ([EAGLContext currentContext] == context) {
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   164
		[EAGLContext setCurrentContext:nil];
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   165
	}
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   166
	[context release];	
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   167
	[super dealloc];
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   168
	
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   169
}
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   170
eaa6ac1e95ea LANDSCAPE ON IPHONE
koda
parents:
diff changeset
   171
@end