//"use strict";
// XXX FIXME Hardcoded '4' in many places, here and in library_SDL, for RGBA
var LibraryGL = {
$GL: {
hashtable: function(name) {
if (!this._hashtables) {
this._hashtables = {};
}
if (!(name in this._hashtables)) {
this._hashtables[name] = {
table: {},
counter: 1,
add: function(obj) {
var id = this.counter++;
this.table[id] = obj;
return id;
},
get: function(id) {
if( id == 0 ) return null;
#if ASSERTIONS
assert(id < this.counter, "Invalid id " + id + " for the hashtable " + name);
#endif
return this.table[id];
},
remove: function(id) {
if( id == 0 ) return;
#if ASSERTIONS
assert(id < this.counter, "Invalid id " + id + " for the hashtable " + name);
#endif
delete this.table[id];
},
lookup: function(v) {
for (var i = 1; i < this.counter; i++)
if (this.table[i] == v)
return i;
return 0;
},
};
}
return this._hashtables[name];
},
},
glGetString: function(name_) {
switch(name_) {
case Module.ctx.VENDOR:
case Module.ctx.RENDERER:
case Module.ctx.VERSION:
return allocate(intArrayFromString(Module.ctx.getParameter(name_)), 'i8', ALLOC_NORMAL);
case 0x1F03: // Extensions
return allocate(intArrayFromString(Module.ctx.getSupportedExtensions().join(' ')), 'i8', ALLOC_NORMAL);
default:
throw 'Failure: Invalid glGetString value: ' + name_;
}
},
glGenIntegerv__deps: ['$GL'],
glGetIntegerv: function(name_, p) {
var v = Module.ctx.getParameter(name_);
if (name_ == Module.ctx.CURRENT_PROGRAM)
v = GL.hashtable("program").lookup(v);
else if (name_ == Module.ctx.VIEWPORT) {
{{{ makeSetValue('p', '0', 'v[0]', 'i32') }}};
{{{ makeSetValue('p', '4', 'v[1]', 'i32') }}};
{{{ makeSetValue('p', '8', 'v[2]', 'i32') }}};
{{{ makeSetValue('p', '12', 'v[3]', 'i32') }}};
}
// TODO complete
{{{ makeSetValue('p', '0', 'v', 'i32') }}};
},
glGenTextures__deps: ['$GL'],
glGenTextures: function(n, textures) {
for (var i = 0; i < n; i++) {
var id = GL.hashtable("texture").add(Module.ctx.createTexture());
{{{ makeSetValue('textures', 'i', 'id', 'i32') }}};
}
},
glDeleteTextures: function(n, textures) {
for (var i = 0; i < n; i++) {
var id = {{{ makeGetValue('textures', 'i*4', 'i32') }}};
Module.ctx.deleteTexture(GL.hashtable("texture").get(id));
GL.hashtable("texture").remove(id);
}
},
glTexImage2D: function(target, level, internalformat, width, height, border, format, type, pixels) {
if (pixels) {
pixels = new Uint8Array(Array_copy(pixels, pixels + width*height*4)); // TODO: optimize
} else {
pixels = new Uint8Array (width*height*4);
}
Module.ctx.texImage2D(target, level, internalformat, width, height, border, format, type, pixels);
},
glTexSubImage2D: function(target, level, xoffset, yoffset, width, height, format, type, pixels) {
if (pixels) {
pixels = new Uint8Array(Array_copy(pixels, pixels + width*height*4)); // TODO: optimize
}
Module.ctx.texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
},
glBindTexture: function(target, texture) {
Module.ctx.bindTexture(target, GL.hashtable("texture").get(texture));
},
glGenBuffers__deps: ['$GL'],
glGenBuffers: function(n, buffers) {
for (var i = 0; i < n; i++) {
var id = GL.hashtable("buffer").add(Module.ctx.createBuffer());
{{{ makeSetValue('buffers', 'i', 'id', 'i32') }}};
}
},
glDeleteBuffers: function(n, buffers) {
for (var i = 0; i < n; i++) {
var id = {{{ makeGetValue('buffers', 'i*4', 'i32') }}};
Module.ctx.deleteBuffer(GL.hashtable("buffer").g