@@ -27,190 +27,173 @@ Elm.Native.Graphics.WebGL.make = function(elm) {
30− function webgl(w, h, draw) {
32− var node = newNode('canvas');
33− var gl = node.getContext('webgl');
35− function link (vSrc, fSrc) {
30+ function link (gl, vSrc, fSrc) {
37− function createShader(str, type) {
32+ function createShader(str, type) {
39− var shader = gl.createShader(type);
34+ var shader = gl.createShader(type);
41− gl.shaderSource(shader, str);
36+ gl.shaderSource(shader, str);
42− gl.compileShader(shader);
37+ gl.compileShader(shader);
43− var compile = gl.COMPILE_STATUS;
38+ var compile = gl.COMPILE_STATUS;
44− if (!gl.getShaderParameter(shader,compile)) {
39+ if (!gl.getShaderParameter(shader,compile)) {
45− throw gl.getShaderInfoLog(shader);
40+ throw gl.getShaderInfoLog(shader);
52− var vshader = createShader(vSrc, gl.VERTEX_SHADER);
43+ return shader;
53− var fshader = createShader(fSrc, gl.FRAGMENT_SHADER);
54− var program = gl.createProgram();
56− gl.attachShader(program, vshader);
57− gl.attachShader(program, fshader);
58− gl.linkProgram(program);
59− if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
60− throw gl.getProgramInfoLog(program);
63− return program;
47+ var vshader = createShader(vSrc, gl.VERTEX_SHADER);
48+ var fshader = createShader(fSrc, gl.FRAGMENT_SHADER);
49+ var program = gl.createProgram();
51+ gl.attachShader(program, vshader);
52+ gl.attachShader(program, fshader);
53+ gl.linkProgram(program);
54+ if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
55+ throw gl.getProgramInfoLog(program);
67− function bind (program, bufferElems) {
58+ return program;
69− var bufferObject = {};
60+ }
71− var attributes = gl.getProgramParameter(program, gl.ACTIVE_ATTRIBUTES);
62+ function bind (gl, program, bufferElems) {
72− for (var i = 0; i < attributes; i += 1) {
73− var attribute = gl.getActiveAttrib(program, i);
74− switch (attribute.type) {
77− // Might want to invert the loop
64+ var buffers = {};
78− // to build the array buffer first
79− // and then bind each one-at-a-time
81− List.each(function(elem){
82− data.push(elem[attribute.name][0]);
83− data.push(elem[attribute.name][1]);
84− data.push(elem[attribute.name][2]);
86− var array = new Float32Array(data);
88− var buffer = gl.createBuffer();
66+ var attributes = gl.getProgramParameter(program, gl.ACTIVE_ATTRIBUTES);
89− gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
67+ for (var i = 0; i < attributes; i += 1) {
90− gl.bufferData(gl.ARRAY_BUFFER, array, gl.STATIC_DRAW);
68+ var attribute = gl.getActiveAttrib(program, i);
69+ switch (attribute.type) {
92− bufferObject[attribute.name] = buffer;
72+ // Might want to invert the loop
73+ // to build the array buffer first
74+ // and then bind each one-at-a-time
76+ List.each(function(elem){
77+ data.push(elem[attribute.name][0]);
78+ data.push(elem[attribute.name][1]);
79+ data.push(elem[attribute.name][2]);
81+ var array = new Float32Array(data);
94− break;
83+ var buffer = gl.createBuffer();
84+ gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
85+ gl.bufferData(gl.ARRAY_BUFFER, array, gl.STATIC_DRAW);
96− default:
87+ buffers[attribute.name] = buffer;
97− console.log("Bad buffer type");
103− return bufferObject;
91+ default:
92+ console.log("Bad buffer type");
107− function render(model) {
98+ var bufferObject = {
108− drawGL(model);
99+ numIndices: List.length(bufferElems),
109− return model.node;
100+ buffers: buffers
112− function update(canvasNode, oldModel, newModel) {
103+ return bufferObject;
118− function drawGL(model) {
107+ function webgl(w, h, draw) {
120− var gl = model.gl;
109+ var node = newNode('canvas');
110+ var gl = node.getContext('webgl');
112+ function drawGL(state) {
121− gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
114+ gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
123− function drawModel(glModel) {
116+ function drawModel(model) {
124− var program = glModel.program;
118+ var program = model.program;
125− gl.useProgram(program);
119+ gl.useProgram(program);
127− var activeUniforms = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS);
121+ var numUniforms = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS);
128− for (var i = 0; i < activeUniforms; i += 1) {
122+ for (var i = 0; i < numUniforms; i += 1) {
129− var uniform = gl.getActiveUniform(program, i);
123+ var uniform = gl.getActiveUniform(program, i);
130− var uniformLocation = gl.getUniformLocation(program, uniform.name);
124+ var uniformLocation = gl.getUniformLocation(program, uniform.name);
131− switch (uniform.type) {
125+ switch (uniform.type) {
132− case gl.FLOAT_MAT4:
126+ case gl.FLOAT_MAT4:
133− gl.uniformMatrix4fv(uniformLocation, false, glModel.uniforms[uniform.name]);
127+ gl.uniformMatrix4fv(uniformLocation, false, model.uniforms[uniform.name]);
135− default:
129+ default:
136− console.log("Unsupported uniform type: " + uniform.type);
130+ console.log("Unsupported uniform type: " + uniform.type);
141− var numIndices = List.length(glModel.attributes);
135+ var numIndices = model.buffer.numIndices;
142− var indices = List.toArray(List.range(0,numIndices));
136+ var indices = List.toArray(List.range(0,numIndices));
143− var indexBuffer = gl.createBuffer();
138+ var indexBuffer = gl.createBuffer();
144− gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer);
139+ gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer);
145− gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(indices), gl.STATIC_DRAW);
140+ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(indices), gl.STATIC_DRAW);
147− var activeAttributes = gl.getProgramParameter(program, gl.ACTIVE_ATTRIBUTES);
142+ var numAttributes = gl.getProgramParameter(program, gl.ACTIVE_ATTRIBUTES);
148− for (var i = 0; i < activeAttributes; i += 1) {
143+ for (var i = 0; i < numAttributes; i += 1) {
149− var attribute = gl.getActiveAttrib(program, i);
144+ var attribute = gl.getActiveAttrib(program, i);
150− var attribLocation = gl.getAttribLocation(program, attribute.name);
145+ var attribLocation = gl.getAttribLocation(program, attribute.name);
151− gl.enableVertexAttribArray(attribLocation);
146+ gl.enableVertexAttribArray(attribLocation);
147+ attributeBuffer = model.buffer.buffers[attribute.name];
152− switch (attribute.type) {
149+ switch (attribute.type) {
153− case gl.FLOAT_VEC3:
150+ case gl.FLOAT_VEC3:
155− List.each(function(elem){
156− data.push(elem[attribute.name][0]);
157− data.push(elem[attribute.name][1]);
158− data.push(elem[attribute.name][2]);
159− }, glModel.attributes);
160− var attributeBuffer = gl.createBuffer();
161− gl.bindBuffer(gl.ARRAY_BUFFER, attributeBuffer);
151+ gl.bindBuffer(gl.ARRAY_BUFFER, attributeBuffer);
162− gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(data), gl.STATIC_DRAW);
163− gl.vertexAttribPointer(attribLocation, 3, gl.FLOAT, false, 0, 0);
152+ gl.vertexAttribPointer(attribLocation, 3, gl.FLOAT, false, 0, 0);
165− default:
154+ default:
166− console.log("Unsupported attribute type: " + attribute.type);
155+ console.log("Unsupported attribute type: " + attribute.type);
171− gl.drawElements(gl.TRIANGLES, numIndices, gl.UNSIGNED_SHORT, 0);
160+ gl.drawElements(gl.TRIANGLES, numIndices, gl.UNSIGNED_SHORT, 0);
175− List.each(drawModel, model.glModels);
164+ List.each(drawModel, state.models);
180− * Called for new node, caches lots of stuff
182− function render(model) {
168+ function render(state) {
183− drawGL(model);
169+ drawGL(state);
184− return model.node;
170+ return node;
187− /*
173+ function update(_node, oldState, newState) {
188− * Called at existing node
190− function update(canvasNode, oldModel, newModel) {
191− drawGL(newModel)
174+ drawGL(newState)
194− function webgl(context, glModels) {
177+ var models = draw(gl);
196− return A3(newElement, context.w, context.h, {
179+ var elem = {
197 ctor: 'Custom',
180 ctor: 'Custom',
198− type: 'WebGL',
181+ type: 'WebGL',
199− render: render,
182+ render: render,
200− update: update,
183+ update: update,
201− model: {
184+ model: {
202− aspect: context.w/context.h,
185+ models: models,
189+ return A3(newElement, w, h, elem);
211 return elm.Native.Graphics.WebGL.values = {
192 return elm.Native.Graphics.WebGL.values = {
212− encapsulate:F3(linkModel),
195+ encapsulate:F3(encapsulate),
213− webgl:F3(webgl),
196+ webgl:F3(webgl)