1Elm.Native.Graphics.WebGL = {};
2Elm.Native.Graphics.WebGL.make = function(elm) {
4 elm.Native = elm.Native || {};
5 elm.Native.Graphics = elm.Native.Graphics || {};
6 elm.Native.Graphics.WebGL = elm.Native.Graphics.WebGL || {};
7 if (elm.Native.Graphics.WebGL.values) return elm.Native.Graphics.WebGL.values;
9 var newNode = ElmRuntime.use(ElmRuntime.Render.Utils).newElement;
11 var Signal = Elm.Signal.make(elm);
12 var newElement = Elm.Graphics.Element.make(elm).newElement;
13 var Utils = Elm.Native.Utils.make(elm);
14 var Tuple2 = Utils.Tuple2;
15 var MJS = Elm.Native.MJS.make(elm);
16 var List = Elm.Native.List.make(elm);
18 function createShader(gl, str, type) {
19 var shader = gl.createShader(type);
20 gl.shaderSource(shader, str);
21 gl.compileShader(shader);
23 if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
24 throw gl.getShaderInfoLog(shader);
30 function linkProgram(vSrc, fSrc, context) {
32 var vshader = createShader(gl, vSrc, gl.VERTEX_SHADER);
33 var fshader = createShader(gl, fSrc, gl.FRAGMENT_SHADER);
34 var program = gl.createProgram()
35 gl.attachShader(program, vshader);
36 gl.attachShader(program, fshader);
37 gl.linkProgram(program);
38 if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
39 throw gl.getProgramInfoLog(program);
44 function drawGL(model) {
45 var aspect = model.aspect;
48 gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
50 var program = model.program;
52 function drawMesh(mesh, sceneMatrix) {
53 gl.useProgram(program.programPtr);
55 gl.enableVertexAttribArray(program.vertexPositionAttribute);
56 gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, mesh.indexBuffer);
57 gl.bindBuffer(gl.ARRAY_BUFFER, mesh.vertexPosBuffer);
58 gl.vertexAttribPointer(program.vertexPositionAttribute, 3, gl.FLOAT, false, 0, 0);
60 gl.enableVertexAttribArray(program.vertexColorAttribute);
61 gl.bindBuffer(gl.ARRAY_BUFFER, mesh.vertexColorBuffer);
62 gl.vertexAttribPointer(program.vertexColorAttribute, 4, gl.FLOAT, false, 0, 0);
64 gl.uniformMatrix4fv(program.sceneMatrixUniform, false, sceneMatrix);
66 gl.drawElements(gl.TRIANGLES, mesh.numIndices, gl.UNSIGNED_SHORT, 0);
69 var sceneMatrixStack = [MJS.M4x4.identity];
71 function drawScene(scene,n) {
74 drawMesh(scene._0, sceneMatrixStack[n]);
78 sceneMatrixStack[n+1] = MJS.M4x4.mul(sceneMatrixStack[n],m)
79 function drawChild(c) {
82 var children = scene._1;
83 List.each(drawChild, children);
88 function drawModel(glModel) {
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);
107 * Called for new node, caches lots of stuff
109 function render(model) {
115 * Called at existing node
117 function update(canvasNode, oldModel, newModel) {
121 function makeGL(w,h) {
122 var node = newNode('canvas');
123 var gl = node.getContext('webgl');
124 return Signal.constant({w:w,h:h,gl:gl,node:node});
127 function bufferMesh(triangles, context) {
132 function pushTriangle(n, node) {
133 if (node.ctor === "[]") return;
135 for (var i = 0; i < 3; i+= 1) {
136 indices.push(3 * n + i);
137 var vertex = tri['_' + i];
138 for (var j = 0; j < 3; j += 1) {
139 positions.push(vertex.pos[j]);
141 colors.push(vertex.color._0 / 256);
142 colors.push(vertex.color._1 / 256);
143 colors.push(vertex.color._2 / 256);
144 colors.push(vertex.color._3);
146 pushTriangle(n+1,node._1);
149 pushTriangle(0,triangles);
153 var indexBuffer = gl.createBuffer();
154 gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer);
155 gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(indices), gl.STATIC_DRAW);
157 var vertexPosBuffer = gl.createBuffer();
158 gl.bindBuffer(gl.ARRAY_BUFFER, vertexPosBuffer);
159 gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(positions), gl.STATIC_DRAW);
161 var vertexColorBuffer = gl.createBuffer();
162 gl.bindBuffer(gl.ARRAY_BUFFER, vertexColorBuffer);
163 gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(colors), gl.STATIC_DRAW);
166 indexBuffer: indexBuffer,
167 vertexPosBuffer: vertexPosBuffer,
168 vertexColorBuffer: vertexColorBuffer,
169 numIndices: indices.length,
174 function webgl(context, glModels) {
176 return A3(newElement, context.w, context.h, {
182 aspect: context.w/context.h,
191 function linkModel(program, uniforms, attributes) {
195 attributes: attributes,
199 return elm.Native.Graphics.WebGL.values = {
201 bufferMesh:F2(bufferMesh),
203 linkProgram:F3(linkProgram),
204 linkModel:F3(linkModel),
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list