1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
|
//"use strict";
// XXX FIXME Hardcoded '4' in many places, here and in library_SDL, for RGBA
var LibraryGL = {
$GL: {
textures: {},
textureCounter: 0,
},
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_;
}
},
glGetIntegerv: function(name_, p) {
switch(name_) {
case Module.ctx.MAX_TEXTURE_SIZE:
IHEAP[p] = Module.ctx.getParameter(name_);
break;
default:
throw 'Failure: Invalid glGetIntegerv value: ' + name_;
}
},
glGenTextures__deps: ['$GL'],
glGenTextures: function(n, textures) {
for (var i = 0; i < n; i++) {
var id = GL.textureCounter++;
GL.textures[id] = Module.ctx.createTexture();
IHEAP[textures+QUANTUM_SIZE*i] = id;
}
},
glDeleteTextures: function(n, textures) {
for (var i = 0; i < n; i++) {
var id = IHEAP[textures+QUANTUM_SIZE*i];
Module.ctx.deleteTexture(GL.textures[id]);
delete GL.textures[id];
}
},
glTexImage2D: function(target, level, internalformat, width, height, border, format, type, pixels) {
if (pixels) {
pixels = new Uint8Array(IHEAP.slice(pixels, pixels + width*height*4)); // TODO: optimize
}
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(IHEAP.slice(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.textures[texture]);
},
glClearColor: function(red, green, blue, alpha) {
Module.ctx.clearColor(red, green, blue, alpha);
},
glClear: function(mask) {
Module.ctx.clear(mask);
},
glEnable: function(cap) {
Module.ctx.enable(cap);
},
glScissor: function(x, y, width, height) {
Module.ctx.scissor(x, y, width, height);
},
};
// Ignored stubs for fixed-function pipeline. We will need to emulate this
'begin end matrixMode loadIdentity ortho color3f texCoord2f vertex2f blendFunc pushMatrix popMatrix translatef scalef color4ub enableClientState disableClientState vertexPointer colorPointer normalPointer texCoordPointer drawArrays clientActiveTexture_'.split(' ').forEach(function(name_) {
var cName = 'gl' + name_[0].toUpperCase() + name_.substr(1);
LibraryGL[cName] = function(){};
});
// Simple pass-through functions
[[0, 'shadeModel fogi fogfv'],
[1, 'clearDepth depthFunc enable disable frontFace cullFace'],
[2, 'pixelStorei'],
[3, 'texParameteri texParameterf'],
[4, 'viewport clearColor']].forEach(function(data) {
var num = data[0];
var names = data[1];
var args = range(num).map(function(i) { return 'x' + i }).join(', ');
var stub = '(function(' + args + ') { ' + (num > 0 ? 'Module.ctx.NAME(' + args + ')' : '') + ' })';
names.split(' ').forEach(function(name_) {
var cName = 'gl' + name_[0].toUpperCase() + name_.substr(1);
LibraryGL[cName] = eval(stub.replace('NAME', name_));
//print(cName + ': ' + LibraryGL[cName]);
});
});
mergeInto(LibraryManager.library, LibraryGL);
|