source: trunk/monsterz/ios/classes/EAGLView.m @ 731

Last change on this file since 731 was 731, checked in by sam, 10 years ago

ios: add cleaned up XCode project.

File size: 3.7 KB
Line 
1//
2//  EAGLView.m
3//  Monsterz
4//
5//  Created by user on 05.03.11.
6//  Copyright 2011 __MyCompanyName__. All rights reserved.
7//
8
9#import <QuartzCore/QuartzCore.h>
10
11#import "EAGLView.h"
12
13@interface EAGLView (PrivateMethods)
14- (void)createFramebuffer;
15- (void)deleteFramebuffer;
16@end
17
18@implementation EAGLView
19
20@dynamic context;
21
22// You must implement this method
23+ (Class)layerClass
24{
25    return [CAEAGLLayer class];
26}
27
28//The EAGL view is stored in the nib file. When it's unarchived it's sent -initWithCoder:.
29- (id)initWithCoder:(NSCoder*)coder
30{
31    self = [super initWithCoder:coder];
32        if (self)
33    {
34        CAEAGLLayer *eaglLayer = (CAEAGLLayer *)self.layer;
35       
36        eaglLayer.opaque = TRUE;
37        eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:
38                                        [NSNumber numberWithBool:FALSE], kEAGLDrawablePropertyRetainedBacking,
39                                        kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat,
40                                        nil];
41    }
42   
43    return self;
44}
45
46- (void)dealloc
47{
48    [self deleteFramebuffer];   
49    [context release];
50   
51    [super dealloc];
52}
53
54- (EAGLContext *)context
55{
56    return context;
57}
58
59- (void)setContext:(EAGLContext *)newContext
60{
61    if (context != newContext)
62    {
63        [self deleteFramebuffer];
64       
65        [context release];
66        context = [newContext retain];
67       
68        [EAGLContext setCurrentContext:nil];
69    }
70}
71
72- (void)createFramebuffer
73{
74    if (context && !defaultFramebuffer)
75    {
76        [EAGLContext setCurrentContext:context];
77       
78        // Create default framebuffer object.
79        glGenFramebuffers(1, &defaultFramebuffer);
80        glBindFramebuffer(GL_FRAMEBUFFER, defaultFramebuffer);
81       
82        // Create color render buffer and allocate backing store.
83        glGenRenderbuffers(1, &colorRenderbuffer);
84        glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer);
85        [context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer *)self.layer];
86        glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &framebufferWidth);
87        glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &framebufferHeight);
88       
89        glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorRenderbuffer);
90       
91        if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
92            NSLog(@"Failed to make complete framebuffer object %x", glCheckFramebufferStatus(GL_FRAMEBUFFER));
93    }
94}
95
96- (void)deleteFramebuffer
97{
98    if (context)
99    {
100        [EAGLContext setCurrentContext:context];
101       
102        if (defaultFramebuffer)
103        {
104            glDeleteFramebuffers(1, &defaultFramebuffer);
105            defaultFramebuffer = 0;
106        }
107       
108        if (colorRenderbuffer)
109        {
110            glDeleteRenderbuffers(1, &colorRenderbuffer);
111            colorRenderbuffer = 0;
112        }
113    }
114}
115
116- (void)setFramebuffer
117{
118    if (context)
119    {
120        [EAGLContext setCurrentContext:context];
121       
122        if (!defaultFramebuffer)
123            [self createFramebuffer];
124       
125        glBindFramebuffer(GL_FRAMEBUFFER, defaultFramebuffer);
126       
127        glViewport(0, 0, framebufferWidth, framebufferHeight);
128    }
129}
130
131- (BOOL)presentFramebuffer
132{
133    BOOL success = FALSE;
134   
135    if (context)
136    {
137        [EAGLContext setCurrentContext:context];
138       
139        glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer);
140       
141        success = [context presentRenderbuffer:GL_RENDERBUFFER];
142    }
143   
144    return success;
145}
146
147- (void)layoutSubviews
148{
149    // The framebuffer will be re-created at the beginning of the next setFramebuffer method call.
150    [self deleteFramebuffer];
151}
152
153@end
Note: See TracBrowser for help on using the repository browser.