@@ -27,51 +27,19 @@ Elm.Native.Graphics.WebGL.make = function(elm) {
27 return shader;
27 return shader;
30− function linkProgram(gl, program) {
30+ function linkProgram(vSrc, fSrc, context) {
31− var vshader = createShader(gl, program.vshaderSource, gl.VERTEX_SHADER);
31+ var gl = context.gl;
32− var fshader = createShader(gl, program.fshaderSource, gl.FRAGMENT_SHADER);
32+ var vshader = createShader(gl, vSrc, gl.VERTEX_SHADER);
33− gl.attachShader(program, vshader);
34− gl.attachShader(program, fshader);
35− gl.linkProgram(program);
36− if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
37− throw gl.getProgramInfoLog(program);
41− function createProgram(gl, vstr, fstr) {
42− var program = gl.createProgram();
43− var vshader = createShader(gl, vstr, gl.VERTEX_SHADER);
33+ var fshader = createShader(gl, fSrc, gl.FRAGMENT_SHADER);
44− var fshader = createShader(gl, fstr, gl.FRAGMENT_SHADER);
34+ var program = gl.createProgram()
45 gl.attachShader(program, vshader);
35 gl.attachShader(program, vshader);
46 gl.attachShader(program, fshader);
36 gl.attachShader(program, fshader);
47 gl.linkProgram(program);
37 gl.linkProgram(program);
49 if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
38 if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
50 throw gl.getProgramInfoLog(program);
39 throw gl.getProgramInfoLog(program);
53 return program;
41 return program;
56− var geoVert = "attribute vec3 aVertexPosition;\
57− attribute vec4 aVertexColor;\
59− uniform mat4 uSceneMatrix;\
61− varying vec4 vVertexColor;\
64− gl_Position = uSceneMatrix * vec4(aVertexPosition, 1.0);\
65− vVertexColor = aVertexColor;\
68− var geoFrag = "precision mediump float;\
70− varying vec4 vVertexColor;\
73− gl_FragColor = vVertexColor;\
76 function drawGL(model) {
44 function drawGL(model) {
77 var aspect = model.aspect;
45 var aspect = model.aspect;
@@ -117,8 +85,21 @@ Elm.Native.Graphics.WebGL.make = function(elm) {
120− var scene = model.scene;
88+ function drawModel(glModel) {
121− drawScene(scene,0);
89+ var program = glModel.program;
90+ var uniforms = glModel.uniforms;
92+ for (var uName in uniforms) {
93+ var uLoc = gl.getUniformLocation(program, uName);
94+ var active = gl.getActiveUniform(program, uName);
98+ var attributes = glModel.attributes;
102+ List.each(drawModel, model.glModels);
@@ -140,17 +121,7 @@ Elm.Native.Graphics.WebGL.make = function(elm) {
140 function makeGL(w,h) {
121 function makeGL(w,h) {
141 var node = newNode('canvas');
122 var node = newNode('canvas');
142 var gl = node.getContext('webgl');
123 var gl = node.getContext('webgl');
143− var programPtr = createProgram(gl, geoVert, geoFrag);
144− var vertexPositionAttribute = gl.getAttribLocation(programPtr,'aVertexPosition');
145− var vertexColorAttribute = gl.getAttribLocation(programPtr,'aVertexColor');
146− var sceneMatrixUniform = gl.getUniformLocation(programPtr, 'uSceneMatrix');
148− programPtr: programPtr,
149− vertexPositionAttribute: vertexPositionAttribute,
150− vertexColorAttribute: vertexColorAttribute,
151− sceneMatrixUniform: sceneMatrixUniform,
153− return Signal.constant({w:w,h:h,gl:gl,node:node,program:program});
124+ return Signal.constant({w:w,h:h,gl:gl,node:node});
156 function bufferMesh(triangles, context) {
127 function bufferMesh(triangles, context) {
@@ -200,7 +171,7 @@ Elm.Native.Graphics.WebGL.make = function(elm) {
203− function webgl(context, scene) {
174+ function webgl(context, glModels) {
205 return A3(newElement, context.w, context.h, {
176 return A3(newElement, context.w, context.h, {
206 ctor: 'Custom',
177 ctor: 'Custom',
@@ -211,17 +182,26 @@ Elm.Native.Graphics.WebGL.make = function(elm) {
211 aspect: context.w/context.h,
182 aspect: context.w/context.h,
212 node: context.node,
183 node: context.node,
213 gl: context.gl,
184 gl: context.gl,
214− program: context.program,
185+ glModels: glModels,
191+ function linkModel(program, uniforms, attributes) {
195+ attributes: attributes,
221 return elm.Native.Graphics.WebGL.values = {
199 return elm.Native.Graphics.WebGL.values = {
222 makeGL:F2(makeGL),
200 makeGL:F2(makeGL),
223 bufferMesh:F2(bufferMesh),
201 bufferMesh:F2(bufferMesh),
224 webgl:F2(webgl),
202 webgl:F2(webgl),
203+ linkProgram:F3(linkProgram),
204+ linkModel:F3(linkModel),