Skip to content

Instantly share code, notes, and snippets.

@rainder
Last active September 10, 2016 11:48
Show Gist options
  • Save rainder/d647c8c2a29e37d08784ec998408e042 to your computer and use it in GitHub Desktop.
Save rainder/d647c8c2a29e37d08784ec998408e042 to your computer and use it in GitHub Desktop.
'use strict';
var bresenham = require('bresenham');
var glmatrix = require('gl-matrix');
const terminal = require('terminal-kit').terminal;
var Canvas = require('drawille');
var mat4 = glmatrix.mat4;
var vec3 = glmatrix.vec3;
terminal.fullscreen();
terminal.hideCursor();
vec3.transformMat4 = function(out, a, m) {
var x = a[0], y = a[1], z = a[2],
w = m[3] * x + m[7] * y + m[11] * z + m[15];
w = w || 1.0;
out[0] = (m[0] * x + m[4] * y + m[8] * z + m[12]) / w;
out[1] = (m[1] * x + m[5] * y + m[9] * z + m[13]) / w;
out[2] = (m[2] * x + m[6] * y + m[10] * z + m[14]) / w;
return out;
};
var c = new Canvas(160, 160);
var points = [[-1,-1,-1],[-1,-1,1],[1,-1,1],[1,-1,-1],[-1,1,-1],[-1,1,1],[1,1,1],[1,1,-1]];
var quads = [[0,1,2,3],[0,4,5,1],[1,5,6,2],[2,6,7,3],[3,7,4,0],[4,7,6,5]];
var cube = quads.map(function(quad) {
return quad.map(function(v) {
return vec3.fromValues.apply(null, points[v]);
});
});
var projection = mat4.create();
mat4.perspective(projection, Math.PI/3, 1, 1, 50);
function draw() {
var now = Date.now();
var modelView = mat4.create();
mat4.lookAt(modelView,
vec3.fromValues(0, 0.1, 4),
vec3.fromValues(0, 0, 0),
vec3.fromValues(0, 1, 0));
mat4.rotateY(modelView, modelView, Math.PI*2*now/10000);
mat4.rotateZ(modelView, modelView, Math.PI*2*now/11000);
mat4.rotateX(modelView, modelView, Math.PI*2*now/9000);
mat4.scale(modelView, modelView, vec3.fromValues(Math.sin(now/1000*Math.PI)/2+1, 1, 1));
c.clear();
var transformed = cube.map(function(quad) {
return quad.map(function(v) {
var m = mat4.create();
var out = vec3.create();
mat4.mul(m, projection, modelView);
vec3.transformMat4(out, v, m);
return {
x: Math.floor(out[0]*40+80),
y: Math.floor(out[1]*40+80)
};
});
});
transformed.forEach(function(quad) {
quad.forEach(function(v, i) {
var n = quad[(+i+1)%4];
bresenham(v.x, v.y, n.x, n.y, c.set.bind(c));
});
});
terminal.moveTo(0,0)(c.frame());
}
setInterval(draw, 1000/24);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment