RSS

(root)/iphone/common : /source/ES2Shader.m (revision 96)

To get this branch, use:
bzr branch /browse/iphone/common
Line Revision Contents
1 20
//
2
//  ES2Shader.m
3
//
4
//  Created by döme on 08.08.2009.
5
//
6
7 54
/*
8
 * Copyright (c) 2009 Doemoetoer Gulyas.
9
 * All rights reserved.
10
 *
11
 * Redistribution and use in source and binary forms, with or without
12
 * modification, are permitted provided that the following conditions
13
 * are met:
14
 * 1. Redistributions of source code must retain the above copyright
15
 *    notice, this list of conditions and the following disclaimer.
16
 * 2. Redistributions in binary form must reproduce the above copyright
17
 *    notice, this list of conditions and the following disclaimer in the
18
 *    documentation and/or other materials provided with the distribution.
19
 * 3. The name of the author may not be used to endorse or promote products
20
 *    derived from this software without specific prior written permission.
21
 *
22
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
23
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
24
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
25
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
26
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
27
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
31
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32
 */
33
34 20
#import "ES2Shader.h"
35
36
#import <OpenGLES/ES2/gl.h>
37
38
@implementation ES2Shader
39
40
- (id) initWithVertexShaderString: (NSString*) vs fragmentShaderString: (NSString*) fs
41
{
42
	if (!(self = [super init]))
43
		return nil;
44
		
45
	const char* vsString = [vs UTF8String];
46
	const char* fsString = [fs UTF8String];
47
48
	vsShader = glCreateShader(GL_VERTEX_SHADER);
49
	fsShader = glCreateShader(GL_FRAGMENT_SHADER);
50
51
	assert(vsShader);
52
	assert(fsShader);
53
54
	glShaderSource(vsShader, 1, &vsString, NULL);
55
	glShaderSource(fsShader, 1, &fsString, NULL);
56
	
57
	glCompileShader(vsShader);
58
	
59
	{
60
		GLint vsStatus = 0;
61
		
62
		glGetShaderiv(vsShader, GL_COMPILE_STATUS, &vsStatus);
63
		
64
		if (!vsStatus)
65
		{
66
			GLint logLength = 0;
67
			glGetShaderiv(vsShader, GL_INFO_LOG_LENGTH, &logLength);
68
			
69
			char* infoLog = calloc(1, logLength);
70
			glGetShaderInfoLog(vsShader, logLength, NULL, infoLog);
71
72
			NSLog(@"Vertex shader compilation failed: %s", infoLog);
73
		}
74
	}
75
	glCompileShader(fsShader);
76
	
77
	{
78
		GLint fsStatus = 0;
79
		
80
		glGetShaderiv(fsShader, GL_COMPILE_STATUS, &fsStatus);
81
		
82
		if (!fsStatus)
83
		{
84
			GLint logLength = 0;
85
			glGetShaderiv(fsShader, GL_INFO_LOG_LENGTH, &logLength);
86
			
87
			char* infoLog = calloc(1, logLength);
88
			glGetShaderInfoLog(fsShader, logLength, NULL, infoLog);
89
90
			NSLog(@"Fragment shader compilation failed: %s", infoLog);
91
		}
92
	}
93
	programObj = glCreateProgram();
94
	
95
	assert(programObj);
96
97
	glAttachShader(programObj, fsShader);
98
	glAttachShader(programObj, vsShader);
99
100
	glBindAttribLocation(programObj, POSITION_ATTRIB_INDEX, "position");
101
	glBindAttribLocation(programObj, NORMAL_ATTRIB_INDEX, "normal");
102 92
	glBindAttribLocation(programObj, COLOR_ATTRIB_INDEX, "colora");
103 20
	glBindAttribLocation(programObj, TEXCOORD_ATTRIB_INDEX, "texcoord");
104
105
	glLinkProgram(programObj);
106
107
	GLint linkStatus = 0;
108
	glGetProgramiv(programObj, GL_LINK_STATUS, &linkStatus);
109
110
	if (!linkStatus)
111
	{
112
		GLint logLength = 0;
113
		glGetProgramiv(programObj, GL_INFO_LOG_LENGTH, &logLength);
114
		
115
		char* infoLog = calloc(1, logLength);
116
		glGetProgramInfoLog(programObj, logLength, NULL, infoLog);
117
118
		NSLog(@"Shader linking failed: %s", infoLog);
119
	}
120
121 85
	//sampler0loc = glGetUniformLocation(programObj, "tex0");
122
	//glUniform1i(sampler0loc, 0);
123 20
124 70
	uniformDict = [[NSMutableDictionary alloc] init];
125
126 20
	return self;
127
}
128
129
- (id) initWithVertexShaderFile: (NSString*) vs fragmentShaderFile: (NSString*) fs
130
{
131
	if (!(self = [super init]))
132
		return nil;
133 83
	
134 85
	assert(GL_NO_ERROR == glGetError());
135
136 94
	vertexShaderName = vs;
137
	fragmentShaderName = fs;
138 20
		
139
	NSData* vsData = [NSData dataWithContentsOfFile: [[NSBundle mainBundle] pathForResource: vs ofType: nil]];
140
	NSData* fsData = [NSData dataWithContentsOfFile: [[NSBundle mainBundle] pathForResource: fs ofType: nil]];
141
142
	vsShader = glCreateShader(GL_VERTEX_SHADER);
143
	fsShader = glCreateShader(GL_FRAGMENT_SHADER);
144
145
	assert(vsShader);
146
	assert(fsShader);
147
148
	GLint lvs = [vsData length];
149
	GLint lfs = [fsData length];
150
	
151
	const char* vsString = [vsData bytes];
152
	const char* fsString = [fsData bytes];
153
154
	glShaderSource(vsShader, 1, &vsString, &lvs);
155
	glShaderSource(fsShader, 1, &fsString, &lfs);
156
	
157
	glCompileShader(vsShader);
158
	
159
	{
160
		GLint vsStatus = 0;
161
		
162
		glGetShaderiv(vsShader, GL_COMPILE_STATUS, &vsStatus);
163
		
164
		if (!vsStatus)
165
		{
166
			GLint logLength = 0;
167
			glGetShaderiv(vsShader, GL_INFO_LOG_LENGTH, &logLength);
168
			
169
			char* infoLog = calloc(1, logLength);
170
			glGetShaderInfoLog(vsShader, logLength, NULL, infoLog);
171
172
			NSLog(@"Vertex shader compilation failed: %s", infoLog);
173
		}
174
	}
175
	glCompileShader(fsShader);
176
	
177
	{
178
		GLint fsStatus = 0;
179
		
180
		glGetShaderiv(fsShader, GL_COMPILE_STATUS, &fsStatus);
181
		
182 85
		if (GL_FALSE == fsStatus)
183 20
		{
184
			GLint logLength = 0;
185
			glGetShaderiv(fsShader, GL_INFO_LOG_LENGTH, &logLength);
186
			
187
			char* infoLog = calloc(1, logLength);
188
			glGetShaderInfoLog(fsShader, logLength, NULL, infoLog);
189
190
			NSLog(@"Fragment shader compilation failed: %s", infoLog);
191
		}
192
	}
193 85
194
	assert(GL_NO_ERROR == glGetError());
195
196 20
	programObj = glCreateProgram();
197
	
198
	assert(programObj);
199
200
	glAttachShader(programObj, fsShader);
201
	glAttachShader(programObj, vsShader);
202
203
	glBindAttribLocation(programObj, POSITION_ATTRIB_INDEX, "position");
204
	glBindAttribLocation(programObj, NORMAL_ATTRIB_INDEX, "normal");
205 92
	glBindAttribLocation(programObj, COLOR_ATTRIB_INDEX, "colora");
206 20
	glBindAttribLocation(programObj, TEXCOORD_ATTRIB_INDEX, "texcoord");
207
208
	glLinkProgram(programObj);
209
210
	GLint linkStatus = 0;
211
	glGetProgramiv(programObj, GL_LINK_STATUS, &linkStatus);
212
213 85
	if (GL_FALSE == linkStatus)
214 20
	{
215
		GLint logLength = 0;
216
		glGetProgramiv(programObj, GL_INFO_LOG_LENGTH, &logLength);
217
		
218
		char* infoLog = calloc(1, logLength);
219
		glGetProgramInfoLog(programObj, logLength, NULL, infoLog);
220
221
		NSLog(@"Shader linking failed: %s", infoLog);
222
	}
223
224 85
//	sampler0loc = glGetUniformLocation(programObj, "tex0");
225
//	glUniform1i(sampler0loc, 0);
226 20
227 70
	uniformDict = [[NSMutableDictionary alloc] init];
228
229 85
	assert(GL_NO_ERROR == glGetError());
230
231 20
	return self;
232
}
233
234
- (void) dealloc
235
{
236
	glDeleteProgram(programObj);
237
	glDeleteShader(fsShader);
238
	glDeleteShader(vsShader);
239 70
	
240 20
}
241
242
- (void) bindShader
243
{
244
	glUseProgram(programObj);
245
}
246
247 70
- (void) setUniformInteger: (GLint) i named: (NSString*) name
248
{
249 71
	GLint loc = [[uniformDict objectForKey: name] intValue];
250 70
	if (!loc)
251
	{
252
		loc = glGetUniformLocation(programObj, [name UTF8String]);
253
		[uniformDict setObject: [NSNumber numberWithUnsignedInt: loc] forKey: name];
254
	}
255
	
256
	if (loc != -1)
257
		glUniform1i(loc, i);
258
	else
259
		NSLog(@"failed to set uniform %@", name);
260
}
261
262
- (void) setUniformFloat: (float) f named: (NSString*) name
263
{
264 71
	GLint loc = [[uniformDict objectForKey: name] intValue];
265 70
	if (!loc)
266
	{
267
		loc = glGetUniformLocation(programObj, [name UTF8String]);
268
		[uniformDict setObject: [NSNumber numberWithUnsignedInt: loc] forKey: name];
269
	}
270
	
271
	if (loc != -1)
272
		glUniform1f(loc, f);
273
	else
274
		NSLog(@"failed to set uniform %@", name);
275
}
276
277
- (void) setUniformFloat: (float*) f count: (int) count named: (NSString*) name
278
{
279 71
	GLint loc = [[uniformDict objectForKey: name] intValue];
280 70
	if (!loc)
281
	{
282
		loc = glGetUniformLocation(programObj, [name UTF8String]);
283
		[uniformDict setObject: [NSNumber numberWithUnsignedInt: loc] forKey: name];
284
	}
285
	
286
	if (loc != -1)
287 76
		glUniform4fv(loc, count, f);
288 70
	else
289
		NSLog(@"failed to set uniform %@", name);
290
}
291
292
293 20
- (void) setModelviewMatrix: (m16*) m
294
{
295
	m16 nm = mtranspose(minverse(*m));
296
	if (!modelviewMatrixLoc)
297
		modelviewMatrixLoc = glGetUniformLocation(programObj, "modelviewMatrix");
298
	if (!normalMatrixLoc)
299
		normalMatrixLoc = glGetUniformLocation(programObj, "normalMatrix");
300
	
301 70
	if (modelviewMatrixLoc != -1)
302
		glUniformMatrix4fv(modelviewMatrixLoc, 1, GL_FALSE, m->a);
303
	if (normalMatrixLoc != -1)
304
		glUniformMatrix4fv(normalMatrixLoc, 1, GL_FALSE, nm.a);
305 20
}
306
307
- (void) setProjectionMatrix: (m16*) m
308
{
309
	if (!projectionMatrixLoc)
310
		projectionMatrixLoc = glGetUniformLocation(programObj, "projectionMatrix");
311 70
312
	if (projectionMatrixLoc != -1)
313
		glUniformMatrix4fv(projectionMatrixLoc, 1, GL_FALSE, m->a);
314 20
}
315
- (void) setTextureMatrix: (m16*) m
316
{
317
	if (!textureMatrixLoc)
318
		textureMatrixLoc = glGetUniformLocation(programObj, "textureMatrix");
319 70
320
	if (textureMatrixLoc != -1)
321
		glUniformMatrix4fv(textureMatrixLoc, 1, GL_FALSE, m->a);
322 20
}
323
324 23
- (void) setColorRed: (float) r green: (float) g blue: (float) b alpha: (float) a
325
{
326
	if (!colorLoc)
327
		colorLoc = glGetUniformLocation(programObj, "color");
328 70
329
	if (colorLoc != -1)
330
		glUniform4f(colorLoc, r, g, b, a);
331 23
}
332 20
333
334
@end
335

Loggerhead 1.17 is a web-based interface for Bazaar branches