Depth
The HTML file:
<html>
<head>
<script id="vertex-shader" type="x-shader/x-vertex" >
attribute vec4 vPosition;
attribute vec4 vColor;
varying vec4 f_Color;
void main() {
gl_Position = vPosition;
f_Color = vColor;
}
</script>
<script id="fragment-shader" type="x-shader/x-fragment">
precision mediump float;
varying vec4 f_Color;
void main() {
gl_FragColor = f_Color;
}
</script>
<script type="text/javascript" src="../Common/webgl-utils.js"></script>
<script type="text/javascript" src="../Common/initShaders.js"></script>
<script type="text/javascript" src="../Common/MV.js"></script>
<script type="text/javascript" src="SepTriCanvas.js"></script>
<script src="https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js"></script>
<style>
input {
text-align: right;
}
</style>
</head>
<body>
<h1>A Sierpinski Gasket With Triangles</h1>
<script>
var WIDTH = 500;
var HEIGHT = 500;
var canvas = new Canvas(WIDTH, HEIGHT);
window.addEventListener("load", function(event){
document.getElementById('DepthBox').value = canvas.GetDepth();
});
</script>
<p>
Depth
<input
type="text"
name="Depth"
maxLength = "5"
size = "5"
value = ""
id="DepthBox", onchange="canvas.ChangeDepth(this.value)">
<p>
</body>
The Javascript File
function Canvas(width, height, locID) {
if (width == undefined || width < 0) {
width = 300;
}
if (height == undefined || height < 0) {
height = 300;
}
var canvas = document.createElement('canvas')
canvas.height = height;
canvas.width = width;
if(locID == undefined) {
document.body.appendChild(canvas);
} else {
div = document.getElementById(locID);
if (null == div) {
document.body.appendChild(canvas);
} else {
div.appendChild(canvas);
}
}
document.body.appendChild(canvas);
this.height = height;
this.width = width;
// new stuff
var gl = WebGLUtils.setupWebGL(canvas);
if (!gl) {
alert ("WebGL isn't available");
}
this.gl = gl;
gl.viewport(0,0, width, height);
program = initShaders(gl, "vertex-shader","fragment-shader");
gl.useProgram(program);
// a buffer for the vertexes
this.vBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, this.vBuffer);
vPosition = gl.getAttribLocation(program, "vPosition");
gl.vertexAttribPointer(vPosition,2,gl.FLOAT, false,0,0);
gl.enableVertexAttribArray(vPosition);
// a buffer for the colors
this.cBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, this.cBuffer);
colorAttribute = gl.getAttribLocation(program, "vColor");
gl.vertexAttribPointer(colorAttribute,3,gl.FLOAT, false,0,0);
gl.enableVertexAttribArray(colorAttribute);
// end new stuff
this.maxDepth = 1;
this.Init();
return this;
}
Canvas.prototype = {
Init: function() {
this.gl.clearColor(1.0, 1.0, 1.0, 1.0);
this.RestartList();
},
RestartList: function() {
this.currentDepth = 1;
var p1 = vec2(-0.8, -0.8);
var p2 = vec2(0, .8);
var p3 = vec2(0.8, -0.8);
this.vertex= [p1, p2, p3] ;
var c1 = vec3(Math.random(), Math.random(),Math.random())
var c2 = vec3(Math.random(), Math.random(),Math.random())
var c3 = vec3(Math.random(), Math.random(),Math.random())
this.colors = [c1, c2, c3];
this.MakePoints();
this.UpdateBuffers();
this.Redisplay();
},
UpdateBuffers: function() {
gl = this.gl;
// change the vertex data
gl.bindBuffer(gl.ARRAY_BUFFER, this.vBuffer);
gl.bufferData(gl.ARRAY_BUFFER,flatten(this.vertex),gl.DYNAMIC_DRAW);
// change the color data
gl.bindBuffer(this.gl.ARRAY_BUFFER, this.cBuffer);
gl.bufferData(gl.ARRAY_BUFFER,flatten(this.colors),gl.DYNAMIC_DRAW);
},
GetDepth: function() {
return this.maxDepth;
},
ChangeDepth: function(newDepth) {
var depth = parseInt(newDepth);
if (depth < 1 ) {
alert("depth must be positive");
return;
}
if (depth > 10) {
alert ("Depth has a max value of 10");
depth = 10;
}
if (depth < this.maxDepth) {
this.maxDepth = depth;
this.RestartList();
} else {
this.maxDepth = depth;
this.MakePoints();
var gl = this.gl;
this.UpdateBuffers();
}
this.Redisplay();
},
Interp: function(a,b,s) {
return a*(1-s) + b*s;
},
HalfPoint: function(p1,p2) {
var x = this.Interp(p1[0],p2[0],.5);
var y = this.Interp(p1[1],p2[1],.5);
return vec2(x,y);
},
AddTri: function(p1, p2, p3, vert, c1, colors) {
vert.push(p1);
colors.push(c1);
vert.push(p2);
var c2 = vec3(Math.random(), Math.random(),Math.random())
colors.push(c2);
vert.push(p3);
var c3 = vec3(Math.random(), Math.random(),Math.random())
colors.push(c3);
},
MakePoints: function(){
var newVertex = [];
var newColors = [];
var a,b,c;
var p1, p2, p3;
if (this.currentDepth < this.maxDepth) {
this.currentDepth++;
for(i =0; i < this.vertex.length;i+=3) {
a = this.vertex[i];
b = this.vertex[i+1]
c = this.vertex[i+2];
p1 = this.HalfPoint(a,b,.5);
p2 = this.HalfPoint(a,c,.5);
p3 = this.HalfPoint(b,c,.5);
this.AddTri(a,p1,p2, newVertex, this.colors[i], newColors);
this.AddTri(b,p1,p3, newVertex, this.colors[i+1], newColors);
this.AddTri(c,p2,p3, newVertex, this.colors[i+2], newColors);
}
this.vertex = newVertex;
this.colors = newColors;
this.MakePoints();
}
},
Redisplay: function() {
this.gl.clear(this.gl.COLOR_BUFFER_BIT);
this.gl.drawArrays(this.gl.TRIANGLES, 0, this.vertex.length);
return;
}
};