2
THIS WORK, INCLUDING THE SOURCE CODE, DOCUMENTATION
3
AND RELATED MEDIA AND DATA, IS PLACED INTO THE PUBLIC DOMAIN.
5
THE ORIGINAL AUTHOR IS KYLE FOLEY.
7
THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY
8
OF ANY KIND, NOT EVEN THE IMPLIED WARRANTY OF
9
MERCHANTABILITY. THE AUTHOR OF THIS SOFTWARE,
10
ASSUMES _NO_ RESPONSIBILITY FOR ANY CONSEQUENCE
11
RESULTING FROM THE USE, MODIFICATION, OR
12
REDISTRIBUTION OF THIS SOFTWARE.
25
#include "SDL/SDL_opengl.h"
33
int width = 640, height = 480;
34
unsigned char *data = (unsigned char*)malloc(width*height*4);
35
glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, data);
37
for (int x = 0; x < width*height*4; x++) {
38
if (x % 4 != 3) sum += x * data[x];
46
int main(int argc, char *argv[])
49
if ( SDL_Init(SDL_INIT_VIDEO) != 0 ) {
50
printf("Unable to initialize SDL: %s\n", SDL_GetError());
54
SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 );
55
screen = SDL_SetVideoMode( 640, 480, 24, SDL_OPENGL );
57
printf("Unable to set video mode: %s\n", SDL_GetError());
61
glClearColor( 0, 0, 0, 0 );
62
glClear( GL_COLOR_BUFFER_BIT );
67
glGenTextures( 1, &texture );
68
glBindTexture( GL_TEXTURE_2D, texture );
69
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
70
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
71
GLubyte textureData[16*16*4];
72
for (int x = 0; x < 16; x++) {
73
for (int y = 0; y < 16; y++) {
74
*((int*)&textureData[(x*16 + y) * 4]) = x*16 + ((y*16) << 8);
77
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0,
78
GL_RGBA, GL_UNSIGNED_BYTE, textureData );
80
// Create a second texture
83
glGenTextures( 1, &texture2 );
84
glBindTexture( GL_TEXTURE_2D, texture2 );
85
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
86
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
87
GLubyte texture2Data[] = { 0xff, 0, 0, 0xff,
90
0x80, 0x90, 0x70, 0 };
91
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0,
92
GL_RGBA, GL_UNSIGNED_BYTE, texture2Data );
100
glMatrixMode(GL_PROJECTION);
102
// original: glFrustum(-0.6435469817188064, 0.6435469817188064 ,-0.48266022190470925, 0.48266022190470925 ,0.5400000214576721, 2048);
103
//glFrustum(-0.6435469817188064, 0.1435469817188064 ,-0.48266022190470925, 0.88266022190470925 ,0.5400000214576721, 2048);
104
GLfloat pm[] = { 1.372136116027832, 0, 0, 0, 0, 0.7910231351852417, 0, 0, -0.6352481842041016, 0.29297152161598206, -1.0005275011062622, -1, 0, 0, -1.080284833908081, 0 };
107
glMatrixMode(GL_MODELVIEW);
108
GLfloat matrixData[] = { -1, 0, 0, 0,
112
glLoadMatrixf(matrixData);
113
//glTranslated(-512,-512,-527); // XXX this should be uncommented, but if it is then nothing is shown
115
// glEnable(GL_CULL_FACE);
116
// glEnable(GL_DEPTH_TEST);
118
//glClear(GL_DEPTH_BUFFER_BIT);
120
// glEnableClientState(GL_NORMAL_ARRAY);
121
// glEnableClientState(GL_COLOR_ARRAY);
122
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
124
glActiveTexture(GL_TEXTURE0);
126
glEnableClientState(GL_VERTEX_ARRAY);
128
GLuint arrayBuffer, elementBuffer;
129
glGenBuffers(1, &arrayBuffer);
130
glGenBuffers(1, &elementBuffer);
132
GLubyte arrayData[] = {
134
[0, 0, 0, 67] ==> 128 float
135
[0, 0, 128, 67] ==> 256 float
136
[0, 0, 0, 68] ==> 512 float
137
[0, 0, 128, 68] ==> 1024 float
139
[vertex x ] [vertex y ] [vertex z ] [nr] [texture u ] [texture v ] [lm u ] [lm v ] [color r,g,b,a ] */
140
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128, // 0
141
0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128, // 1
142
0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 67, 0, 0, 0, 0, 128, 128, 128, 128, // 2
143
0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 128, 128, 128, 128, // 3
144
0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128, // 4
145
0, 0, 128, 68, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 128, 67, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128, // 5
146
0, 0, 128, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 128, 67, 0, 0, 0, 67, 0, 0, 0, 0, 128, 128, 128, 128, // 6
147
0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 67, 0, 0, 0, 0, 128, 128, 128, 128, // 7
148
0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 128, 128, 128, 128, // 8
149
0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 67, 0, 0, 0, 0, 128, 128, 128, 128, // 9
150
0, 0, 0, 68, 0, 0, 128, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 128, 67, 0, 0, 0, 0, 128, 128, 128, 128, // 10
151
0, 0, 0, 0, 0, 0, 128, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 67, 0, 0, 0, 0, 128, 128, 128, 128, // 11
152
0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 67, 0, 0, 0, 0, 128, 128, 128, 128, // 12
153
0, 0, 128, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 128, 67, 0, 0, 0, 67, 0, 0, 0, 0, 128, 128, 128, 128, // 13
154
0, 0, 128, 68, 0, 0, 128, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 128, 67, 0, 0, 128, 67, 0, 0, 0, 0, 128, 128, 128, 128, // 14
155
0, 0, 0, 68, 0, 0, 128, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 128, 67, 0, 0, 0, 0, 128, 128, 128, 128, // 15
157
0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 128, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
158
0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 128, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
159
0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
160
0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
161
0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
162
0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 128, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
163
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
164
0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 128, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
165
0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
166
0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
167
0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 128, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
168
0, 0, 128, 68, 0, 0, 0, 68, 0, 0, 128, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
169
0, 0, 128, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
170
0, 0, 128, 68, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
171
0, 0, 0, 68, 0, 0, 128, 68, 0, 0, 128, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
172
0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 128, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
173
0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
174
0, 0, 0, 68, 0, 0, 128, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
175
0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 128, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
176
0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
177
0, 0, 0, 0, 0, 0, 128, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
178
0, 0, 0, 68, 0, 0, 128, 68, 0, 0, 128, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
179
0, 0, 0, 68, 0, 0, 128, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
180
0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
181
0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 128, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
182
0, 0, 128, 68, 0, 0, 0, 68, 0, 0, 128, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
183
0, 0, 128, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
184
0, 0, 128, 68, 0, 0, 128, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128
186
assert(sizeof(arrayData) == 1408);
187
glBindBuffer(GL_ARRAY_BUFFER, arrayBuffer);
188
glBufferData(GL_ARRAY_BUFFER, sizeof(arrayData), arrayData, GL_STATIC_DRAW);
189
glBindBuffer(GL_ARRAY_BUFFER, 0);
191
GLushort elementData[] = { 1, 2, 0, 2, 3, 0, 5, 6, 4, 6, 7, 4, 9, 10, 8, 10, 11, 8, 13, 14, 12, 14, 15, 12 };
192
assert(sizeof(elementData) == 48);
193
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, elementBuffer);
194
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(elementData), elementData, GL_STATIC_DRAW);
195
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
197
glBindBuffer(GL_ARRAY_BUFFER, arrayBuffer);
198
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, elementBuffer);
200
// sauer vertex data is apparently 0-12: V3F, 12: N1B, 16-24: T2F, 24-28: T2S, 28-32: C4B
201
glVertexPointer(3, GL_FLOAT, 32, (void*)0); // all these apply to the ARRAY_BUFFER that is bound
202
glTexCoordPointer(2, GL_FLOAT, 32, (void*)16);
203
// glClientActiveTexture(GL_TEXTURE1); // XXX seems to be ignored in native build
204
// glTexCoordPointer(2, GL_SHORT, 32, (void*)24);
205
// glClientActiveTexture(GL_TEXTURE0); // likely not needed, it is a cleanup
206
// glNormalPointer(GL_BYTE, 32, (void*)12);
207
// glColorPointer(4, GL_UNSIGNED_BYTE, 32, (void*)28);
209
glBindTexture(GL_TEXTURE_2D, texture); // diffuse?
210
glActiveTexture(GL_TEXTURE0);
211
glActiveTexture(GL_TEXTURE1);
212
glBindTexture(GL_TEXTURE_2D, texture2); // lightmap?
213
glActiveTexture(GL_TEXTURE0);
217
const char *vertexShader = "uniform mat4 u_modelView;\n"
218
"uniform mat4 u_projection;\n"
219
"varying vec4 v_texCoord0;\n"
221
"{\n" // (gl_ProjectionMatrix * gl_ModelViewMatrix * gl_Vertex)
222
// (u_projection * u_modelView * a_position)
223
" gl_Position = (u_projection * u_modelView * gl_Vertex) + vec4(200, 0, 0, 0);\n"
224
" v_texCoord0.xy = gl_MultiTexCoord0.xy/20.0;\n" // added /100 here
226
const char *fragmentShader = "uniform sampler2D diffusemap;\n"
227
"varying vec4 v_texCoord0;\n"
230
" vec4 diffuse = texture2D(diffusemap, v_texCoord0.xy);\n"
231
" gl_FragColor = diffuse;\n"
234
GLuint vs = glCreateShader(GL_VERTEX_SHADER);
235
glShaderSource(vs, 1, &vertexShader, NULL);
237
glGetShaderiv(vs, GL_COMPILE_STATUS, &ok);
239
printf("Shader compilation error with vertex\n");
241
glGetShaderiv (vs, GL_INFO_LOG_LENGTH, &infoLen);
244
char* infoLog = (char *)malloc(sizeof(char) * infoLen+1);
245
glGetShaderInfoLog(vs, infoLen, NULL, infoLog);
246
printf("Error compiling shader:\n%s\n", infoLog);
250
GLuint fs = glCreateShader(GL_FRAGMENT_SHADER);
251
glShaderSource(fs, 1, &fragmentShader, NULL);
253
glGetShaderiv(fs, GL_COMPILE_STATUS, &ok);
255
printf("Shader compilation error with fragment\n");
257
glGetShaderiv (vs, GL_INFO_LOG_LENGTH, &infoLen);
260
char* infoLog = (char *)malloc(sizeof(char) * infoLen+1);
261
glGetShaderInfoLog(vs, infoLen, NULL, infoLog);
262
printf("Error compiling shader:\n%s\n", infoLog);
266
GLuint program = glCreateProgram();
268
glAttachShader(program, vs);
269
glAttachShader(program, fs);
270
glLinkProgram(program);
271
glGetProgramiv(program, GL_LINK_STATUS, &ok);
274
glUseProgram(program);
276
//GLint lightmapLocation = glGetUniformLocation(program, "lightmap");
277
//assert(lightmapLocation >= 0);
278
//glUniform1i(lightmapLocation, 1); // sampler2D? Is it the texture unit?
280
GLint diffusemapLocation = glGetUniformLocation(program, "diffusemap");
281
assert(diffusemapLocation >= 0);
282
glUniform1i(diffusemapLocation, 0);
284
//GLint texgenscrollLocation = glGetUniformLocation(program, "texgenscroll");
285
//assert(texgenscrollLocation >= 0);
287
//GLint colorparamsLocation = glGetUniformLocation(program, "colorparams");
288
//assert(colorparamsLocation >= 0);
290
//GLfloat texgenscrollData[] = { 0, 0, 0, 0 };
291
//glUniform4fv(texgenscrollLocation, 1, texgenscrollData);
293
//GLfloat colorparamsData[] = { 2, 2, 2, 1 };
294
//glUniform4fv(colorparamsLocation, 1, colorparamsData);
298
glGetFloatv(GL_MODELVIEW_MATRIX, data);
299
printf("Modelview: ");
300
for (int i = 0; i < 16; i++) printf("%.3f, ", data[i]);
302
//memset(data, 0, 16*4);
303
GLint modelViewLocation = glGetUniformLocation(program, "u_modelView");
304
assert(modelViewLocation >= 0);
305
glUniformMatrix4fv(modelViewLocation, 1, GL_FALSE, data);
309
glGetFloatv(GL_PROJECTION_MATRIX, data);
310
printf("Projection: ");
311
for (int i = 0; i < 16; i++) printf("%.3f, ", data[i]);
313
//memset(data, 0, 16*4);
314
GLint projectionLocation = glGetUniformLocation(program, "u_projection");
315
assert(projectionLocation >= 0);
316
glUniformMatrix4fv(projectionLocation, 1, GL_FALSE, data);
320
glBindAttribLocation(program, 0, "a_position");
321
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 32, (void*)0);
322
glEnableVertexAttribArray(0);
324
glBindAttribLocation(program, 1, "v_texCoord0");
325
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 32, (void*)16);
326
glEnableVertexAttribArray(1);
329
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, (void*)12);
330
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, (void*) 0);
331
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, (void*)24);
332
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, (void*)36);
336
SDL_GL_SwapBuffers();