@@ -27,51 +27,19 @@ Elm.Native.Graphics.WebGL.make = function(elm) {
2727 return shader;
2828 };
2929
30− function linkProgram(gl, program) {
31− var vshader = createShader(gl, program.vshaderSource, gl.VERTEX_SHADER);
32− var fshader = createShader(gl, program.fshaderSource, gl.FRAGMENT_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);
38− }
39− }
40−
41− function createProgram(gl, vstr, fstr) {
42− var program = gl.createProgram();
43− var vshader = createShader(gl, vstr, gl.VERTEX_SHADER);
44− var fshader = createShader(gl, fstr, gl.FRAGMENT_SHADER);
30+ function linkProgram(vSrc, fSrc, context) {
31+ var gl = context.gl;
32+ var vshader = createShader(gl, vSrc, gl.VERTEX_SHADER);
33+ var fshader = createShader(gl, fSrc, gl.FRAGMENT_SHADER);
34+ var program = gl.createProgram()
4535 gl.attachShader(program, vshader);
4636 gl.attachShader(program, fshader);
4737 gl.linkProgram(program);
48−
4938 if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
5039 throw gl.getProgramInfoLog(program);
5140 }
52−
5341 return program;
54− };
55−
56− var geoVert = "attribute vec3 aVertexPosition;\
57− attribute vec4 aVertexColor;\
58− \
59− uniform mat4 uSceneMatrix;\
60− \
61− varying vec4 vVertexColor;\
62− \
63− void main() {\
64− gl_Position = uSceneMatrix * vec4(aVertexPosition, 1.0);\
65− vVertexColor = aVertexColor;\
66− }"
67−
68− var geoFrag = "precision mediump float;\
69− \
70− varying vec4 vVertexColor;\
71− \
72− void main() {\
73− gl_FragColor = vVertexColor;\
74− }"
42+ }
7543
7644 function drawGL(model) {
7745 var aspect = model.aspect;
@@ -117,8 +85,21 @@ Elm.Native.Graphics.WebGL.make = function(elm) {
11785 }
11886 }
11987
120− var scene = model.scene;
121− drawScene(scene,0);
88+ function drawModel(glModel) {
89+ 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);
95+ }
96+
97+
98+ var attributes = glModel.attributes;
99+
100+ }
101+
102+ List.each(drawModel, model.glModels);
122103
123104 }
124105
@@ -140,17 +121,7 @@ Elm.Native.Graphics.WebGL.make = function(elm) {
140121 function makeGL(w,h) {
141122 var node = newNode('canvas');
142123 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');
147− var program = {
148− programPtr: programPtr,
149− vertexPositionAttribute: vertexPositionAttribute,
150− vertexColorAttribute: vertexColorAttribute,
151− sceneMatrixUniform: sceneMatrixUniform,
152− };
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});
154125 }
155126
156127 function bufferMesh(triangles, context) {
@@ -200,7 +171,7 @@ Elm.Native.Graphics.WebGL.make = function(elm) {
200171
201172 }
202173
203− function webgl(context, scene) {
174+ function webgl(context, glModels) {
204175
205176 return A3(newElement, context.w, context.h, {
206177 ctor: 'Custom',
@@ -211,17 +182,26 @@ Elm.Native.Graphics.WebGL.make = function(elm) {
211182 aspect: context.w/context.h,
212183 node: context.node,
213184 gl: context.gl,
214− program: context.program,
215− scene: scene,
185+ glModels: glModels,
216186 },
217187 });
218188
219189 }
220190
191+ function linkModel(program, uniforms, attributes) {
192+ return {
193+ program: program,
194+ uniforms: uniforms,
195+ attributes: attributes,
196+ };
197+ }
198+
221199 return elm.Native.Graphics.WebGL.values = {
222200 makeGL:F2(makeGL),
223201 bufferMesh:F2(bufferMesh),
224202 webgl:F2(webgl),
203+ linkProgram:F3(linkProgram),
204+ linkModel:F3(linkModel),
225205 };
226206
227207};