sku-pg
Version:
Skulpt is a Javascript implementation of Python 2.x. Python that runs in your browser!
147 lines (128 loc) • 5 kB
HTML
<html>
<head>
<meta charset="utf-8">
<title>WebGL 3D</title>
<style type="text/css">
body { background-color: grey;}
canvas { background-color: white;}
</style>
<script src="../../dist/skulpt.js" type="text/javascript"></script>
<script src="../../dist/builtin.js" type="text/javascript"></script>
</head>
<body>
<h1>WebGL 3D</h1>
<form>
<textarea id="code" name="code" cols="120" rows="40">
import webgl
from math import sin
gl = webgl.Context("my-canvas")
trianglesVerticeBuffer = gl.createBuffer()
trianglesColorBuffer = gl.createBuffer()
program = None
uViewMatrix = None
uProjMatrix = None
viewMatrix = webgl.Matrix4x4([1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0])
projMatrix = webgl.Matrix4x4([1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0])
def setup():
print viewMatrix
print projMatrix
global program, uViewMatrix, uProjMatrix
vs = gl.createShader(gl.VERTEX_SHADER)
gl.shaderSource(vs, "" +
"attribute vec3 aVertexPosition;" +
"attribute vec3 aVertexColor;" +
"" +
"uniform mat4 uViewMatrix;" +
"uniform mat4 uProjMatrix;" +
"" +
"varying highp vec4 vColor;" +
"void main(void) {" +
" gl_Position = uProjMatrix * uViewMatrix * vec4(aVertexPosition, 1.0);" +
" vColor = vec4(aVertexColor, 1.0);" +
"}")
gl.compileShader(vs)
print "Vertex shader COMPILE_STATUS: " + str(gl.getShaderParameter(vs, gl.COMPILE_STATUS))
fs = gl.createShader(gl.FRAGMENT_SHADER)
gl.shaderSource(fs, "" +
"varying highp vec4 vColor;" +
"void main(void) {" +
" gl_FragColor = vColor;" +
"}")
gl.compileShader(fs)
print "Fragment shader COMPILE_STATUS: " + str(gl.getShaderParameter(fs, gl.COMPILE_STATUS))
program = gl.createProgram()
gl.attachShader(program, vs)
gl.attachShader(program, fs)
gl.linkProgram(program)
print "Program LINK_STATUS: " + str(gl.getProgramParameter(program, gl.LINK_STATUS))
gl.useProgram(program)
triangleVerticeColors = [1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 1.0]
gl.bindBuffer(gl.ARRAY_BUFFER, trianglesColorBuffer)
gl.bufferData(gl.ARRAY_BUFFER, webgl.Float32Array(triangleVerticeColors), gl.STATIC_DRAW)
uViewMatrix = gl.getUniformLocation(program, "uViewMatrix")
uProjMatrix = gl.getUniformLocation(program, "uProjMatrix")
projMatrix.perspective(45, 4.0/3.0, 0.1, 100.0)
viewMatrix.identity()
viewMatrix.translate([0.0, 0.0, -2.0])
gl.clearColor(0.0, 0.0, 0.0, 1.0);
gl.viewport(0, 0, 400, 300);
def draw(gl, elapsed):
gl.clear(gl.COLOR_BUFFER_BIT);
translation = sin(elapsed * 2.0 * 3.14159 / 10000.0)/2.0;
triangleVertices = [-0.5 + translation, 0.5, -0.5,
0.0 + translation, 0.0, -0.5,
-0.5 + translation, -0.5, -0.5,
0.5 + translation, 0.5, 0.5,
0.0 + translation, 0.0, 0.5,
0.5 + translation, -0.5, 0.5]
gl.bindBuffer(gl.ARRAY_BUFFER, trianglesVerticeBuffer)
gl.bufferData(gl.ARRAY_BUFFER, webgl.Float32Array(triangleVertices), gl.DYNAMIC_DRAW)
gl.uniformMatrix4fv(uProjMatrix, False, projMatrix)
gl.uniformMatrix4fv(uViewMatrix, False, viewMatrix)
vertexPositionAttribute = gl.getAttribLocation(program, "aVertexPosition")
gl.enableVertexAttribArray(vertexPositionAttribute)
gl.bindBuffer(gl.ARRAY_BUFFER, trianglesVerticeBuffer)
gl.vertexAttribPointer(vertexPositionAttribute, 3, gl.FLOAT, False, 0, 0)
vertexColorAttribute = gl.getAttribLocation(program, "aVertexColor")
gl.enableVertexAttribArray(vertexColorAttribute)
gl.bindBuffer(gl.ARRAY_BUFFER, trianglesColorBuffer)
gl.vertexAttribPointer(vertexColorAttribute, 3, gl.FLOAT, False, 0, 0)
gl.drawArrays(gl.TRIANGLES, 0, 6)
setup()
gl.setDrawFunc(draw);
</textarea>
<button onclick="runit()" type="button">Run</button>
</form>
<canvas id="my-canvas" height="300" width="400">
Your browser does not support the HTML5 canvas element.
</canvas>
<pre id="my-output" ></pre>
<script>
function outputHandler(text) {
var output = document.getElementById("my-output");
output.innerHTML = output.innerHTML + text.replace(/</g, '<');
}
function builtinRead(x) {
if (Sk.builtinFiles === undefined || Sk.builtinFiles["files"][x] === undefined) {
throw "File not found: '" + x + "'";
}
return Sk.builtinFiles["files"][x];
}
function runit() {
var prog = document.getElementById("code").value;
// Clear the output
document.getElementById("my-output").innerHTML = '';
Sk.canvas = "my-canvas";
Sk.pre = "my-output";
Sk.configure({"output":outputHandler, "read":builtinRead});
try {
eval(Sk.importMainWithBody("<stdin>", false, prog));
}
catch(e) {
alert(e);
}
}
</script>
</body>
</html>