Index: mojo/apps/js/main.js |
diff --git a/mojo/apps/js/main.js b/mojo/apps/js/main.js |
index 88115ffacaced518a6cd0def8cb311ed8298acf1..17cff8fb6b1a12564883d3bd17588d0714e26108 100644 |
--- a/mojo/apps/js/main.js |
+++ b/mojo/apps/js/main.js |
@@ -3,13 +3,13 @@ |
// found in the LICENSE file. |
define([ |
- "console", |
- "mojo/apps/js/bindings/connector", |
- "mojo/apps/js/bindings/core", |
- "mojo/apps/js/bindings/gl", |
- "mojo/apps/js/bindings/threading", |
- "mojom/native_viewport", |
- "mojom/gles2", |
+ 'console', |
+ 'mojo/apps/js/bindings/connector', |
+ 'mojo/apps/js/bindings/core', |
+ 'mojo/apps/js/bindings/gl', |
+ 'mojo/apps/js/bindings/threading', |
+ 'mojom/native_viewport', |
+ 'mojom/gles2', |
], function(console, |
connector, |
core, |
@@ -18,13 +18,137 @@ define([ |
nativeViewport, |
gles2) { |
- const VERTEX_SHADER_SOURCE = |
- "uniform mat4 u_mvpMatrix; \n" + |
- "attribute vec4 a_position; \n" + |
- "void main() \n" + |
- "{ \n" + |
- " gl_Position = u_mvpMatrix * a_position; \n" + |
- "} \n"; |
+ const VERTEX_SHADER_SOURCE = [ |
+ 'uniform mat4 u_mvpMatrix;', |
+ 'attribute vec4 a_position;', |
+ 'void main()', |
+ '{', |
+ ' gl_Position = u_mvpMatrix * a_position;', |
+ '}' |
+ ].join('\n'); |
+ |
+ const FRAGMENT_SHADER_SOURCE = [ |
+ 'precision mediump float;', |
+ 'void main()', |
+ '{', |
+ ' gl_FragColor = vec4( 0.0, 1.0, 0.0, 1.0 );', |
+ '}' |
+ ].join('\n'); |
+ |
+ function ESMatrix() { |
+ this.m = new Float32Array(16); |
+ } |
+ |
+ ESMatrix.prototype.loadZero = function() { |
+ for (var i = 0; i < this.m.length; i++) { |
+ this.m[i] = 0; |
+ } |
+ }; |
+ |
+ ESMatrix.prototype.loadIdentity = function() { |
+ this.loadZero(); |
+ for (var i = 0; i < 4; i++) { |
+ this.m[i*4+i] = 1; |
+ } |
+ }; |
+ |
+ function loadProgram(gl) { |
+ var vertexShader = gl.createShader(gl.VERTEX_SHADER); |
+ gl.shaderSource(vertexShader, VERTEX_SHADER_SOURCE); |
+ gl.compileShader(vertexShader); |
+ |
+ var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER); |
+ gl.shaderSource(fragmentShader, FRAGMENT_SHADER_SOURCE); |
+ gl.compileShader(fragmentShader); |
+ |
+ var program = gl.createProgram(); |
+ gl.attachShader(program, vertexShader); |
+ gl.attachShader(program, fragmentShader); |
+ |
+ gl.linkProgram(program); |
+ // TODO(aa): Check for errors using getProgramiv and LINK_STATUS. |
+ |
+ gl.deleteShader(vertexShader); |
+ gl.deleteShader(fragmentShader); |
+ |
+ return program; |
+ } |
+ |
+ var vboVertices; |
+ var vboIndices; |
+ function generateCube(gl) { |
+ var numVertices = 24 * 3; |
+ var numIndices = 12 * 3; |
+ |
+ var cubeVertices = new Float32Array([ |
+ -0.5, -0.5, -0.5, |
+ -0.5, -0.5, 0.5, |
+ 0.5, -0.5, 0.5, |
+ 0.5, -0.5, -0.5, |
+ -0.5, 0.5, -0.5, |
+ -0.5, 0.5, 0.5, |
+ 0.5, 0.5, 0.5, |
+ 0.5, 0.5, -0.5, |
+ -0.5, -0.5, -0.5, |
+ -0.5, 0.5, -0.5, |
+ 0.5, 0.5, -0.5, |
+ 0.5, -0.5, -0.5, |
+ -0.5, -0.5, 0.5, |
+ -0.5, 0.5, 0.5, |
+ 0.5, 0.5, 0.5, |
+ 0.5, -0.5, 0.5, |
+ -0.5, -0.5, -0.5, |
+ -0.5, -0.5, 0.5, |
+ -0.5, 0.5, 0.5, |
+ -0.5, 0.5, -0.5, |
+ 0.5, -0.5, -0.5, |
+ 0.5, -0.5, 0.5, |
+ 0.5, 0.5, 0.5, |
+ 0.5, 0.5, -0.5 |
+ ]); |
+ |
+ var cubeIndices = new Uint16Array([ |
+ 0, 2, 1, |
+ 0, 3, 2, |
+ 4, 5, 6, |
+ 4, 6, 7, |
+ 8, 9, 10, |
+ 8, 10, 11, |
+ 12, 15, 14, |
+ 12, 14, 13, |
+ 16, 17, 18, |
+ 16, 18, 19, |
+ 20, 23, 22, |
+ 20, 22, 21 |
+ ]); |
+ |
+ // TODO(aa): The C++ program branches here on whether the pointer is |
+ // non-NULL. |
+ vboVertices = gl.createBuffer(); |
+ gl.bindBuffer(gl.ARRAY_BUFFER, vboVertices); |
+ gl.bufferData(gl.ARRAY_BUFFER, cubeVertices, gl.STATIC_DRAW); |
+ gl.bindBuffer(gl.ARRAY_BUFFER, 0); |
+ |
+ vboIndices = gl.createBuffer(); |
+ gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, vboIndices); |
+ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, cubeIndices, gl.STATIC_DRAW); |
+ gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, 0); |
+ |
+ return cubeIndices.length; |
+ } |
+ |
+ function drawCube(gl, width, height, program, positionLocation, mvpLocation, |
+ numIndices, mvpMatrix) { |
+ gl.viewport(0, 0, width, height); |
+ gl.clear(gl.COLOR_BUFFER_BIT); |
+ gl.useProgram(program); |
+ gl.bindBuffer(gl.ARRAY_BUFFER, vboVertices); |
+ gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, vboIndices); |
+ gl.vertexAttribPointer(positionLocation, 3, gl.FLOAT, false, 12, 0); |
+ gl.enableVertexAttribArray(positionLocation); |
+ gl.uniformMatrix4fv(mvpLocation, false, mvpMatrix.m); |
+ gl.drawElements(gl.TRIANGLES, numIndices, gl.UNSIGNED_SHORT, 0); |
+ } |
function NativeViewportClientImpl() { |
} |
@@ -37,7 +161,7 @@ define([ |
Object.create(nativeViewport.NativeViewportClientStub.prototype); |
NativeViewportClientImpl.prototype.didOpen = function() { |
- console.log("NativeViewportClientImpl.prototype.DidOpen"); |
+ console.log(['NativeViewportClientImpl.prototype.DidOpen']); |
abarth-chromium
2013/12/18 01:19:30
Why the [ ] ?
Aaron Boodman
2013/12/18 02:19:08
Jochen recently changed it to be required:
http:/
|
}; |
@@ -50,18 +174,23 @@ define([ |
GLES2ClientImpl.prototype.didCreateContext = function(encoded, |
width, |
height) { |
- console.log("GLES2ClientImpl.prototype.didCreateContext"); |
+ console.log(['GLES2ClientImpl.prototype.didCreateContext']); |
var gl = new gljs.Context(encoded, width, height); |
+ var program = loadProgram(gl); |
+ var positionLocation = gl.getAttribLocation(program, 'a_position'); |
+ var mvpLocation = gl.getUniformLocation(program, 'u_mvpMatrix'); |
+ var numIndices = generateCube(gl); |
+ var mvpMatrix = new ESMatrix(); |
- var shader = gl.createShader(gl.VERTEX_SHADER); |
- console.log("shader is: ", String(shader)); |
- gl.shaderSource(shader, VERTEX_SHADER_SOURCE); |
- gl.compileShader(shader); |
- console.log("all done"); |
+ gl.clearColor(0, 0, 0, 0); |
+ mvpMatrix.loadIdentity(); |
+ drawCube(gl, width, height, program, positionLocation, mvpLocation, |
+ numIndices, mvpMatrix); |
+ gl.swapBuffers(); |
}; |
GLES2ClientImpl.prototype.contextLost = function() { |
- console.log("GLES2ClientImpl.prototype.contextLost"); |
+ console.log(['GLES2ClientImpl.prototype.contextLost']); |
}; |
return function(handle) { |