0
|
1 //
|
|
2 // EAGLView.m
|
|
3 // MySampleProject
|
|
4 //
|
|
5 // Created by Eric Wing on 7/29/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
|