mirror of
https://github.com/celisej567/mcpe.git
synced 2026-01-05 18:10:09 +03:00
190 lines
5.4 KiB
Objective-C
190 lines
5.4 KiB
Objective-C
//
|
|
// EAGLView.m
|
|
// GLBase
|
|
//
|
|
|
|
#import <QuartzCore/QuartzCore.h>
|
|
|
|
#import "EAGLView.h"
|
|
|
|
@interface EAGLView (PrivateMethods)
|
|
- (void)createFramebuffer;
|
|
- (void)deleteFramebuffer;
|
|
@end
|
|
|
|
@implementation EAGLView
|
|
|
|
@dynamic context;
|
|
|
|
// You must implement this method
|
|
+ (Class)layerClass
|
|
{
|
|
return [CAEAGLLayer class];
|
|
}
|
|
|
|
//The EAGL view is stored in the nib file. When it's unarchived it's sent -initWithCoder:.
|
|
- (id)initWithCoder:(NSCoder*)coder
|
|
{
|
|
self = [super initWithCoder:coder];
|
|
if (self)
|
|
{
|
|
CAEAGLLayer *eaglLayer = (CAEAGLLayer *)self.layer;
|
|
|
|
eaglLayer.opaque = TRUE;
|
|
eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:
|
|
[NSNumber numberWithBool:FALSE], kEAGLDrawablePropertyRetainedBacking,
|
|
kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat,
|
|
nil];
|
|
self->viewScale = 1.0;
|
|
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)])
|
|
{
|
|
self->viewScale = [[UIScreen mainScreen] scale];
|
|
if ([self respondsToSelector:@selector(setContentScaleFactor:)])
|
|
{
|
|
[self setContentScaleFactor:self->viewScale];
|
|
[eaglLayer setContentsScale:self->viewScale];
|
|
}
|
|
}
|
|
NSLog(@"Scale is : %f\n", self->viewScale);
|
|
}
|
|
|
|
return self;
|
|
}
|
|
|
|
- (void)dealloc
|
|
{
|
|
[self deleteFramebuffer];
|
|
#if !__has_feature(objc_arc)
|
|
[context release];
|
|
|
|
[super dealloc];
|
|
#endif
|
|
}
|
|
|
|
- (EAGLContext *)context
|
|
{
|
|
return context;
|
|
}
|
|
|
|
- (void)setContext:(EAGLContext *)newContext
|
|
{
|
|
if (context != newContext)
|
|
{
|
|
[self deleteFramebuffer];
|
|
|
|
context = newContext;
|
|
|
|
[EAGLContext setCurrentContext:nil];
|
|
}
|
|
}
|
|
|
|
- (void)createFramebuffer
|
|
{
|
|
if (context && !defaultFramebuffer)
|
|
{
|
|
[EAGLContext setCurrentContext:context];
|
|
|
|
// Create default framebuffer object.
|
|
glGenFramebuffers(1, &defaultFramebuffer);
|
|
glBindFramebuffer(GL_FRAMEBUFFER, defaultFramebuffer);
|
|
|
|
// Create color render buffer and allocate backing store.
|
|
glGenRenderbuffers(1, &colorRenderbuffer);
|
|
glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer);
|
|
BOOL success = [context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer *)self.layer];
|
|
if (!success)
|
|
NSLog(@"Failed to bind CAEAGLayer to renderbuffer object!\n");
|
|
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &framebufferWidth);
|
|
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &framebufferHeight);
|
|
|
|
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorRenderbuffer);
|
|
|
|
// Add depth buffer
|
|
glGenRenderbuffers(1, &depthRenderbuffer);
|
|
glBindRenderbuffer(GL_RENDERBUFFER, depthRenderbuffer);
|
|
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16 /*GL_DEPTH24_STENCIL8*/,
|
|
framebufferWidth, framebufferHeight);
|
|
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
|
|
GL_RENDERBUFFER, depthRenderbuffer );
|
|
|
|
// Doing stencil stuff isn't supported on iOS 4.1, and I can't see any reason to be using it to begin with
|
|
/*glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT,
|
|
GL_RENDERBUFFER, depthRenderbuffer );*/
|
|
NSLog(@"Created framebuffer with size %d, %d\n", framebufferWidth, framebufferHeight);
|
|
|
|
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
|
|
NSLog(@"Failed to make complete framebuffer object %x\n", glCheckFramebufferStatus(GL_FRAMEBUFFER));
|
|
}
|
|
}
|
|
|
|
- (void)deleteFramebuffer
|
|
{
|
|
if (context)
|
|
{
|
|
[EAGLContext setCurrentContext:context];
|
|
|
|
if (defaultFramebuffer)
|
|
{
|
|
glDeleteFramebuffers(1, &defaultFramebuffer);
|
|
defaultFramebuffer = 0;
|
|
}
|
|
|
|
if (colorRenderbuffer)
|
|
{
|
|
glDeleteRenderbuffers(1, &colorRenderbuffer);
|
|
colorRenderbuffer = 0;
|
|
}
|
|
|
|
if (depthRenderbuffer)
|
|
{
|
|
glDeleteRenderbuffers(1, &depthRenderbuffer);
|
|
depthRenderbuffer = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
- (void)setFramebuffer
|
|
{
|
|
if (context)
|
|
{
|
|
[EAGLContext setCurrentContext:context];
|
|
|
|
if (!defaultFramebuffer)
|
|
[self createFramebuffer];
|
|
|
|
glBindFramebuffer(GL_FRAMEBUFFER, defaultFramebuffer);
|
|
|
|
glViewport(0, 0, framebufferWidth, framebufferHeight);
|
|
}
|
|
}
|
|
|
|
- (BOOL)presentFramebuffer
|
|
{
|
|
BOOL success = FALSE;
|
|
|
|
if (context)
|
|
{
|
|
[EAGLContext setCurrentContext:context];
|
|
|
|
glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer);
|
|
glBindFramebuffer(GL_FRAMEBUFFER, self->defaultFramebuffer);
|
|
|
|
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_4_0 && __IPHONE_OS_VERSION_MIN_REQUIRED <= __IPHONE_12_0
|
|
GLenum discards[] = { GL_DEPTH_ATTACHMENT, GL_COLOR_ATTACHMENT0, GL_STENCIL_ATTACHMENT };
|
|
glDiscardFramebufferEXT(GL_FRAMEBUFFER, 3, discards);
|
|
#endif
|
|
|
|
success = [context presentRenderbuffer:GL_RENDERBUFFER];
|
|
}
|
|
|
|
return success;
|
|
}
|
|
|
|
- (void)layoutSubviews
|
|
{
|
|
// The framebuffer will be re-created at the beginning of the next setFramebuffer method call.
|
|
[self deleteFramebuffer];
|
|
}
|
|
|
|
@end
|