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(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);
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);
45 gl.attachShader(program, vshader);
46 gl.attachShader(program, fshader);
47 gl.linkProgram(program);
49 if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
50 throw gl.getProgramInfoLog(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) {
77 var aspect = model.aspect;
80 gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
82 var program = model.program;
84 function drawMesh(mesh, sceneMatrix) {
85 gl.useProgram(program.programPtr);
87 gl.enableVertexAttribArray(program.vertexPositionAttribute);
88 gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, mesh.indexBuffer);
89 gl.bindBuffer(gl.ARRAY_BUFFER, mesh.vertexPosBuffer);
90 gl.vertexAttribPointer(program.vertexPositionAttribute, 3, gl.FLOAT, false, 0, 0);
92 gl.enableVertexAttribArray(program.vertexColorAttribute);
93 gl.bindBuffer(gl.ARRAY_BUFFER, mesh.vertexColorBuffer);
94 gl.vertexAttribPointer(program.vertexColorAttribute, 4, gl.FLOAT, false, 0, 0);
96 gl.uniformMatrix4fv(program.sceneMatrixUniform, false, sceneMatrix);
98 gl.drawElements(gl.TRIANGLES, mesh.numIndices, gl.UNSIGNED_SHORT, 0);
101 var sceneMatrixStack = [MJS.M4x4.identity];
103 function drawScene(scene,n) {
106 drawMesh(scene._0, sceneMatrixStack[n]);
110 sceneMatrixStack[n+1] = MJS.M4x4.mul(sceneMatrixStack[n],m)
111 function drawChild(c) {
114 var children = scene._1;
115 List.each(drawChild, children);
120 var scene = model.scene;
126 * Called for new node, caches lots of stuff
128 function render(model) {
134 * Called at existing node
136 function update(canvasNode, oldModel, newModel) {
140 function makeGL(w,h) {
141 var node = newNode('canvas');
142 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});
156 function bufferMesh(triangles, context) {
161 function pushTriangle(n, node) {
162 if (node.ctor === "[]") return;
164 for (var i = 0; i < 3; i+= 1) {
165 indices.push(3 * n + i);
166 var vertex = tri['_' + i];
167 for (var j = 0; j < 3; j += 1) {
168 positions.push(vertex.pos[j]);
170 colors.push(vertex.color._0 / 256);
171 colors.push(vertex.color._1 / 256);
172 colors.push(vertex.color._2 / 256);
173 colors.push(vertex.color._3);
175 pushTriangle(n+1,node._1);
178 pushTriangle(0,triangles);
182 var indexBuffer = gl.createBuffer();
183 gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer);
184 gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(indices), gl.STATIC_DRAW);
186 var vertexPosBuffer = gl.createBuffer();
187 gl.bindBuffer(gl.ARRAY_BUFFER, vertexPosBuffer);
188 gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(positions), gl.STATIC_DRAW);
190 var vertexColorBuffer = gl.createBuffer();
191 gl.bindBuffer(gl.ARRAY_BUFFER, vertexColorBuffer);
192 gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(colors), gl.STATIC_DRAW);
195 indexBuffer: indexBuffer,
196 vertexPosBuffer: vertexPosBuffer,
197 vertexColorBuffer: vertexColorBuffer,
198 numIndices: indices.length,
203 function webgl(context, scene) {
205 return A3(newElement, context.w, context.h, {
211 aspect: context.w/context.h,
214 program: context.program,
221 return elm.Native.Graphics.WebGL.values = {
223 bufferMesh:F2(bufferMesh),
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