@@ -81,6 +81,7 @@ Elm.Native.Graphics.WebGL.make = function(elm) {
81 var array = new Float32Array(data);
81 var array = new Float32Array(data);
83 var buffer = gl.createBuffer();
83 var buffer = gl.createBuffer();
84+ console.log("Created attribute buffer " + attribute.name);
84 gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
85 gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
85 gl.bufferData(gl.ARRAY_BUFFER, array, gl.STATIC_DRAW);
86 gl.bufferData(gl.ARRAY_BUFFER, array, gl.STATIC_DRAW);
@@ -104,96 +105,109 @@ Elm.Native.Graphics.WebGL.make = function(elm) {
107− function webgl(w, h, draw) {
108+ function drawGL(gl,state) {
109− var node = newNode('canvas');
110+ gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
110− var gl = node.getContext('webgl');
112− function drawGL(state) {
114− gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
116− function drawModel(model) {
112+ function drawModel(model) {
118− var program = model.program;
119− gl.useProgram(program);
121− var numUniforms = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS);
122− for (var i = 0; i < numUniforms; i += 1) {
123− var uniform = gl.getActiveUniform(program, i);
124− var uniformLocation = gl.getUniformLocation(program, uniform.name);
125− switch (uniform.type) {
127− gl.uniformMatrix4fv(uniformLocation, false, model.uniforms[uniform.name]);
130− console.log("Unsupported uniform type: " + uniform.type);
135− var numIndices = model.buffer.numIndices;
114+ var program = model.program;
136− var indices = List.toArray(List.range(0,numIndices));
115+ gl.useProgram(program);
138− var indexBuffer = gl.createBuffer();
139− gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer);
140− gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(indices), gl.STATIC_DRAW);
142− var numAttributes = gl.getProgramParameter(program, gl.ACTIVE_ATTRIBUTES);
143− for (var i = 0; i < numAttributes; i += 1) {
144− var attribute = gl.getActiveAttrib(program, i);
145− var attribLocation = gl.getAttribLocation(program, attribute.name);
146− gl.enableVertexAttribArray(attribLocation);
147− attributeBuffer = model.buffer.buffers[attribute.name];
149− switch (attribute.type) {
151− gl.bindBuffer(gl.ARRAY_BUFFER, attributeBuffer);
152− gl.vertexAttribPointer(attribLocation, 3, gl.FLOAT, false, 0, 0);
155− console.log("Unsupported attribute type: " + attribute.type);
160− gl.drawElements(gl.TRIANGLES, numIndices, gl.UNSIGNED_SHORT, 0);
117+ var numUniforms = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS);
118+ for (var i = 0; i < numUniforms; i += 1) {
119+ var uniform = gl.getActiveUniform(program, i);
120+ var uniformLocation = gl.getUniformLocation(program, uniform.name);
121+ switch (uniform.type) {
123+ gl.uniformMatrix4fv(uniformLocation, false, model.uniforms[uniform.name]);
126+ console.log("Unsupported uniform type: " + uniform.type);
131+ var numIndices = model.buffer.numIndices;
132+ var indices = List.toArray(List.range(0,numIndices));
134+ console.log("Created index buffer");
135+ var indexBuffer = gl.createBuffer();
136+ gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer);
137+ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(indices), gl.STATIC_DRAW);
139+ var numAttributes = gl.getProgramParameter(program, gl.ACTIVE_ATTRIBUTES);
140+ for (var i = 0; i < numAttributes; i += 1) {
141+ var attribute = gl.getActiveAttrib(program, i);
142+ var attribLocation = gl.getAttribLocation(program, attribute.name);
143+ gl.enableVertexAttribArray(attribLocation);
144+ attributeBuffer = model.buffer.buffers[attribute.name];
146+ switch (attribute.type) {
148+ gl.bindBuffer(gl.ARRAY_BUFFER, attributeBuffer);
149+ gl.vertexAttribPointer(attribLocation, 3, gl.FLOAT, false, 0, 0);
152+ console.log("Unsupported attribute type: " + attribute.type);
164− List.each(drawModel, state.models);
157+ gl.drawElements(gl.TRIANGLES, numIndices, gl.UNSIGNED_SHORT, 0);
168− function render(state) {
161+ List.each(drawModel, state.models);
173− function update(_node, oldState, newState) {
177− var models = draw(gl);
165+ function webgl(sDimensions, sDraw) {
167+ var node = newNode('canvas');
168+ var gl = node.getContext('webgl');
169+ var sGL = Signal.constant(gl);
179− var elem = {
171+ var application = F2(function(f,x) { return f(x); });
180− ctor: 'Custom',
172+ var sModels = A3(Signal.lift2,application,sDraw,sGL);
182− render: render,
174+ function makeGLelement(dimensions, models, gl) {
184− model: {
176+ var w = dimensions._0;
185− models: models,
177+ var h = dimensions._1;
179+ function render(state) {
184+ function update(_node, oldState, newState) {
189− return A3(newElement, w, h, elem);
198+ return A3(newElement, w, h, elem);
202+ return A4(Signal.lift3,F3(makeGLelement),sDimensions,sModels,sGL);
192 return elm.Native.Graphics.WebGL.values = {
206 return elm.Native.Graphics.WebGL.values = {
193 link:F3(link),
207 link:F3(link),
194 bind:F3(bind),
208 bind:F3(bind),
195 encapsulate:F3(encapsulate),
209 encapsulate:F3(encapsulate),
196− webgl:F3(webgl)
210+ webgl:F2(webgl)