RSS

(root)/iphone/tappity : 60 : common/source/ES2Shader.m

To get this branch, use:
bzr branch /browse/iphone/tappity

« back to all changes in this revision

Viewing changes to common/source/ES2Shader.m

Dömötör Gulyás
2010-01-18 09:01:40
Revision ID: dognotdog@gmail.com-20100118080140-g8bc7z6dp9ilr8rt
made tappity a standalone tree

Show diffs side-by-side

added added

removed removed

1
 
//
2
 
//  ES2Shader.m
3
 
//
4
 
//  Created by döme on 08.08.2009.
5
 
//
6
 
 
7
 
/*
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
 
#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
 
- (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
 
 
264
 
 
265
 
@end
266
 
 

Loggerhead 1.17 is a web-based interface for Bazaar branches