From d2f6b9c7fcf3ae2c3952491f59c33e14a5cac949 Mon Sep 17 00:00:00 2001 From: Andrey Sidorov Date: Tue, 11 Dec 2012 14:05:30 +1100 Subject: [PATCH 1/3] simple opengl example --- examples/opengl/test1.js | 68 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 examples/opengl/test1.js diff --git a/examples/opengl/test1.js b/examples/opengl/test1.js new file mode 100644 index 0000000..3b1e1d2 --- /dev/null +++ b/examples/opengl/test1.js @@ -0,0 +1,68 @@ +var x11 = require('../../lib/x11'); + +var randomarr = []; +for(var i=0; i < 2000; ++i) { + randomarr.push([Math.random()*30-15, Math.random()*30-15, Math.random()*30-15]); +} + +var width = 500; +var height = 500; +var eventmask = x11.eventMask.PointerMotion; +var listId = 1; + +x11.createClient(function(display) { + var X = display.client; + var root = display.screen[0].root; + X.require('glx', function(GLX) { + var visual = 0; + var visuals = display.screen[0].depths[24]; + for (visual in visuals) { + if (visuals[visual].class == 4 || visuals[visual].class == 5) + break; + } + + var win = X.AllocID(); + X.CreateWindow(win, root, 0, 0, width, height, 0, 0, 0, visual, { eventMask: eventmask }); + X.MapWindow(win); + var ctx = X.AllocID(); + GLX.CreateContext(ctx, visual, 0, 0, 0); + GLX.MakeCurrent(win, ctx, 0, function(err, ctx) {}); // do we need to wait for reply here? + GLX.GenLists(ctx, 1, function(err, startListIndex) { + listId = startListIndex; + GLX.NewList(ctx, listId, 0x00001300); + var gl = GLX.renderPipeline(); + gl.Begin(0x0004); + for (var i=0; i < 1000; ++i) + { + gl.Vertex3f(randomarr[i][0], randomarr[i][1], randomarr[i][2]); + gl.Color3f((randomarr[i+1000][0]+15/30), (randomarr[i+1000][1]+15)/30, (randomarr[i+1000][2]+15)/30); + } + gl.End(); + gl.render(ctx); + GLX.EndList(ctx); + }); + + X.on('event', function(ev) { + var gl = GLX.renderPipeline(); + gl.Enable(0x0B71); + gl.Viewport(0, 0, 800, 800); + gl.MatrixMode(0x1701); + gl.LoadIdentity(); + gl.Ortho(-30.0, 30.0, -30.0, 30.0, -300.0, 300.0); + //gl.Frustum(-30.0, 30.0, -30.0, 30.0, 30, 300.0); + + gl.Rotatef(ev.y, 0, 0, 1); + gl.Rotatef(ev.x, 1, 0, 0); + gl.MatrixMode(0x1700); + gl.ClearColor(0.3,0.3,0.3,0.0); + gl.Clear(0x00004000|0x00000100); + gl.ShadeModel(0x1D01); + gl.LoadIdentity(); + gl.CallList(listId); + gl.render(ctx); + GLX.SwapBuffers(ctx, win); + }); + }); + X.on('error', function(err) { console.log(err); }); +}); + From e712fdb0a5d28fb1ea4958ef961c7114a128c6ff Mon Sep 17 00:00:00 2001 From: Andrey Sidorov Date: Tue, 11 Dec 2012 14:13:39 +1100 Subject: [PATCH 2/3] draw first frame immediately --- examples/opengl/test1.js | 46 ++++++++++++++++++++++------------------ 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/examples/opengl/test1.js b/examples/opengl/test1.js index 3b1e1d2..9b0207b 100644 --- a/examples/opengl/test1.js +++ b/examples/opengl/test1.js @@ -18,7 +18,7 @@ x11.createClient(function(display) { var visuals = display.screen[0].depths[24]; for (visual in visuals) { if (visuals[visual].class == 4 || visuals[visual].class == 5) - break; + break; } var win = X.AllocID(); @@ -27,6 +27,28 @@ x11.createClient(function(display) { var ctx = X.AllocID(); GLX.CreateContext(ctx, visual, 0, 0, 0); GLX.MakeCurrent(win, ctx, 0, function(err, ctx) {}); // do we need to wait for reply here? + + function draw(ev) { + var gl = GLX.renderPipeline(); + gl.Enable(0x0B71); + gl.Viewport(0, 0, 800, 800); + gl.MatrixMode(0x1701); + gl.LoadIdentity(); + gl.Ortho(-30.0, 30.0, -30.0, 30.0, -300.0, 300.0); + //gl.Frustum(-30.0, 30.0, -30.0, 30.0, 30, 300.0); + + gl.Rotatef(ev.y, 0, 0, 1); + gl.Rotatef(ev.x, 1, 0, 0); + gl.MatrixMode(0x1700); + gl.ClearColor(0.3,0.3,0.3,0.0); + gl.Clear(0x00004000|0x00000100); + gl.ShadeModel(0x1D01); + gl.LoadIdentity(); + gl.CallList(listId); + gl.render(ctx); + GLX.SwapBuffers(ctx, win); + } + GLX.GenLists(ctx, 1, function(err, startListIndex) { listId = startListIndex; GLX.NewList(ctx, listId, 0x00001300); @@ -40,28 +62,10 @@ x11.createClient(function(display) { gl.End(); gl.render(ctx); GLX.EndList(ctx); + draw({x: 10, y: 10}); }); - X.on('event', function(ev) { - var gl = GLX.renderPipeline(); - gl.Enable(0x0B71); - gl.Viewport(0, 0, 800, 800); - gl.MatrixMode(0x1701); - gl.LoadIdentity(); - gl.Ortho(-30.0, 30.0, -30.0, 30.0, -300.0, 300.0); - //gl.Frustum(-30.0, 30.0, -30.0, 30.0, 30, 300.0); - - gl.Rotatef(ev.y, 0, 0, 1); - gl.Rotatef(ev.x, 1, 0, 0); - gl.MatrixMode(0x1700); - gl.ClearColor(0.3,0.3,0.3,0.0); - gl.Clear(0x00004000|0x00000100); - gl.ShadeModel(0x1D01); - gl.LoadIdentity(); - gl.CallList(listId); - gl.render(ctx); - GLX.SwapBuffers(ctx, win); - }); + X.on('event', draw); }); X.on('error', function(err) { console.log(err); }); }); From a5087c35c661b9177afa3c7a31502543a9dd2d51 Mon Sep 17 00:00:00 2001 From: Andrey Sidorov Date: Tue, 11 Dec 2012 16:05:18 +1100 Subject: [PATCH 3/3] glHint --- lib/x11/ext/glxconstants.js | 7 +++++++ lib/x11/ext/glxrender.js | 10 +++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/lib/x11/ext/glxconstants.js b/lib/x11/ext/glxconstants.js index 0e1698c..8fc3027 100644 --- a/lib/x11/ext/glxconstants.js +++ b/lib/x11/ext/glxconstants.js @@ -9,6 +9,9 @@ module.exports = { DEPTH_TEST: 0x0B71, NORMALIZE: 0x0BA1, + BLEND: 0x0BE2, + POLYGON_SMOOTH: 0x0B41, + // glShadeModel FLAT: 0x1D00, SMOOTH: 0x1D01, @@ -43,6 +46,10 @@ module.exports = { COMPILE: 0x1300, + // Hint + POLYGON_SMOOTH_HINT: 0x0C53, + NICEST: 0x1102, + // glGetString RENDERER: 0x1F01, VERSION: 0x1F02, diff --git a/lib/x11/ext/glxrender.js b/lib/x11/ext/glxrender.js index 8d6b033..e8438f6 100644 --- a/lib/x11/ext/glxrender.js +++ b/lib/x11/ext/glxrender.js @@ -52,6 +52,12 @@ module.exports = function(GLX) { buffers.push(res); }; + function serialize2i(opcode, value1, value2) { + var res = commandBuffer(opcode, 12); + res.writeUInt32LE(value1, 4); + res.writeUInt32LE(value2, 8); + buffers.push(res); + } function serialize1i(opcode, value) { var res = commandBuffer(opcode, 8); @@ -127,6 +133,8 @@ module.exports = function(GLX) { ShadeModel: function(model) { serialize1i(104, model); }, - + Hint: function(target, mode) { + serialize2i(85, target, mode); + } }; }