<html> <head> <script id="vertex-shader" type="x-shader/x-vertex" > // vertex shader goes here </script> <script id="fragment-shader" type="x-shader/x-fragment"> // fragment shader goes here </script> <script src="https://mirkwood.cs.edinboro.edu/~bennett/GraphicsCode/Common/webgl-utils.js" ></script> <script src="https://mirkwood.cs.edinboro.edu/~bennett/GraphicsCode/Common/initShaders.js"></script> <script src="https://mirkwood.cs.edinboro.edu/~bennett/GraphicsCode/Common/MV.js"></script> <script type="text/javascript" src="Widget.js"></script> <script type="text/javascript" src="Program.js"></script> <script type="text/javascript" src="GLCanvas.js"></script> <body> <script> 'use strict' var canvas = new Canvas(500, 500,Keypress,"vertex-shader", "fragment-shader"); var Objects = []; MakeItems(); Display(); </script> </body>
attribute vec4 vPosition; void main() { float d = 0.2; // translate matrix // note the matrix appears to be transposed, it is not. // GLSL is column major, not row major mat4 translate = mat4( vec4(1.0, 0.0, 0.0, 0.0), // first column vec4(0.0, 1.0, 0.0, 0.0), // second column vec4(0.0, 0.0, 1.0, 0.0), // third column vec4(0.0, 0.25, 0.75, 1.0) // last column ); // pinhole camera projection matrix. mat4 project = mat4( vec4(1.0, 0.0, 0.0, 0.0), vec4(0.0, 1.0, 0.0, 0.0), vec4(0.0, 0.0, 0.0, 1.0/d), vec4(0.0, 0.0, 0.0, 0.0) ); // apply the transformations gl_Position = project * translate * vPosition; }
void main(){ gl_FragColor = vec4 (1.0, 0.0, 1.0, 1.0) ; }
class Canvas { constructor (width, height, Keypress, vertShader, fragShader) { this.height = height; this.width = width; this.MakeCanvas(); this.canvas.addEventListener("keypress", Keypress); this.SetupGL(); this.MakeShaders(vertShader, fragShader); this.Init(); }
MakeCanvas() { if (this.width == undefined || this.width < 0) { this.width = 300; } if (this.height == undefined || this.height < 0) { this.height = 300; } this.canvas = document.createElement('canvas') this.canvas.tabIndex=0; this.canvas.height = this.height; this.canvas.width = this.width; this.canvas.style="border:1px solid #000000;" document.body.appendChild(this.canvas); }
SetupGL() { this.gl = WebGLUtils.setupWebGL(this.canvas); if (!this.gl) { alert ("WebGL isn't available"); return; } this.gl.getExtension('OES_standard_derivatives'); }
MakeShaders(vertShader, fragShader) { this.program = initShaders(this.gl, vertShader,fragShader); this.gl.useProgram(this.program); }
Init() { this.gl.clearColor(1.0, 1.0, 1.0, 1.0); this.gl.viewport(0,0, this.width, this.height); }
Program() { return this.program; }
GL() { return this.gl; }
Clear() { this.gl.clear(this.gl.COLOR_BUFFER_BIT); } } // closing of class
class Widget { constructor(gl, program, posName, edges) { this.visible = true; this.size = edges.length; this.SetupVBO(gl, program, posName, edges); }
SetupVBO(gl, program, posName, edges) { this.vbuf = gl.createBuffer(); gl.bindBuffer(gl.ARRAY_BUFFER, this.vbuf); this.pos = gl.getAttribLocation(program, posName); gl.bufferData(gl.ARRAY_BUFFER,flatten(edges),gl.STATIC_DRAW); }
Show() { this.visible = true; } Hide() { this.visible = false; } Visible() { return this.visible; }
Display(gl) { if (this.visible) { gl.bindBuffer(gl.ARRAY_BUFFER, this.vbuf); gl.vertexAttribPointer(this.pos, 3, gl.FLOAT, false, 0, 0); gl.drawArrays(gl.LINE_LOOP, 0, this.size); } } } // closing of class.