@@ -87,15 +87,53 @@ Elm.Native.Graphics.WebGL.make = function(elm) {
8787
8888 function drawModel(glModel) {
8989 var program = glModel.program;
90− var uniforms = glModel.uniforms;
91− va:q
92− for (var uName in uniforms) {
93− var uLoc = gl.getUniformLocation(program, uName);
94− var active = gl.getActiveUniform(program, uName);
90+ gl.useProgram(program);
91+
92+ var activeUniforms = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS);
93+ for (var i = 0; i < activeUniforms; i += 1) {
94+ var uniform = gl.getActiveUniform(program, i);
95+ var uniformLocation = gl.getUniformLocation(program, uniform.name);
96+ switch (uniform.type) {
97+ case gl.FLOAT_MAT4:
98+ gl.uniformMatrix4fv(uniformLocation, false, glModel.uniforms[uniform.name]);
99+ break;
100+ default:
101+ console.log("Unsupported uniform type: " + uniform.type);
102+ break;
103+ }
95104 }
96−
97−
98− var attributes = glModel.attributes;
105+
106+ var numIndices = List.length(glModel.attributes);
107+ var indices = List.toArray(List.range(0,numIndices));
108+ var indexBuffer = gl.createBuffer();
109+ gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer);
110+ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(indices), gl.STATIC_DRAW);
111+
112+ var activeAttributes = gl.getProgramParameter(program, gl.ACTIVE_ATTRIBUTES);
113+ for (var i = 0; i < activeAttributes; i += 1) {
114+ var attribute = gl.getActiveAttrib(program, i);
115+ var attribLocation = gl.getAttribLocation(program, attribute.name);
116+ gl.enableVertexAttribArray(attribLocation);
117+ switch (attribute.type) {
118+ case gl.FLOAT_VEC3:
119+ var data = [];
120+ List.each(function(v3){
121+ data.push(v3[0]);
122+ data.push(v3[1]);
123+ data.push(v3[2]);
124+ }, glModel.attributes[attribute.name]);
125+ var attributeBuffer = gl.createBuffer();
126+ gl.bindBuffer(gl.ARRAY_BUFFER, attributeBuffer);
127+ gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(data), gl.STATIC_DRAW);
128+ gl.vertexAttribPointer(attribLocation, 3, gl.FLOAT, false, 0, 0);
129+ break;
130+ default:
131+ console.log("Unsupported attribute type: " + attribute.type);
132+ break;
133+ }
134+ }
135+
136+ gl.drawElements(gl.TRIANGLES, numIndices, gl.UNSIGNED_SHORT, 0);
99137
100138 }
101139