Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
emscripten-core
GitHub Repository: emscripten-core/emscripten
Path: blob/main/test/cube_explosion.c
4128 views
1
/*
2
* Copyright 2012 The Emscripten Authors. All rights reserved.
3
* Emscripten is available under two separate licenses, the MIT license and the
4
* University of Illinois/NCSA Open Source License. Both these licenses can be
5
* found in the LICENSE file.
6
*/
7
8
/*
9
THIS WORK, INCLUDING THE SOURCE CODE, DOCUMENTATION
10
AND RELATED MEDIA AND DATA, IS PLACED INTO THE PUBLIC DOMAIN.
11
12
THE ORIGINAL AUTHOR IS KYLE FOLEY.
13
14
THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY
15
OF ANY KIND, NOT EVEN THE IMPLIED WARRANTY OF
16
MERCHANTABILITY. THE AUTHOR OF THIS SOFTWARE,
17
ASSUMES _NO_ RESPONSIBILITY FOR ANY CONSEQUENCE
18
RESULTING FROM THE USE, MODIFICATION, OR
19
REDISTRIBUTION OF THIS SOFTWARE.
20
*/
21
22
#ifndef __EMSCRIPTEN__
23
#define USE_GLEW 1
24
#endif
25
26
#if USE_GLEW
27
#include "GL/glew.h"
28
#endif
29
30
#include "SDL/SDL.h"
31
#if !USE_GLEW
32
#include "SDL/SDL_opengl.h"
33
#endif
34
35
#include <stdio.h>
36
#include <string.h>
37
#include <assert.h>
38
39
int main(int argc, char *argv[]) {
40
SDL_Surface *screen;
41
if ( SDL_Init(SDL_INIT_VIDEO) != 0 ) {
42
printf("Unable to initialize SDL: %s\n", SDL_GetError());
43
return 1;
44
}
45
46
SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 );
47
screen = SDL_SetVideoMode( 640, 480, 24, SDL_OPENGL );
48
if ( !screen ) {
49
printf("Unable to set video mode: %s\n", SDL_GetError());
50
return 1;
51
}
52
53
glClearColor( 0, 0, 0, 0 );
54
glClear( GL_COLOR_BUFFER_BIT );
55
56
// Create a texture
57
58
GLuint texture;
59
assert(!glIsTexture(1)); // not a texture
60
glGenTextures( 1, &texture );
61
assert(!glIsTexture(texture)); // not a texture until glBindTexture
62
glBindTexture( GL_TEXTURE_2D, texture );
63
assert(glIsTexture(texture)); // NOW it is a texture
64
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
65
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
66
GLubyte textureData[16*16*4];
67
for (int x = 0; x < 16; x++) {
68
for (int y = 0; y < 16; y++) {
69
*((int*)&textureData[(x*16 + y) * 4]) = x*16 + ((y*16) << 8) + ((y*16) << 16) + 0xff331177;
70
}
71
}
72
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0,
73
GL_RGBA, GL_UNSIGNED_BYTE, textureData );
74
75
// BEGIN
76
77
#if USE_GLEW
78
glewInit();
79
#endif
80
81
glMatrixMode(GL_PROJECTION);
82
glLoadIdentity();
83
// original: glFrustum(-0.6435469817188064, 0.6435469817188064 ,-0.48266022190470925, 0.48266022190470925 ,0.5400000214576721, 2048);
84
// cubegeom: glFrustum(-0.6435469817188064, 0.1435469817188064, -0.48266022190470925, 0.88266022190470925 ,0.5400000214576721, 2048);
85
glFrustum(-0.6435469817188064, 0.6435469817188064, -0.48266022190470925, 0.48266022190470925, 0.5400000214576721, 2048);
86
87
glMatrixMode(GL_MODELVIEW);
88
GLfloat matrixData[] = { -1, 0, 0, 0,
89
0, 0,-1, 0,
90
0, 1, 0, 0,
91
0, 0, 0, 1 };
92
glLoadMatrixf(matrixData);
93
// cubegeom glTranslated(-512,-512,-527); // XXX this should be uncommented, but if it is then nothing is shown
94
glRotated(0, 0, 1, 0);
95
glRotated(0, -1, 0, 0);
96
glRotated(0, 0, 0, -1);
97
glTranslated(-512,-512,-527);
98
99
glEnable(GL_CULL_FACE);
100
glEnable(GL_DEPTH_TEST);
101
102
glClear(GL_DEPTH_BUFFER_BIT);
103
104
GLint ok;
105
106
const char *vertexShader =
107
"uniform vec4 center, animstate;\n"
108
"uniform vec4 texgenS, texgenT;\n"
109
"void main(void)\n"
110
"{\n"
111
" vec4 wobble = vec4(gl_Vertex.xyz*(1.0 + 0.5*abs(fract(dot(gl_Vertex.xyz, center.xyz) + animstate.w*0.002) - 0.5)), gl_Vertex.w);\n"
112
" gl_Position = gl_ModelViewProjectionMatrix * wobble;\n"
113
" gl_FrontColor = gl_Color;\n"
114
" gl_TexCoord[0].xy = gl_MultiTexCoord0.xy;\n"
115
" vec2 texgen = vec2(dot(texgenS, gl_Vertex), dot(texgenT, gl_Vertex)); \n"
116
" gl_TexCoord[1].xy = texgen;\n"
117
" gl_TexCoord[2].xy = texgen - animstate.w*0.0005;\n"
118
"}\n";
119
const char *fragmentShader =
120
"uniform sampler2D tex2;\n"
121
"uniform sampler2D tex0, tex1;\n"
122
"void main(void)\n"
123
"{\n"
124
" vec2 dtc = gl_TexCoord[0].xy + texture2D(tex0, gl_TexCoord[2].xy).xy*0.1; \n"
125
" vec4 diffuse = texture2D(tex0, dtc);\n"
126
" vec4 blend = texture2D(tex1, gl_TexCoord[1].xy); \n"
127
" diffuse *= blend.a*4.0; \n"
128
" diffuse.b += 0.5 - blend.a*0.5; \n"
129
" gl_FragColor = diffuse * gl_Color;\n"
130
"}\n";
131
132
GLuint vs = glCreateShader(GL_VERTEX_SHADER);
133
glShaderSource(vs, 1, &vertexShader, NULL);
134
glCompileShader(vs);
135
glGetShaderiv(vs, GL_COMPILE_STATUS, &ok);
136
assert(ok);
137
138
GLuint fs = glCreateShader(GL_FRAGMENT_SHADER);
139
glShaderSource(fs, 1, &fragmentShader, NULL);
140
glCompileShader(fs);
141
glGetShaderiv(fs, GL_COMPILE_STATUS, &ok);
142
assert(ok);
143
144
GLuint program = glCreateProgram();
145
146
glAttachShader(program, vs);
147
glAttachShader(program, fs);
148
glLinkProgram(program);
149
glGetProgramiv(program, GL_LINK_STATUS, &ok);
150
assert(ok);
151
152
glUseProgram(program);
153
154
// get active uniform data for 10 uniforms. XXX they include our additions from shader rewriting! XXX
155
156
// gen texture, we already has one
157
158
GLuint arrayBuffer;
159
glGenBuffers(1, &arrayBuffer);
160
glBindBuffer(GL_ARRAY_BUFFER, arrayBuffer);
161
GLubyte arrayBufferData[] =
162
{0,0,0,128,0,0,0,0,0,0,128,63,0,0,0,0,0,0,128,63,0,0,0,128,0,0,0,0,0,0,128,63,171,170,170,61,0,0,128,63,0,0,0,128,0,0,0,0,0,0,128,63,171,170,42,62,0,0,128,63,0,0,0,128,0,0,0,0,0,0,128,63,0,0,128,62,0,0,128,63,0,0,0,128,0,0,0,128,0,0,128,63,171,170,170,62,0,0,128,63,0,0,0,128,0,0,0,128,0,0,128,63,85,85,213,62,0,0,128,63,0,0,0,128,0,0,0,128,0,0,128,63,0,0,0,63,0,0,128,63,0,0,0,0,0,0,0,128,0,0,128,63,85,85,21,63,0,0,128,63,0,0,0,0,0,0,0,128,0,0,128,63,171,170,42,63,0,0,128,63,0,0,0,0,0,0,0,128,0,0,128,63,0,0,64,63,0,0,128,63,0,0,0,0,0,0,0,0,0,0,128,63,85,85,85,63,0,0,128,63,0,0,0,0,0,0,0,0,0,0,128,63,171,170,106,63,0,0,128,63,0,0,0,128,0,0,0,0,0,0,128,63,0,0,128,63,0,0,128,63,0,0,0,128,0,0,0,63,215,179,93,63,0,0,0,0,85,85,85,63,0,0,128,190,215,179,221,62,215,179,93,63,171,170,170,61,85,85,85,63,215,179,221,190,0,0,128,62,215,179,93,63,171,170,42,62,85,85,85,63,0,0,0,191,0,48,13,36,215,179,93,63,0,0,128,62,85,85,85,63,215,179,221,190,0,0,128,190,215,179,93,63,171,170,170,62,85,85,85,63,0,0,128,190,215,179,221,190,215,179,93,63,85,85,213,62,85,85,85,63,0,76,163,165,0,0,0,191,215,179,93,63,0,0,0,63,85,85,85,63,0,0,128,62,215,179,221,190,215,179,93,63,85,85,21,63,85,85,85,63,215,179,221,62,0,0,128,190,215,179,93,63,171,170,42,63,85,85,85,63,0,0,0,63,0,200,211,164,215,179,93,63,0,0,64,63,85,85,85,63,215,179,221,62,0,0,128,62,215,179,93,63,85,85,85,63,85,85,85,63,0,0,128,62,215,179,221,62,215,179,93,63,171,170,106,63,85,85,85,63,0,0,0,128,0,0,0,63,215,179,93,63,0,0,128,63,85,85,85,63,0,0,0,128,215,179,93,63,0,0,0,63,0,0,0,0,171,170,42,63,215,179,221,190,0,0,64,63,0,0,0,63,171,170,170,61,171,170,42,63,0,0,64,191,215,179,221,62,0,0,0,63,171,170,42,62,171,170,42,63,215,179,93,191,63,139,116,36,0,0,0,63,0,0,128,62,171,170,42,63,0,0,64,191,215,179,221,190,0,0,0,63,171,170,170,62,171,170,42,63,215,179,221,190,0,0,64,191,0,0,0,63,85,85,213,62,171,170,42,63,83,107,13,166,215,179,93,191,0,0,0,63,0,0,0,63,171,170,42,63,215,179,221,62,0,0,64,191,0,0,0,63,85,85,21,63,171,170,42,63,0,0,64,63,215,179,221,190,0,0,0,63,171,170,42,63,171,170,42,63,215,179,93,63,111,104,55,165,0,0,0,63,0,0,64,63,171,170,42,63,0,0,64,63,215,179,221,62,0,0,0,63,85,85,85,63,171,170,42,63,215,179,221,62,0,0,64,63,0,0,0,63,171,170,106,63,171,170,42,63,0,0,0,128,215,179,93,63,0,0,0,63,0,0,128,63,171,170,42,63,0,0,0,128,0,0,128,63,0,166,17,38,0,0,0,0,0,0,0,63,0,0,0,191,215,179,93,63,0,166,17,38,171,170,170,61,0,0,0,63,215,179,93,191,0,0,0,63,0,166,17,38,171,170,42,62,0,0,0,63,0,0,128,191,0,48,141,36,0,166,17,38,0,0,128,62,0,0,0,63,215,179,93,191,0,0,0,191,0,166,17,38,171,170,170,62,0,0,0,63,0,0,0,191,215,179,93,191,0,166,17,38,85,85,213,62,0,0,0,63,0,76,35,166,0,0,128,191,0,166,17,38,0,0,0,63,0,0,0,63,0,0,0,63,215,179,93,191,0,166,17,38,85,85,21,63,0,0,0,63,215,179,93,63,0,0,0,191,0,166,17,38,171,170,42,63,0,0,0,63,0,0,128,63,0,200,83,165,0,166,17,38,0,0,64,63,0,0,0,63,215,179,93,63,0,0,0,63,0,166,17,38,85,85,85,63,0,0,0,63,0,0,0,63,215,179,93,63,0,166,17,38,171,170,106,63,0,0,0,63,0,0,0,128,0,0,128,63,0,166,17,38,0,0,128,63,0,0,0,63,0,0,0,128,215,179,93,63,0,0,0,191,0,0,0,0,171,170,170,62,215,179,221,190,0,0,64,63,0,0,0,191,171,170,170,61,171,170,170,62,0,0,64,191,215,179,221,62,0,0,0,191,171,170,42,62,171,170,170,62,215,179,93,191,63,139,116,36,0,0,0,191,0,0,128,62,171,170,170,62,0,0,64,191,215,179,221,190,0,0,0,191,171,170,170,62,171,170,170,62,215,179,221,190,0,0,64,191,0,0,0,191,85,85,213,62,171,170,170,62,83,107,13,166,215,179,93,191,0,0,0,191,0,0,0,63,171,170,170,62,215,179,221,62,0,0,64,191,0,0,0,191,85,85,21,63,171,170,170,62,0,0,64,63,215,179,221,190,0,0,0,191,171,170,42,63,171,170,170,62,215,179,93,63,111,104,55,165,0,0,0,191,0,0,64,63,171,170,170,62,0,0,64,63,215,179,221,62,0,0,0,191,85,85,85,63,171,170,170,62,215,179,221,62,0,0,64,63,0,0,0,191,171,170,106,63,171,170,170,62,0,0,0,128,215,179,93,63,0,0,0,191,0,0,128,63,171,170,170,62,0,0,0,128,0,0,0,63,215,179,93,191,0,0,0,0,171,170,42,62,0,0,128,190,215,179,221,62,215,179,93,191,171,170,170,61,171,170,42,62,215,179,221,190,0,0,128,62,215,179,93,191,171,170,42,62,171,170,42,62,0,0,0,191,0,48,13,36,215,179,93,191,0,0,128,62,171,170,42,62,215,179,221,190,0,0,128,190,215,179,93,191,171,170,170,62,171,170,42,62,0,0,128,190,215,179,221,190,215,179,93,191,85,85,213,62,171,170,42,62,0,76,163,165,0,0,0,191,215,179,93,191,0,0,0,63,171,170,42,62,0,0,128,62,215,179,221,190,215,179,93,191,85,85,21,63,171,170,42,62,215,179,221,62,0,0,128,190,215,179,93,191,171,170,42,63,171,170,42,62,0,0,0,63,0,200,211,164,215,179,93,191,0,0,64,63,171,170,42,62,215,179,221,62,0,0,128,62,215,179,93,191,85,85,85,63,171,170,42,62,0,0,128,62,215,179,221,62,215,179,93,191,171,170,106,63,171,170,42,62,0,0,0,128,0,0,0,63,215,179,93,191,0,0,128,63,171,170,42,62,0,0,0,128,0,166,145,38,0,0,128,191,0,0,0,0,0,0,64,37,0,166,17,166,63,69,124,38,0,0,128,191,171,170,170,61,0,0,64,37,63,69,124,166,0,166,17,38,0,0,128,191,171,170,42,62,0,0,64,37,0,166,145,166,122,167,160,11,0,0,128,191,0,0,128,62,0,0,64,37,63,69,124,166,0,166,17,166,0,0,128,191,171,170,170,62,0,0,64,37,0,166,17,166,63,69,124,166,0,0,128,191,85,85,213,62,0,0,64,37,223,207,57,141,0,166,145,166,0,0,128,191,0,0,0,63,0,0,64,37,0,166,17,38,63,69,124,166,0,0,128,191,85,85,21,63,0,0,64,37,63,69,124,38,0,166,17,166,0,0,128,191,171,170,42,63,0,0,64,37,0,166,145,38,55,251,112,140,0,0,128,191,0,0,64,63,0,0,64,37,63,69,124,38,0,166,17,38,0,0,128,191,85,85,85,63,0,0,64,37,0,166,17,38,63,69,124,38,0,0,128,191,171,170,106,63,0,0,64,37,0,0,0,128,0,166,145,38,0,0,128,191,0,0,128,63,0,0,64,37};
163
glBufferData(GL_ARRAY_BUFFER, 1820, arrayBufferData, GL_STATIC_DRAW);
164
165
GLuint elementBuffer;
166
glGenBuffers(1, &elementBuffer);
167
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, elementBuffer);
168
GLubyte elementBufferData[] =
169
{0,0,13,0,1,0,1,0,13,0,14,0,1,0,14,0,2,0,2,0,14,0,15,0,2,0,15,0,3,0,3,0,15,0,16,0,3,0,16,0,4,0,4,0,16,0,17,0,4,0,17,0,5,0,5,0,17,0,18,0,5,0,18,0,6,0,6,0,18,0,19,0,6,0,19,0,7,0,7,0,19,0,20,0,7,0,20,0,8,0,8,0,20,0,21,0,8,0,21,0,9,0,9,0,21,0,22,0,9,0,22,0,10,0,10,0,22,0,23,0,10,0,23,0,11,0,11,0,23,0,24,0,11,0,24,0,12,0,12,0,24,0,25,0,24,0,37,0,25,0,25,0,37,0,38,0,23,0,36,0,24,0,24,0,36,0,37,0,22,0,35,0,23,0,23,0,35,0,36,0,21,0,34,0,22,0,22,0,34,0,35,0,20,0,33,0,21,0,21,0,33,0,34,0,19,0,32,0,20,0,20,0,32,0,33,0,18,0,31,0,19,0,19,0,31,0,32,0,17,0,30,0,18,0,18,0,30,0,31,0,16,0,29,0,17,0,17,0,29,0,30,0,15,0,28,0,16,0,16,0,28,0,29,0,14,0,27,0,15,0,15,0,27,0,28,0,13,0,26,0,14,0,14,0,26,0,27,0,26,0,39,0,27,0,27,0,39,0,40,0,27,0,40,0,28,0,28,0,40,0,41,0,28,0,41,0,29,0,29,0,41,0,42,0,29,0,42,0,30,0,30,0,42,0,43,0,30,0,43,0,31,0,31,0,43,0,44,0,31,0,44,0,32,0,32,0,44,0,45,0,32,0,45,0,33,0,33,0,45,0,46,0,33,0,46,0,34,0,34,0,46,0,47,0,34,0,47,0,35,0,35,0,47,0,48,0,35,0,48,0,36,0,36,0,48,0,49,0,36,0,49,0,37,0,37,0,49,0,50,0,37,0,50,0,38,0,38,0,50,0,51,0,50,0,63,0,51,0,51,0,63,0,64,0,49,0,62,0,50,0,50,0,62,0,63,0,48,0,61,0,49,0,49,0,61,0,62,0,47,0,60,0,48,0,48,0,60,0,61,0,46,0,59,0,47,0,47,0,59,0,60,0,45,0,58,0,46,0,46,0,58,0,59,0,44,0,57,0,45,0,45,0,57,0,58,0,43,0,56,0,44,0,44,0,56,0,57,0,42,0,55,0,43,0,43,0,55,0,56,0,41,0,54,0,42,0,42,0,54,0,55,0,40,0,53,0,41,0,41,0,53,0,54,0,39,0,52,0,40,0,40,0,52,0,53,0,52,0,65,0,53,0,53,0,65,0,66,0,53,0,66,0,54,0,54,0,66,0,67,0,54,0,67,0,55,0,55,0,67,0,68,0,55,0,68,0,56,0,56,0,68,0,69,0,56,0,69,0,57,0,57,0,69,0,70,0,57,0,70,0,58,0,58,0,70,0,71,0,58,0,71,0,59,0,59,0,71,0,72,0,59,0,72,0,60,0,60,0,72,0,73,0,60,0,73,0,61,0,61,0,73,0,74,0,61,0,74,0,62,0,62,0,74,0,75,0,62,0,75,0,63,0,63,0,75,0,76,0,63,0,76,0,64,0,64,0,76,0,77,0,76,0,89,0,77,0,77,0,89,0,90,0,75,0,88,0,76,0,76,0,88,0,89,0,74,0,87,0,75,0,75,0,87,0,88,0,73,0,86,0,74,0,74,0,86,0,87,0,72,0,85,0,73,0,73,0,85,0,86,0,71,0,84,0,72,0,72,0,84,0,85,0,70,0,83,0,71,0,71,0,83,0,84,0,69,0,82,0,70,0,70,0,82,0,83,0,68,0,81,0,69,0,69,0,81,0,82,0,67,0,80,0,68,0,68,0,80,0,81,0,66,0,79,0,67,0,67,0,79,0,80,0,65,0,78,0,66,0,66,0,78,0,79,0};
170
glBufferData(GL_ELEMENT_ARRAY_BUFFER, 864, elementBufferData, GL_STATIC_DRAW);
171
172
glBindBuffer(GL_ARRAY_BUFFER, arrayBuffer);
173
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, elementBuffer);
174
175
// try to confuse the client state tracker
176
glDisableClientState(GL_VERTEX_ARRAY);
177
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
178
179
glEnableClientState(GL_VERTEX_ARRAY);
180
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
181
glVertexPointer(3, GL_FLOAT, 20, 0);
182
glTexCoordPointer(2, GL_FLOAT, 20, (void*)12);
183
184
glPushMatrix();
185
glTranslated(484.50579833984375, 589.3919067382812, 528.0055541992188);
186
187
GLint texgenSLocation = glGetUniformLocation(program, "texgenS");
188
assert(texgenSLocation >= 0);
189
GLfloat texgenSData[4] = { 0.31012535095214844, 0.05928778275847435, 0.38769474625587463, 0.5 };
190
glUniform4fv(texgenSLocation, 1, texgenSData);
191
192
GLint texgenTLocation = glGetUniformLocation(program, "texgenT");
193
assert(texgenTLocation >= 0 && texgenTLocation != texgenSLocation);
194
GLfloat texgenTData[4] = { -0.12697559595108032, -0.4524572193622589, 0.17076200246810913, 0.5 };
195
glUniform4fv(texgenTLocation, 1, texgenTData);
196
197
GLint centerLocation = glGetUniformLocation(program, "center");
198
if (centerLocation >= 0) {
199
GLfloat centerData[4] = { 484.50579833984375, 589.3919067382812, 528.0055541992188, 0 };
200
glUniform4fv(centerLocation, 1, centerData);
201
}
202
203
GLint animstateLocation = glGetUniformLocation(program, "animstate");
204
assert(animstateLocation >= 0);
205
GLfloat animstateData[4] = { 1, 55, 51, 10709 };
206
glUniform4fv(animstateLocation, 1, animstateData);
207
208
glRotated(1529.857142857143, 0.5773502588272095, 0.5773502588272095, 0.5773502588272095);
209
glScaled(-55, 55, -55);
210
glActiveTexture(GL_TEXTURE0);
211
glBindTexture(GL_TEXTURE_2D, texture); // XXX this is after setting Pointers, do we miss it? Also, does it not need clientActiveTexture - should we have updated that?
212
glActiveTexture(GL_TEXTURE0);
213
glColor4f(1, 0.158823529411764705, 0.058823529411764705, 1);
214
215
glDrawElements(GL_TRIANGLES, 432, GL_UNSIGNED_SHORT, 0);
216
217
// END
218
219
SDL_GL_SwapBuffers();
220
221
assert(glIsTexture(texture)); // still a texture
222
glDeleteTextures(1, &texture);
223
assert(!glIsTexture(texture)); // but not anymore
224
225
#ifndef __EMSCRIPTEN__
226
SDL_Delay(1500);
227
#endif
228
229
SDL_Quit();
230
231
return 0;
232
}
233
234