diff --git a/lib/x11/ext/glxrender.js b/lib/x11/ext/glxrender.js index 8d6b033..ba75944 100644 --- a/lib/x11/ext/glxrender.js +++ b/lib/x11/ext/glxrender.js @@ -1,6 +1,8 @@ // see http://cgit.freedesktop.org/mesa/mesa/tree/src/mapi/glapi/gen/gl_API.xml -module.exports = function(GLX) { +var constants = require('./glxconstants'); + +module.exports = function(GLX, ctx) { buffers = []; function commandBuffer(opcode, len) { @@ -52,15 +54,40 @@ module.exports = function(GLX) { buffers.push(res); }; - function serialize1i(opcode, value) { var res = commandBuffer(opcode, 8); res.writeUInt32LE(value, 4); buffers.push(res); } - return { - render: function(ctx) { + function serialize1f(opcode, value) { + var res = commandBuffer(opcode, 8); + res.writeFloatLE(value, 4); + buffers.push(res); + } + + function serialize2i(opcode, i1, i2) { + var res = commandBuffer(opcode, 12); + res.writeUInt32LE(i1, 4); + res.writeUInt32LE(i2, 8); + buffers.push(res); + } + + function serialize2i4f(opcode, i1, i2, f1, f2, f3, f4) { + var res = commandBuffer(opcode, 28); + res.writeUInt32LE(i1, 4); + res.writeUInt32LE(i2, 8); + res.writeFloatLE(f1, 12); + res.writeFloatLE(f2, 16); + res.writeFloatLE(f3, 20); + res.writeFloatLE(f4, 24); + buffers.push(res); + } + + var renderContext = { + render: function(ctxLocal) { + if (!ctxLocal) // ctxLocalOverrides ctx passed during creation of renderContext + ctxLocal = ctx; GLX.Render(ctx, buffers); buffers = []; }, @@ -78,6 +105,7 @@ module.exports = function(GLX) { }, PopMatrix: function() { serialize0(183); + }, PushMatrix: function() { serialize0(184); @@ -100,6 +128,9 @@ module.exports = function(GLX) { Color3f: function(r, g, b) { serialize3fv(8, r, g, b); }, + Normal3f: function(x, y, z) { + serialize3fv(30, x, y, z); + }, Color4f: function(r, g, b, a) { serialize4fv(16, r, g, b, a); }, @@ -119,7 +150,16 @@ module.exports = function(GLX) { serialize1i(139, value); }, Lightfv: function(light, name, p1, p2, p3, p4) { - seralize2i4f(87, light, name, p1, p2, p3, p4); + if (p1.length) + serialize2i4f(87, light, name, p1[0], p1[1], p1[2], p1[3]); + else + serialize2i4f(87, light, name, p1, p2, p3, p4); + }, + Materialfv: function(light, name, p1, p2, p3, p4) { + if (p1.length) + serialize2i4f(97, light, name, p1[0], p1[1], p1[2], p1[3]); + else + serialize2i4f(97, light, name, p1, p2, p3, p4); }, Clear: function(mask) { serialize1i(0x7f, mask); @@ -127,6 +167,23 @@ module.exports = function(GLX) { ShadeModel: function(model) { serialize1i(104, model); }, + BlendFunc: function(sfactor, dfactor) { + serialize2i(160, sfactor, dfactor); + }, + PointSize: function(r) { + serialize1f(100, r); + }, }; + + // import all constants + for (var c in constants) + renderContext[c] = constants[c]; + + // bind some glx functions + 'NewList EndList GenLists SwapBuffers Finish'.split(' ').forEach(function(name) { + renderContext[name] = GLX[name].bind(GLX, ctx); + }); + + return renderContext; }