webgl-tools

view glass.js @ 0:4fe036e28796

initial commit
author John Tsiombikas <nuclear@member.fsf.org>
date Wed, 15 Jun 2011 20:04:49 +0300
parents
children c52b17d412f3
line source
1 /*
2 glass - (web)gl-assistant.
3 Copyright (C) 2011 John Tsiombikas <nuclear@member.fsf.org>
5 This program is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation, either version 3 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
17 */
19 var gl;
20 var canvas, console;
21 var glass_data_loaded, glass_data_count;
22 var glass_progr_prog;
23 var glass_start_time = 0;
25 var glass_cb_disp = null;
27 function glass_init(canv_id, cons_id)
28 {
29 if(cons_id && (console = document.getElementById(cons_id))) {
30 console.value = "";
31 }
33 if(!(canvas = document.getElementById(canv_id))) {
34 logmsg("canvas \"" + canv_id + "\" does not exist\n");
35 return false;
36 }
37 try {
38 gl = canvas.getContext("experimental-webgl");
39 }
40 catch(e) {
41 logmsg("can't get an OpenGL context\n");
42 return false;
43 }
45 var vs = create_shader(glass_progr_vs_src, gl.VERTEX_SHADER);
46 var ps = create_shader(glass_progr_ps_src, gl.FRAGMENT_SHADER);
47 if(!vs || !ps || !(glass_progr_prog = create_program(vs, ps))) {
48 logmsg("internal glass error\n");
49 return false;
50 }
52 glass_data_loaded = glass_data_count = 0;
53 return true;
54 }
56 function glass_start()
57 {
58 glass_start_time = get_msec();
59 glass_redraw();
60 }
62 function glass_display_func(func)
63 {
64 glass_cb_disp = func;
65 }
67 function glass_redraw()
68 {
69 var msec = get_msec();
71 if(glass_data_loaded < glass_data_count || !glass_cb_disp) {
72 glass_draw_progress(msec);
73 } else {
74 glass_cb_disp(msec);
75 }
76 request_redisplay(glass_redraw);
77 }
79 function get_msec()
80 {
81 return new Date().getTime() - glass_start_time;
82 }
84 /* ---- textures ---- */
85 function load_texture(name)
86 {
87 glass_data_count++;
89 var tex = gl.createTexture();
90 tex.image = new Image();
91 tex.image.onload = function() { glass_tex_load_done(tex); }
92 tex.image.onerror = glass_tex_load_failed;
93 tex.image.src = name;
94 return tex;
95 }
97 function glass_tex_load_done(tex)
98 {
99 gl.bindTexture(gl.TEXTURE_2D, tex);
100 gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, tex.image);
101 gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
102 gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
103 gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT);
104 gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT);
105 gl.bindTexture(gl.TEXTURE_2D, null);
106 glass_data_loaded++;
107 logmsg("loaded image: " + tex.image.src +
108 " (" + glass_data_loaded + "/" + glass_data_count + ")\n");
109 }
111 function glass_tex_load_failed()
112 {
113 logmsg("failed to load texture: " + this.src + "\n");
114 }
117 /* ---- shaders ---- */
118 function load_shader(name, type)
119 {
120 var xhr = new XMLHttpRequest();
121 xhr.open("GET", name, false);
122 xhr.overrideMimeType("text/plain");
123 xhr.send(null);
125 var src = xhr.responseText;
126 return create_shader(src, type);
127 }
129 function create_shader(src, type)
130 {
131 var sdr = gl.createShader(type);
132 gl.shaderSource(sdr, src);
133 gl.compileShader(sdr);
135 if(!gl.getShaderParameter(sdr, gl.COMPILE_STATUS)) {
136 logmsg("failed to compile shader: " + elem.src + ": " + gl.getShaderInfoLog(sdr));
137 return null;
138 }
139 return sdr;
140 }
142 function load_program(vsname, psname)
143 {
144 var vs, ps;
146 if(!(vs = load_shader(vsname, gl.VERTEX_SHADER))) {
147 return null;
148 }
149 if(!(ps = load_shader(psname, gl.FRAGMENT_SHADER))) {
150 return null;
151 }
152 return create_program(vs, ps);
153 }
155 function create_program(vs, ps)
156 {
157 var prog = gl.createProgram();
158 gl.attachShader(prog, vs);
159 gl.attachShader(prog, ps);
160 gl.linkProgram(prog);
162 if(!gl.getProgramParameter(prog, gl.LINK_STATUS)) {
163 logmsg("Failed to link GLSL program (" + vsname + " - " + psname + ")\n");
164 return null;
165 }
166 return prog;
167 }
169 function logmsg(str)
170 {
171 if(console) {
172 console.value += str;
173 }
174 }
176 window.request_redisplay = (function() {
177 return window.requestAnimationFrame ||
178 window.webkitRequestAnimationFrame ||
179 window.mozRequestAnimationFrame ||
180 window.oRequestAnimationFrame ||
181 window.msRequestAnimationFrame ||
182 function(callback, element) { window.setTimeout(callback, 1000/60); };
183 })();
186 var glass_progr_vs_src =
187 "attribute vec4 attr_vertex, attr_color;\n" +
188 "uniform mat4 mvmat, projmat;\n" +
189 "varying vec4 color;\n" +
190 "void main()\n{\n" +
191 "\tmat4 mvp = projmat * mvmat;\n" +
192 "\tgl_Position = mvp * attr_vertex;\n" +
193 "\tcolor = attr_color;\n}\n";
195 var glass_progr_ps_src =
196 "precision highp float;\n" +
197 "varying vec4 color;\n" +
198 "void main()\n{\n" +
199 "\tgl_FragColor = color;\n}\n";
201 function glass_draw_progress(msec)
202 {
203 glMatrixMode(GL_PROJECTION);
204 glPushMatrix();
205 glLoadIdentity();
207 glMatrixMode(GL_MODELVIEW);
208 glPushMatrix();
209 glLoadIdentity();
211 gl.clearColor(0, 0, 0, 1);
212 gl.clear(gl.COLOR_BUFFER_BIT);
214 var progr = glass_data_loaded / glass_data_count;
216 gl.useProgram(glass_progr_prog);
218 glBegin(GL_QUADS);
219 glColor3f(0.3, 0.5, 0.8);
220 glVertex2f(-0.55, -0.1);
221 glVertex2f(0.55, -0.1);
222 glVertex2f(0.55, 0.1);
223 glVertex2f(-0.55, 0.1);
225 glColor3f(0, 0, 0);
226 glVertex2f(-0.525, -0.075);
227 glVertex2f(0.525, -0.075);
228 glVertex2f(0.525, 0.075);
229 glVertex2f(-0.525, 0.075);
231 glColor3f(1.0, 0.3, 0.2);
232 glVertex2f(-0.5, -0.05);
233 glVertex2f(progr - 0.5, -0.05);
234 glVertex2f(progr - 0.5, 0.05);
235 glVertex2f(-0.5, 0.05);
236 glEnd();
238 glMatrixMode(GL_PROJECTION);
239 glPopMatrix();
240 glMatrixMode(GL_MODELVIEW);
241 glPopMatrix();
242 }