diff options
Diffstat (limited to 'dom/canvas/test/webgl-conf/checkout/conformance/rendering/line-loop-tri-fan.html')
-rw-r--r-- | dom/canvas/test/webgl-conf/checkout/conformance/rendering/line-loop-tri-fan.html | 250 |
1 files changed, 250 insertions, 0 deletions
diff --git a/dom/canvas/test/webgl-conf/checkout/conformance/rendering/line-loop-tri-fan.html b/dom/canvas/test/webgl-conf/checkout/conformance/rendering/line-loop-tri-fan.html new file mode 100644 index 000000000..3853afda9 --- /dev/null +++ b/dom/canvas/test/webgl-conf/checkout/conformance/rendering/line-loop-tri-fan.html @@ -0,0 +1,250 @@ +<!-- + +/* +** Copyright (c) 2012 The Khronos Group Inc. +** +** Permission is hereby granted, free of charge, to any person obtaining a +** copy of this software and/or associated documentation files (the +** "Materials"), to deal in the Materials without restriction, including +** without limitation the rights to use, copy, modify, merge, publish, +** distribute, sublicense, and/or sell copies of the Materials, and to +** permit persons to whom the Materials are furnished to do so, subject to +** the following conditions: +** +** The above copyright notice and this permission notice shall be included +** in all copies or substantial portions of the Materials. +** +** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. +*/ + +--> + +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<link rel="stylesheet" href="../../resources/js-test-style.css"/> +<script src="../../js/js-test-pre.js"></script> +<script src="../../js/webgl-test-utils.js"></script> +<script id="vshader" type="x-shader/x-vertex"> +attribute vec2 pos; + +void main() +{ + gl_Position = vec4(pos, 0, 1); +} +</script> + +<script id="fshader" type="x-shader/x-fragment"> +precision mediump float; + +void main() +{ + gl_FragColor = vec4(0, 1, 0, 1); +} +</script> + +<script> +"use strict"; +var wtu = WebGLTestUtils; + +// Check a single 32-bit RGBA pixel. +function checkPixel(buf, index, correct) { + for (var i = 0; i < 4; ++i) { + if (buf[index + i] != correct[i]) { + return false; + } + } + return true; +} + +// Check the line loop by reading the pixels and making sure just the edge +// pixels are green and the rest are black. +function checkLineLoop(gl, w) { + var buf = new Uint8Array(w * w * 4); + gl.readPixels(0, 0, w, w, gl.RGBA, gl.UNSIGNED_BYTE, buf); + var green = [0,255,0,255]; + var black = [0,0,0,255]; + var isCorrect = true; + for (var j = 0; j < w * w * 4; j += 4) { + var correct = black; + if (j < w * 4 || j > w * (w - 1) * 4 || j % (w * 4) == 0 || j % (w * 4) == (w - 1) * 4) { + correct = green; + } + // ignore corner pixels + if ((j == 0) || (j == 4*(w-1)) || (j == 4*w*(w-1)) || (j== 4*(w*w - 1))) { + continue; + } + if (!checkPixel(buf, j, correct)) { + isCorrect = false; + break; + } + } + if (isCorrect) { + testPassed("Line loop was drawn correctly."); + } else { + testFailed("Line loop was drawn incorrectly."); + } +} + +// Check the tri fan by reading the pixels and making sure they are all green. +function checkTriFan(gl, w) { + var buf = new Uint8Array(w * w * 4); + gl.readPixels(0, 0, w, w, gl.RGBA, gl.UNSIGNED_BYTE, buf); + var filled = true; + for (var j = 0; j < w * w * 4; j += 4) { + if (!checkPixel(buf, j, [0,255,0,255])) { + filled = false; + break; + } + } + if (filled) { + testPassed("Triangle fan was drawn correctly."); + } else { + testFailed("Triangle fan was drawn incorrectly."); + } +} + +function runTest() { + var gl = wtu.create3DContext('testbed', { antialias: false }); + if (!gl) { + testFailed('could not create context'); + return; + } + gl.clearColor(0, 0, 0, 1); + var program = wtu.setupProgram(gl, ['vshader', 'fshader'], ['pos']) + var w = document.getElementById('testbed').width; + + gl.enableVertexAttribArray(0); + + //---------- LINE_LOOP---------- + var d = 1/w; + var vertices = new Float32Array([-1+d, -1+d, 1-d, -1+d, 1-d, 1-d, -1+d, 1-d]); + var vertBuf = gl.createBuffer(); + gl.bindBuffer(gl.ARRAY_BUFFER, vertBuf); + gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW); + gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0); + var indBuf = gl.createBuffer(); + var indices = new Uint16Array([0, 1, 2, 3]); + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indBuf); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW); + + debug('Draw a square using a line loop and verify that it draws all four sides and nothing else.'); + gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); + gl.drawArrays(gl.LINE_LOOP, 0, vertices.length / 2); + checkLineLoop(gl, w); + + debug('Draw a square using an indexed line loop and verify that it draws all four sides and nothing else.'); + gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); + gl.drawElements(gl.LINE_LOOP, indices.length, gl.UNSIGNED_SHORT, 0); + checkLineLoop(gl, w); + + vertices = new Float32Array([0, 0, 0, 0, 0, 0, -1+d, -1+d, 1-d, -1+d, 1-d, 1-d, -1+d, 1-d]); + vertBuf = gl.createBuffer(); + gl.bindBuffer(gl.ARRAY_BUFFER, vertBuf); + gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW); + gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0); + indBuf = gl.createBuffer(); + indices = new Uint16Array([0, 1, 2, 3, 4, 5, 6]); + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indBuf); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW); + + debug('Draw a square using a line loop with a vertex buffer offset and verify that it draws all four sides and nothing else.'); + gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); + gl.drawArrays(gl.LINE_LOOP, 3, vertices.length / 2 - 3); + checkLineLoop(gl, w); + + debug('Draw a square using an indexed line loop with an index buffer offset and verify that it draws all four sides and nothing else.'); + gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); + gl.drawElements(gl.LINE_LOOP, indices.length - 3, gl.UNSIGNED_SHORT, 3 * 2); + checkLineLoop(gl, w); + + //---------- LINE_LOOP UBYTE ---------- + var degenVerts = new Array(252 * 2); + for (var j = 0; j < 252 * 2; ++j) { + degenVerts[j] = -1+d; + } + degenVerts = degenVerts.concat([-1+d, -1+d, 1-d, -1+d, 1-d, 1-d, -1+d, 1-d]); + vertices = new Float32Array(degenVerts); + vertBuf = gl.createBuffer(); + gl.bindBuffer(gl.ARRAY_BUFFER, vertBuf); + gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW); + gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0); + indBuf = gl.createBuffer(); + var degenInd = new Array(252); + for (var j = 0; j < 252; ++j) { + degenInd[j] = j; + } + degenInd = degenInd.concat([252, 253, 254, 255]); + indices = new Uint16Array(degenInd); + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indBuf); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW); + + debug('Draw a square using an ubyte indexed line loop with 256 indices and verify that it draws all four sides and nothing else.'); + gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); + gl.drawElements(gl.LINE_LOOP, indices.length, gl.UNSIGNED_SHORT, 0); + checkLineLoop(gl, w); + + //---------- TRIANGLE_FAN ---------- + vertices = new Float32Array([0, 0, -1, -1, 1, -1, 1, 1, -1, 1, -1, -1]); + vertBuf = gl.createBuffer(); + gl.bindBuffer(gl.ARRAY_BUFFER, vertBuf); + gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW); + gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0); + indices = new Uint16Array([0,1,2,3,4,5]); + indBuf = gl.createBuffer(); + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indBuf); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW); + + debug('Draw a filled square using a triangle fan and verify that it fills the entire canvas.'); + gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); + gl.drawArrays(gl.TRIANGLE_FAN, 0, vertices.length / 2); + checkTriFan(gl, w); + + debug('Draw a filled square using an indexed triangle fan and verify that it fills the entire canvas.'); + gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); + gl.drawElements(gl.TRIANGLE_FAN, indices.length, gl.UNSIGNED_SHORT, 0); + checkTriFan(gl, w); + + vertices = new Float32Array([1, 1, 1, 1, 1, 1, 0, 0, -1, -1, 1, -1, 1, 1, -1, 1, -1, -1]); + vertBuf = gl.createBuffer(); + gl.bindBuffer(gl.ARRAY_BUFFER, vertBuf); + gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW); + gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0); + indices = new Uint16Array([0,1,2,3,4,5,6,7,8]); + indBuf = gl.createBuffer(); + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indBuf); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW); + + debug('Draw a filled square using a triangle fan with a vertex buffer offset and verify that it fills the entire canvas.'); + gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); + gl.drawArrays(gl.TRIANGLE_FAN, 3, vertices.length / 2 - 3); + checkTriFan(gl, w); + + debug('Draw a filled square using an indexed triangle fan with an index buffer offset and verify that it fills the entire canvas.'); + gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); + gl.drawElements(gl.TRIANGLE_FAN, indices.length - 3, gl.UNSIGNED_SHORT, 3 * 2); + checkTriFan(gl, w); +} +</script> +</head> +<body> +<canvas id="testbed" width="10" height="10" style="width:50px; height:50px"></canvas> +<div id="description"></div> +<div id="console"></div> +<script> +"use strict"; +description('Verify that LINE_LOOP and TRIANGLE_FAN works correctly.'); +runTest(); +var successfullyParsed = true; +</script> +<script src="../../js/js-test-post.js"></script> + +</body> +</html> |