webgl-tools

annotate sanegl.js @ 8:056da157f21f

merged something ... can't remember what
author John Tsiombikas <nuclear@member.fsf.org>
date Thu, 18 Aug 2011 00:09:14 +0300
parents 56ae66e32998
children
rev   line source
nuclear@0 1 /*
nuclear@0 2 SaneGL - a small library to bring back sanity to WebGL
nuclear@0 3 Copyright (C) 2011 John Tsiombikas <nuclear@member.fsf.org>
nuclear@0 4
nuclear@0 5 This program is free software: you can redistribute it and/or modify
nuclear@0 6 it under the terms of the GNU General Public License as published by
nuclear@0 7 the Free Software Foundation, either version 3 of the License, or
nuclear@0 8 (at your option) any later version.
nuclear@0 9
nuclear@0 10 This program is distributed in the hope that it will be useful,
nuclear@0 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
nuclear@0 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
nuclear@0 13 GNU General Public License for more details.
nuclear@0 14
nuclear@0 15 You should have received a copy of the GNU General Public License
nuclear@0 16 along with this program. If not, see <http://www.gnu.org/licenses/>.
nuclear@0 17 */
nuclear@0 18 const GL_MODELVIEW = 0;
nuclear@0 19 const GL_PROJECTION = 1;
nuclear@0 20 const GL_TEXTURE = 2;
nuclear@0 21
nuclear@0 22 const GL_POINTS = 1;
nuclear@0 23 const GL_LINES = 2;
nuclear@0 24 const GL_TRIANGLES = 3;
nuclear@0 25 const GL_QUADS = 4;
nuclear@0 26
nuclear@0 27 var gl_ident_val = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];
nuclear@0 28 var gl_mmode = GL_MODELVIEW;
nuclear@0 29 var gl_mat = new Array(
nuclear@0 30 [new Float32Array(gl_ident_val)],
nuclear@0 31 [new Float32Array(gl_ident_val)],
nuclear@0 32 [new Float32Array(gl_ident_val)]);
nuclear@0 33
nuclear@3 34 const GL_MAX_VERTS = 512;
nuclear@0 35
nuclear@0 36 var gl_prim = 0;
nuclear@7 37 var gl_vbuf = null, gl_nbuf = null, gl_cbuf = null, gl_tbuf = null, gl_abuf = null;
nuclear@7 38 var gl_vertex, gl_normal, gl_color, gl_texcoord, gl_attrib;
nuclear@0 39 var gl_nverts, gl_vert_calls;
nuclear@0 40 var gl_curr_normal = new Float32Array(3);
nuclear@0 41 var gl_curr_color = new Float32Array(4);
nuclear@0 42 var gl_curr_texcoord = new Float32Array(2);
nuclear@7 43 var gl_curr_attrib = new Float32Array(4);
nuclear@7 44 var gl_vloc, gl_nloc, gl_cloc, gl_tloc, gl_aloc;
nuclear@7 45 var gl_use_normal, gl_use_color, gl_use_texcoord, gl_use_attrib;
nuclear@0 46
nuclear@0 47 function glMatrixMode(mode)
nuclear@0 48 {
nuclear@0 49 gl_mmode = mode;
nuclear@0 50 }
nuclear@0 51
nuclear@0 52 function glPushMatrix()
nuclear@0 53 {
nuclear@0 54 var mtop = gl_mat[gl_mmode].length - 1;
nuclear@0 55
nuclear@0 56 gl_mat[gl_mmode].push(new Float32Array(16));
nuclear@0 57 m4_copy(gl_mat[gl_mmode][mtop + 1], gl_mat[gl_mmode][mtop]);
nuclear@0 58 }
nuclear@0 59
nuclear@0 60 function glPopMatrix()
nuclear@0 61 {
nuclear@0 62 if(gl_mat[gl_mmode].length <= 1) {
nuclear@0 63 alert('glPopMatrix underflow');
nuclear@0 64 }
nuclear@0 65 gl_mat[gl_mmode].pop();
nuclear@0 66 }
nuclear@0 67
nuclear@0 68 function glLoadIdentity()
nuclear@0 69 {
nuclear@0 70 var mtop = gl_mat[gl_mmode].length - 1;
nuclear@0 71 m4_identity(gl_mat[gl_mmode][mtop]);
nuclear@0 72 }
nuclear@0 73
nuclear@0 74 function glLoadMatrixf(mat)
nuclear@0 75 {
nuclear@0 76 var mtop = gl_mat[gl_mmode].length - 1;
nuclear@0 77 m4_copy(gl_mat[gl_mmode][mtop], mat);
nuclear@0 78 }
nuclear@0 79
nuclear@0 80 function glMultMatrixf(mat)
nuclear@0 81 {
nuclear@0 82 var mtop = gl_mat[gl_mmode].length - 1;
nuclear@0 83 m4_mul(gl_mat[gl_mmode][mtop], gl_mat[gl_mmode][mtop], mat);
nuclear@0 84 }
nuclear@0 85
nuclear@0 86 function glTranslatef(x, y, z)
nuclear@0 87 {
nuclear@0 88 var xform = new Float32Array(16);
nuclear@0 89 m4_translation(xform, x, y, z);
nuclear@0 90 glMultMatrixf(xform);
nuclear@0 91 }
nuclear@0 92
nuclear@0 93 function glRotatef(angle, x, y, z)
nuclear@0 94 {
nuclear@0 95 var angle_rads = Math.PI * angle / 180.0;
nuclear@0 96 var xform = new Float32Array(16);
nuclear@0 97 m4_rotation(xform, angle_rads, x, y, z);
nuclear@0 98 glMultMatrixf(xform);
nuclear@0 99 }
nuclear@0 100
nuclear@0 101 function glScalef(x, y, z)
nuclear@0 102 {
nuclear@0 103 var xform = new Float32Array(16);
nuclear@0 104 m4_scale(xform, x, y, z);
nuclear@0 105 glMultMatrixf(xform);
nuclear@0 106 }
nuclear@0 107
nuclear@0 108 function glOrtho(left, right, bottom, top, near, far)
nuclear@0 109 {
nuclear@0 110 var dx = right - left;
nuclear@0 111 var dy = top - bottom;
nuclear@0 112 var dz = far - near;
nuclear@0 113
nuclear@0 114 var tx = -(right + left) / dx;
nuclear@0 115 var ty = -(top + bottom) / dy;
nuclear@0 116 var tz = -(far + near) / dz;
nuclear@0 117
nuclear@0 118 var sx = 2.0 / dx;
nuclear@0 119 var sy = 2.0 / dy;
nuclear@0 120 var sz = -2.0 / dz;
nuclear@0 121
nuclear@0 122 var xform = new Float32Array(16);
nuclear@0 123 xform[0] = sx;
nuclear@0 124 xform[5] = sy;
nuclear@0 125 xform[10] = sz;
nuclear@0 126 xform[12] = tx;
nuclear@0 127 xform[13] = ty;
nuclear@0 128 xform[14] = tz;
nuclear@0 129 xform[15] = 1.0;
nuclear@0 130 xform[1] = xform[2] = xform[3] = xform[4] = xform[6] = xform[7] = xform[8] = xform[9] = 0.0;
nuclear@0 131
nuclear@0 132 glMultMatrixf(xform);
nuclear@0 133 }
nuclear@0 134
nuclear@0 135 function glFrustum(left, right, bottom, top, near, far)
nuclear@0 136 {
nuclear@0 137 var dx = right - left;
nuclear@0 138 var dy = top - bottom;
nuclear@0 139 var dz = far - near;
nuclear@0 140
nuclear@0 141 var a = (right + left) / dx;
nuclear@0 142 var b = (top + bottom) / dy;
nuclear@0 143 var c = -(far + near) / dz;
nuclear@0 144 var d = -2.0 * far * near / dz;
nuclear@0 145
nuclear@0 146 var xform = new Float32Array(16);
nuclear@0 147 xform[0] = 2.0 * near / dx;
nuclear@0 148 xform[5] = 2.0 * near / dy;
nuclear@0 149 xform[8] = a;
nuclear@0 150 xform[9] = b;
nuclear@0 151 xform[10] = c;
nuclear@0 152 xform[11] = -1.0;
nuclear@0 153 xform[14] = d;
nuclear@0 154 xform[1] = xform[2] = xform[3] = xform[4] = xform[6] = xform[7] = xform[12] = xform[13] = xform[15] = 0.0;
nuclear@0 155
nuclear@0 156 glMultMatrixf(xform);
nuclear@0 157 }
nuclear@0 158
nuclear@3 159 function gluPerspective(vfov, aspect, near, far)
nuclear@3 160 {
nuclear@3 161 var x = near * Math.tan(vfov / 2.0);
nuclear@3 162 glFrustum(-aspect * x, aspect * x, -x, x, near, far);
nuclear@3 163 }
nuclear@3 164
nuclear@0 165 function gl_apply_xform(prog)
nuclear@0 166 {
nuclear@0 167 var mvtop = gl_mat[GL_MODELVIEW].length - 1;
nuclear@0 168 var ptop = gl_mat[GL_PROJECTION].length - 1;
nuclear@0 169 var ttop = gl_mat[GL_TEXTURE].length - 1;
nuclear@0 170
nuclear@0 171 var loc = gl.getUniformLocation(prog, "mvmat");
nuclear@0 172 if(loc != -1) {
nuclear@2 173 gl.uniformMatrix4fv(loc, false, gl_mat[GL_MODELVIEW][mvtop]);
nuclear@0 174 }
nuclear@0 175
nuclear@0 176 loc = gl.getUniformLocation(prog, "projmat");
nuclear@0 177 if(loc != -1) {
nuclear@2 178 gl.uniformMatrix4fv(loc, false, gl_mat[GL_PROJECTION][ptop]);
nuclear@0 179 }
nuclear@0 180
nuclear@0 181 loc = gl.getUniformLocation(prog, "texmat");
nuclear@0 182 if(loc != -1) {
nuclear@2 183 gl.uniformMatrix4fv(loc, false, gl_mat[GL_TEXTURE][ttop]);
nuclear@2 184 }
nuclear@2 185
nuclear@2 186 loc = gl.getUniformLocation(prog, "normmat");
nuclear@2 187 if(loc != -1) {
nuclear@7 188 var normmat = new Float32Array(9);
nuclear@7 189 normmat[0] = gl_mat[GL_MODELVIEW][mvtop][0];
nuclear@7 190 normmat[1] = gl_mat[GL_MODELVIEW][mvtop][1];
nuclear@7 191 normmat[2] = gl_mat[GL_MODELVIEW][mvtop][2];
nuclear@7 192 normmat[3] = gl_mat[GL_MODELVIEW][mvtop][4];
nuclear@7 193 normmat[4] = gl_mat[GL_MODELVIEW][mvtop][5];
nuclear@7 194 normmat[5] = gl_mat[GL_MODELVIEW][mvtop][6];
nuclear@7 195 normmat[6] = gl_mat[GL_MODELVIEW][mvtop][8];
nuclear@7 196 normmat[7] = gl_mat[GL_MODELVIEW][mvtop][9];
nuclear@7 197 normmat[8] = gl_mat[GL_MODELVIEW][mvtop][10];
nuclear@7 198 gl.uniformMatrix3fv(loc, false, normmat);
nuclear@0 199 }
nuclear@0 200 }
nuclear@0 201
nuclear@0 202 function glBegin(prim)
nuclear@0 203 {
nuclear@0 204 gl_vertex = new Float32Array(GL_MAX_VERTS * 4);
nuclear@0 205 gl_normal = new Float32Array(GL_MAX_VERTS * 3);
nuclear@0 206 gl_color = new Float32Array(GL_MAX_VERTS * 4);
nuclear@0 207 gl_texcoord = new Float32Array(GL_MAX_VERTS * 4);
nuclear@7 208 gl_attrib = new Float32Array(GL_MAX_VERTS * 4);
nuclear@0 209
nuclear@0 210 if(gl_vbuf == null) {
nuclear@0 211 gl_vbuf = gl.createBuffer();
nuclear@0 212 gl.bindBuffer(gl.ARRAY_BUFFER, gl_vbuf);
nuclear@0 213 gl.bufferData(gl.ARRAY_BUFFER, GL_MAX_VERTS * 4 * Float32Array.BYTES_PER_ELEMENT, gl.STREAM_DRAW);
nuclear@0 214 logmsg("vertex buffer size: " + gl.getBufferParameter(gl.ARRAY_BUFFER, gl.BUFFER_SIZE) + "\n");
nuclear@0 215
nuclear@0 216 gl_nbuf = gl.createBuffer();
nuclear@0 217 gl.bindBuffer(gl.ARRAY_BUFFER, gl_nbuf);
nuclear@0 218 gl.bufferData(gl.ARRAY_BUFFER, GL_MAX_VERTS * 3 * Float32Array.BYTES_PER_ELEMENT, gl.STREAM_DRAW);
nuclear@0 219 logmsg("normal buffer size: " + gl.getBufferParameter(gl.ARRAY_BUFFER, gl.BUFFER_SIZE) + "\n");
nuclear@0 220
nuclear@0 221 gl_cbuf = gl.createBuffer();
nuclear@0 222 gl.bindBuffer(gl.ARRAY_BUFFER, gl_cbuf);
nuclear@0 223 gl.bufferData(gl.ARRAY_BUFFER, GL_MAX_VERTS * 4 * Float32Array.BYTES_PER_ELEMENT, gl.STREAM_DRAW);
nuclear@0 224 logmsg("color buffer size: " + gl.getBufferParameter(gl.ARRAY_BUFFER, gl.BUFFER_SIZE) + "\n");
nuclear@0 225
nuclear@0 226 gl_tbuf = gl.createBuffer();
nuclear@0 227 gl.bindBuffer(gl.ARRAY_BUFFER, gl_tbuf);
nuclear@0 228 gl.bufferData(gl.ARRAY_BUFFER, GL_MAX_VERTS * 4 * Float32Array.BYTES_PER_ELEMENT, gl.STREAM_DRAW);
nuclear@0 229 logmsg("texcoord buffer size: " + gl.getBufferParameter(gl.ARRAY_BUFFER, gl.BUFFER_SIZE) + "\n");
nuclear@7 230
nuclear@7 231 gl_abuf = gl.createBuffer();
nuclear@7 232 gl.bindBuffer(gl.ARRAY_BUFFER, gl_abuf);
nuclear@7 233 gl.bufferData(gl.ARRAY_BUFFER, GL_MAX_VERTS * 4 * Float32Array.BYTES_PER_ELEMENT, gl.STREAM_DRAW);
nuclear@7 234 logmsg("custom attrib buffer size: " + gl.getBufferParameter(gl.ARRAY_BUFFER, gl.BUFFER_SIZE) + "\n");
nuclear@0 235 }
nuclear@0 236
nuclear@0 237 gl_prim = prim;
nuclear@0 238 gl_nverts = gl_vert_calls = 0;
nuclear@0 239
nuclear@0 240 gl_prog = gl.getParameter(gl.CURRENT_PROGRAM);
nuclear@0 241 if(gl_prog != null) {
nuclear@0 242 gl_apply_xform(gl_prog);
nuclear@0 243
nuclear@0 244 gl_vloc = gl.getAttribLocation(gl_prog, "attr_vertex");
nuclear@0 245 gl_nloc = gl.getAttribLocation(gl_prog, "attr_normal");
nuclear@0 246 gl_cloc = gl.getAttribLocation(gl_prog, "attr_color");
nuclear@0 247 gl_tloc = gl.getAttribLocation(gl_prog, "attr_texcoord");
nuclear@0 248 } else {
nuclear@0 249 logmsg("no program currently bound\n");
nuclear@0 250 gl_vloc = gl_nloc = gl_cloc = gl_tloc = -1;
nuclear@0 251 }
nuclear@0 252
nuclear@0 253 if(gl_vloc == -1) {
nuclear@0 254 logmsg("attr_vertex not found in currently bound program: " + prog + "\n");
nuclear@0 255 }
nuclear@0 256
nuclear@0 257 gl_use_normal = gl_nloc != -1;
nuclear@0 258 gl_use_color = gl_cloc != -1;
nuclear@0 259 gl_use_texcoord = gl_tloc != -1;
nuclear@7 260
nuclear@7 261 gl_aloc = -1;
nuclear@0 262 }
nuclear@0 263
nuclear@0 264 function glEnd()
nuclear@0 265 {
nuclear@0 266 if(gl_nverts > 0) {
nuclear@0 267 gl_draw_immediate();
nuclear@0 268 }
nuclear@0 269 }
nuclear@0 270
nuclear@0 271 function gl_draw_immediate()
nuclear@0 272 {
nuclear@0 273 var gles_prim;
nuclear@0 274
nuclear@0 275 if(gl_vloc == -1) {
nuclear@0 276 return;
nuclear@0 277 }
nuclear@0 278
nuclear@0 279 switch(gl_prim) {
nuclear@0 280 case GL_POINTS:
nuclear@0 281 gles_prim = gl.POINTS;
nuclear@0 282 break;
nuclear@0 283 case GL_LINES:
nuclear@0 284 gles_prim = gl.LINES;
nuclear@0 285 break;
nuclear@0 286 case GL_TRIANGLES:
nuclear@0 287 case GL_QUADS:
nuclear@0 288 gles_prim = gl.TRIANGLES;
nuclear@0 289 break;
nuclear@0 290 default:
nuclear@0 291 }
nuclear@0 292
nuclear@0 293 gl.bindBuffer(gl.ARRAY_BUFFER, gl_vbuf);
nuclear@0 294 gl.bufferSubData(gl.ARRAY_BUFFER, 0, gl_vertex);
nuclear@0 295 gl.vertexAttribPointer(gl_vloc, 4, gl.FLOAT, false, 0, 0);
nuclear@0 296 gl.enableVertexAttribArray(gl_vloc);
nuclear@0 297
nuclear@0 298 if(gl_use_normal) {
nuclear@0 299 gl.bindBuffer(gl.ARRAY_BUFFER, gl_nbuf);
nuclear@0 300 gl.bufferSubData(gl.ARRAY_BUFFER, 0, gl_normal);
nuclear@0 301 gl.vertexAttribPointer(gl_nloc, 3, gl.FLOAT, false, 0, 0);
nuclear@0 302 gl.enableVertexAttribArray(gl_nloc);
nuclear@0 303 }
nuclear@0 304
nuclear@0 305 if(gl_use_color) {
nuclear@0 306 gl.bindBuffer(gl.ARRAY_BUFFER, gl_cbuf);
nuclear@0 307 gl.bufferSubData(gl.ARRAY_BUFFER, 0, gl_color);
nuclear@0 308 gl.vertexAttribPointer(gl_cloc, 4, gl.FLOAT, true, 0, 0);
nuclear@0 309 gl.enableVertexAttribArray(gl_cloc);
nuclear@0 310 }
nuclear@0 311
nuclear@0 312 if(gl_use_texcoord) {
nuclear@0 313 gl.bindBuffer(gl.ARRAY_BUFFER, gl_tbuf);
nuclear@0 314 gl.bufferSubData(gl.ARRAY_BUFFER, 0, gl_texcoord);
nuclear@0 315 gl.vertexAttribPointer(gl_tloc, 4, gl.FLOAT, false, 0, 0);
nuclear@0 316 gl.enableVertexAttribArray(gl_tloc);
nuclear@0 317 }
nuclear@0 318
nuclear@7 319 if(gl_aloc != -1) {
nuclear@7 320 gl.bindBuffer(gl.ARRAY_BUFFER, gl_abuf);
nuclear@7 321 gl.bufferSubData(gl.ARRAY_BUFFER, 0, gl_attrib);
nuclear@7 322 gl.vertexAttribPointer(gl_aloc, 4, gl.FLOAT, false, 0, 0);
nuclear@7 323 gl.enableVertexAttribArray(gl_aloc);
nuclear@7 324 }
nuclear@7 325
nuclear@0 326 gl.drawArrays(gles_prim, 0, gl_nverts);
nuclear@0 327
nuclear@0 328 gl.disableVertexAttribArray(gl_vloc);
nuclear@0 329 if(gl_use_normal) {
nuclear@0 330 gl.disableVertexAttribArray(gl_nloc);
nuclear@0 331 }
nuclear@0 332 if(gl_use_color) {
nuclear@0 333 gl.disableVertexAttribArray(gl_cloc);
nuclear@0 334 }
nuclear@0 335 if(gl_use_texcoord) {
nuclear@0 336 gl.disableVertexAttribArray(gl_tloc);
nuclear@0 337 }
nuclear@7 338 if(gl_aloc != -1) {
nuclear@7 339 gl.disableVertexAttribArray(gl_aloc);
nuclear@7 340 }
nuclear@0 341 }
nuclear@0 342
nuclear@0 343
nuclear@0 344 function glVertex2f(x, y)
nuclear@0 345 {
nuclear@0 346 glVertex3f(x, y, 0.0);
nuclear@0 347 }
nuclear@0 348
nuclear@0 349 function glVertex3f(x, y, z)
nuclear@0 350 {
nuclear@0 351 var i = 0;
nuclear@0 352 var vidx = gl_nverts * 4;
nuclear@0 353 var nidx = gl_nverts * 3;
nuclear@0 354
nuclear@0 355 if(gl_prim == GL_QUADS && gl_vert_calls % 4 == 3) {
nuclear@0 356 var v = vidx - 12;
nuclear@0 357 var n = nidx - 9;
nuclear@0 358
nuclear@0 359 for(i=0; i<4; i++) {
nuclear@7 360 if(gl_aloc != -1) {
nuclear@7 361 gl_attrib[vidx] = gl_attrib[v];
nuclear@7 362 }
nuclear@0 363 if(gl_use_color) {
nuclear@0 364 gl_color[vidx] = gl_color[v];
nuclear@0 365 }
nuclear@0 366 if(gl_use_texcoord) {
nuclear@0 367 gl_texcoord[vidx] = gl_texcoord[v];
nuclear@0 368 }
nuclear@0 369 gl_vertex[vidx++] = gl_vertex[v++];
nuclear@0 370
nuclear@0 371 if(gl_use_normal && i < 3) {
nuclear@0 372 gl_normal[nidx++] = gl_normal[n++];
nuclear@0 373 }
nuclear@0 374 }
nuclear@0 375 v += 4;
nuclear@0 376 n += 3;
nuclear@0 377 for(i=0; i<4; i++) {
nuclear@7 378 if(gl_aloc != -1) {
nuclear@7 379 gl_attrib[vidx] = gl_attrib[v];
nuclear@7 380 }
nuclear@0 381 if(gl_use_color) {
nuclear@0 382 gl_color[vidx] = gl_color[v];
nuclear@0 383 }
nuclear@0 384 if(gl_use_texcoord) {
nuclear@0 385 gl_texcoord[vidx] = gl_texcoord[v];
nuclear@0 386 }
nuclear@0 387 gl_vertex[vidx++] = gl_vertex[v++];
nuclear@0 388
nuclear@0 389 if(gl_use_normal && i < 3) {
nuclear@0 390 gl_normal[nidx++] = gl_normal[n++];
nuclear@0 391 }
nuclear@0 392 }
nuclear@0 393
nuclear@0 394 gl_nverts += 2;
nuclear@0 395 }
nuclear@0 396
nuclear@0 397 gl_vertex[vidx] = x;
nuclear@0 398 gl_vertex[vidx + 1] = y;
nuclear@0 399 gl_vertex[vidx + 2] = z;
nuclear@0 400 gl_vertex[vidx + 3] = 1.0;
nuclear@0 401
nuclear@0 402 if(gl_use_color) {
nuclear@0 403 gl_color[vidx] = gl_curr_color[0];
nuclear@0 404 gl_color[vidx + 1] = gl_curr_color[1];
nuclear@0 405 gl_color[vidx + 2] = gl_curr_color[2];
nuclear@0 406 gl_color[vidx + 3] = gl_curr_color[3];
nuclear@0 407 }
nuclear@0 408
nuclear@0 409 if(gl_use_normal) {
nuclear@0 410 gl_normal[nidx] = gl_curr_normal[0];
nuclear@0 411 gl_normal[nidx + 1] = gl_curr_normal[1];
nuclear@0 412 gl_normal[nidx + 2] = gl_curr_normal[2];
nuclear@0 413 }
nuclear@0 414
nuclear@0 415 if(gl_use_texcoord) {
nuclear@0 416 gl_texcoord[vidx] = gl_curr_texcoord[0];
nuclear@0 417 gl_texcoord[vidx + 1] = gl_curr_texcoord[1];
nuclear@7 418 gl_texcoord[vidx + 2] = 0.0;
nuclear@7 419 gl_texcoord[vidx + 3] = 1.0;
nuclear@7 420 }
nuclear@7 421
nuclear@7 422 if(gl_aloc != -1) {
nuclear@7 423 gl_attrib[vidx] = gl_curr_attrib[0];
nuclear@7 424 gl_attrib[vidx + 1] = gl_curr_attrib[1];
nuclear@7 425 gl_attrib[vidx + 2] = gl_curr_attrib[2];
nuclear@7 426 gl_attrib[vidx + 3] = gl_curr_attrib[3];
nuclear@0 427 }
nuclear@0 428
nuclear@0 429 gl_vert_calls++;
nuclear@3 430 gl_nverts++;
nuclear@3 431
nuclear@3 432 var buffer_full;
nuclear@3 433 if(gl_prim == GL_QUADS) {
nuclear@3 434 /* leave space for 6 more worst-case and don't allow flushes mid-quad */
nuclear@3 435 buffer_full = gl_nverts >= GL_MAX_VERTS - 6 && gl_vert_calls % 4 == 0;
nuclear@3 436 } else {
nuclear@3 437 buffer_full = gl_nverts >= GL_MAX_VERTS - gl_prim;
nuclear@3 438 }
nuclear@3 439
nuclear@3 440 if(buffer_full) {
nuclear@0 441 gl_draw_immediate();
nuclear@0 442 glBegin(gl_prim); /* reset everything */
nuclear@0 443 }
nuclear@0 444 }
nuclear@0 445
nuclear@0 446 function glNormal3f(x, y, z)
nuclear@0 447 {
nuclear@0 448 gl_curr_normal[0] = x;
nuclear@0 449 gl_curr_normal[1] = y;
nuclear@0 450 gl_curr_normal[3] = z;
nuclear@0 451 }
nuclear@0 452
nuclear@0 453 function glColor3f(r, g, b)
nuclear@0 454 {
nuclear@0 455 gl_curr_color[0] = r;
nuclear@0 456 gl_curr_color[1] = g;
nuclear@0 457 gl_curr_color[2] = b;
nuclear@0 458 gl_curr_color[3] = 1.0;
nuclear@0 459 }
nuclear@0 460
nuclear@0 461 function glColor4f(r, g, b, a)
nuclear@0 462 {
nuclear@0 463 gl_curr_color[0] = r;
nuclear@0 464 gl_curr_color[1] = g;
nuclear@0 465 gl_curr_color[2] = b;
nuclear@0 466 gl_curr_color[3] = a;
nuclear@0 467 }
nuclear@0 468
nuclear@0 469 function glTexCoord1f(s)
nuclear@0 470 {
nuclear@0 471 gl_curr_texcoord[0] = s;
nuclear@0 472 gl_curr_texcoord[1] = 0.0;
nuclear@0 473 }
nuclear@0 474
nuclear@0 475 function glTexCoord2f(s, t)
nuclear@0 476 {
nuclear@0 477 gl_curr_texcoord[0] = s;
nuclear@0 478 gl_curr_texcoord[1] = t;
nuclear@0 479 }
nuclear@7 480
nuclear@7 481 function glVertexAttrib2f(loc, x, y)
nuclear@7 482 {
nuclear@7 483 gl_aloc = loc;
nuclear@7 484 gl_curr_attrib[0] = x;
nuclear@7 485 gl_curr_attrib[1] = y;
nuclear@7 486 gl_curr_attrib[2] = 0.0;
nuclear@7 487 gl_curr_attrib[3] = 1.0;
nuclear@7 488 }
nuclear@7 489
nuclear@7 490 function glVertexAttrib3f(loc, x, y, z)
nuclear@7 491 {
nuclear@7 492 gl_aloc = loc;
nuclear@7 493 gl_curr_attrib[0] = x;
nuclear@7 494 gl_curr_attrib[1] = y;
nuclear@7 495 gl_curr_attrib[2] = z;
nuclear@7 496 gl_curr_attrib[3] = 1.0;
nuclear@7 497 }
nuclear@7 498
nuclear@7 499 function glVertexAttrib4f(loc, x, y, z, w)
nuclear@7 500 {
nuclear@7 501 gl_aloc = loc;
nuclear@7 502 gl_curr_attrib[0] = x;
nuclear@7 503 gl_curr_attrib[1] = y;
nuclear@7 504 gl_curr_attrib[2] = z;
nuclear@7 505 gl_curr_attrib[3] = w;
nuclear@7 506 }