-
Notifications
You must be signed in to change notification settings - Fork 2
/
renderer.js
82 lines (63 loc) · 2.2 KB
/
renderer.js
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
sh.Renderer = sh.Obj.extend({
init: function() {
this.root = null;
this._objects = [];
this._bufferCache = {};
this._normalMatrix = mat4.create();
sh.Shaders.createProgram('default',
sh.Shaders.getShader('default-vertex'),
sh.Shaders.getShader('default-fragment'));
var _this = this;
sh.SceneNode.onAdd(function(obj) {
_this._objects.push(obj);
});
},
setRoot: function(obj) {
this.root = obj;
},
update: function(dt) {
this.updateObject(this.root, dt);
},
updateObject: function(obj, dt, force) {
obj.update(dt);
var dirty = obj.needsWorldUpdate();
obj.updateMatrices(force);
var children = obj.children;
for(var i=0, l=children.length; i<l; i++) {
this.updateObject(children[i], dt, dirty || force);
}
},
render: function() {
var objs = this._objects;
var lastProg = null;
for(var i=0, l=objs.length; i<l; i++) {
var obj = objs[i];
if(!lastProg || lastProg != obj.program) {
gl.useProgram(obj.program);
lastProg = obj.program;
}
gl.uniformMatrix4fv(obj.transformLoc,
false,
obj._realTransform);
if(obj.normalLoc) {
mat4.inverse(obj._realTransform, this._normalMatrix);
mat4.transpose(this._normalMatrix);
gl.uniformMatrix4fv(obj.normalLoc,
false,
this._normalMatrix);
}
obj.render();
}
},
bindAndEnableBuffer: function(program, buf, attrib) {
if(this._bufferCache[attrib] != buf) {
gl.bindBuffer(gl.ARRAY_BUFFER, buf);
var loc = gl.getAttribLocation(program, attrib);
if(loc != -1) {
gl.enableVertexAttribArray(loc);
gl.vertexAttribPointer(loc, 3, gl.FLOAT, false, 0, 0);
}
this._bufferCache[attrib] = buf;
}
}
});