RSS

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

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
	glBindAttribLocation(programObj, TEXCOORD_ATTRIB_INDEX, "texcoord");
103
104
	glLinkProgram(programObj);
105
106
	GLint linkStatus = 0;
107
	glGetProgramiv(programObj, GL_LINK_STATUS, &linkStatus);
108
109
	if (!linkStatus)
110
	{
111
		GLint logLength = 0;
112
		glGetProgramiv(programObj, GL_INFO_LOG_LENGTH, &logLength);
113
		
114
		char* infoLog = calloc(1, logLength);
115
		glGetProgramInfoLog(programObj, logLength, NULL, infoLog);
116
117
		NSLog(@"Shader linking failed: %s", infoLog);
118
	}
119
120
	sampler0loc = glGetUniformLocation(programObj, "tex0");
121
	glUniform1i(sampler0loc, 0);
122
123
	return self;
124
}
125
126
- (id) initWithVertexShaderFile: (NSString*) vs fragmentShaderFile: (NSString*) fs
127
{
128
	if (!(self = [super init]))
129
		return nil;
130
		
131
	NSData* vsData = [NSData dataWithContentsOfFile: [[NSBundle mainBundle] pathForResource: vs ofType: nil]];
132
	NSData* fsData = [NSData dataWithContentsOfFile: [[NSBundle mainBundle] pathForResource: fs ofType: nil]];
133
134
	vsShader = glCreateShader(GL_VERTEX_SHADER);
135
	fsShader = glCreateShader(GL_FRAGMENT_SHADER);
136
137
	assert(vsShader);
138
	assert(fsShader);
139
140
	GLint lvs = [vsData length];
141
	GLint lfs = [fsData length];
142
	
143
	const char* vsString = [vsData bytes];
144
	const char* fsString = [fsData bytes];
145
146
	glShaderSource(vsShader, 1, &vsString, &lvs);
147
	glShaderSource(fsShader, 1, &fsString, &lfs);
148
	
149
	glCompileShader(vsShader);
150
	
151
	{
152
		GLint vsStatus = 0;
153
		
154
		glGetShaderiv(vsShader, GL_COMPILE_STATUS, &vsStatus);
155
		
156
		if (!vsStatus)
157
		{
158
			GLint logLength = 0;
159
			glGetShaderiv(vsShader, GL_INFO_LOG_LENGTH, &logLength);
160
			
161
			char* infoLog = calloc(1, logLength);
162
			glGetShaderInfoLog(vsShader, logLength, NULL, infoLog);
163
164
			NSLog(@"Vertex shader compilation failed: %s", infoLog);
165
		}
166
	}
167
	glCompileShader(fsShader);
168
	
169
	{
170
		GLint fsStatus = 0;
171
		
172
		glGetShaderiv(fsShader, GL_COMPILE_STATUS, &fsStatus);
173
		
174
		if (!fsStatus)
175
		{
176
			GLint logLength = 0;
177
			glGetShaderiv(fsShader, GL_INFO_LOG_LENGTH, &logLength);
178
			
179
			char* infoLog = calloc(1, logLength);
180
			glGetShaderInfoLog(fsShader, logLength, NULL, infoLog);
181
182
			NSLog(@"Fragment shader compilation failed: %s", infoLog);
183
		}
184
	}
185
	programObj = glCreateProgram();
186
	
187
	assert(programObj);
188
189
	glAttachShader(programObj, fsShader);
190
	glAttachShader(programObj, vsShader);
191
192
	glBindAttribLocation(programObj, POSITION_ATTRIB_INDEX, "position");
193
	glBindAttribLocation(programObj, NORMAL_ATTRIB_INDEX, "normal");
194
	glBindAttribLocation(programObj, TEXCOORD_ATTRIB_INDEX, "texcoord");
195
196
	glLinkProgram(programObj);
197
198
	GLint linkStatus = 0;
199
	glGetProgramiv(programObj, GL_LINK_STATUS, &linkStatus);
200
201
	if (!linkStatus)
202
	{
203
		GLint logLength = 0;
204
		glGetProgramiv(programObj, GL_INFO_LOG_LENGTH, &logLength);
205
		
206
		char* infoLog = calloc(1, logLength);
207
		glGetProgramInfoLog(programObj, logLength, NULL, infoLog);
208
209
		NSLog(@"Shader linking failed: %s", infoLog);
210
	}
211
212
	sampler0loc = glGetUniformLocation(programObj, "tex0");
213
	glUniform1i(sampler0loc, 0);
214
215
	return self;
216
}
217
218
- (void) dealloc
219
{
220
	glDeleteProgram(programObj);
221
	glDeleteShader(fsShader);
222
	glDeleteShader(vsShader);
223
224
	[super dealloc];
225
}
226
227
- (void) bindShader
228
{
229
	glUseProgram(programObj);
230
}
231
232
- (void) setModelviewMatrix: (m16*) m
233
{
234
	m16 nm = mtranspose(minverse(*m));
235
	if (!modelviewMatrixLoc)
236
		modelviewMatrixLoc = glGetUniformLocation(programObj, "modelviewMatrix");
237
	if (!normalMatrixLoc)
238
		normalMatrixLoc = glGetUniformLocation(programObj, "normalMatrix");
239
	
240
	glUniformMatrix4fv(modelviewMatrixLoc, 1, GL_FALSE, m->a);
241
	glUniformMatrix4fv(normalMatrixLoc, 1, GL_FALSE, nm.a);
242
}
243
244
- (void) setProjectionMatrix: (m16*) m
245
{
246
	if (!projectionMatrixLoc)
247
		projectionMatrixLoc = glGetUniformLocation(programObj, "projectionMatrix");
248
	glUniformMatrix4fv(projectionMatrixLoc, 1, GL_FALSE, m->a);
249
}
250
- (void) setTextureMatrix: (m16*) m
251
{
252
	if (!textureMatrixLoc)
253
		textureMatrixLoc = glGetUniformLocation(programObj, "textureMatrix");
254
	glUniformMatrix4fv(textureMatrixLoc, 1, GL_FALSE, m->a);
255
}
256
257 23
- (void) setColorRed: (float) r green: (float) g blue: (float) b alpha: (float) a
258
{
259
	if (!colorLoc)
260
		colorLoc = glGetUniformLocation(programObj, "color");
261
	glUniform4f(colorLoc, r, g, b, a);
262
}
263 20
264
265
@end
266

Loggerhead 1.17 is a web-based interface for Bazaar branches