Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- var html=null;
- var gl=null;
- /* shaders */
- var vertexShader=null;
- var fragmentShader=null;
- /* shader program */
- var shaderProgram=null;
- /* vertex attributes locations */
- var position=null;
- var plot=null;
- /* uniform variables locations */
- /* input vertices of cube triangles */
- var arrayBuffer=null;
- /* texture parameters */
- // var textureId=null;
- // var textureUnit=0; // default
- var vertexShaderSource=`attribute vec3 aPosition;
- attribute vec3 aNormal;
- uniform mat4 projection;
- uniform mat4 rotation;
- uniform vec3 move;
- varying vec3 fragmentnormal;
- void main()
- {
- vec4 pos = rotation * vec4(aPosition, 1.0) + vec4(move, 0.0);
- vec4 normNorm=rotation*vec4(aNormal,1.0);
- fragmentnormal=vec3(normNorm[0],normNorm[1],normNorm[2]);
- gl_Position = projection * pos;
- }`
- var fragmentShaderSource=`
- precision mediump float;
- varying vec3 fragmentnormal;
- void main()
- {
- vec3 lightD=vec3(-0.2,-1.0,-0.3);
- float ambientStrength = 0.1;
- vec3 ambient = ambientStrength * vec3(1.0,1.0,1.0);
- vec3 normal = normalize(fragmentnormal);
- if (gl_FrontFacing) {
- normal = -normal;
- }
- vec3 lightDir =normalize(-lightD);
- float diff = max(abs(dot(normal,lightDir)),0.0);
- vec3 diffuse= diff *vec3(1.0,1.0,1.0);
- vec3 result = (ambient+diffuse) * vec3(1.0,1.0,1.0);
- gl_FragColor = vec4(result, 1.0);
- }`
- var sinxcosyBuffer=null;
- var rippleBuffer=null;
- var pyrammidBuffer=null;
- var stairsBuffer = null;
- var normalLocation=null;
- var makeShaderProgram= function(gl){
- /* Parameters:
- gl - WebGL context
- */
- vertexShader = gl.createShader(gl.VERTEX_SHADER);
- gl.shaderSource(vertexShader, vertexShaderSource);
- gl.compileShader(vertexShader);
- if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) {
- console.log(gl.getShaderInfoLog(vertexShader));
- return null;
- }
- fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
- gl.shaderSource(fragmentShader, fragmentShaderSource);
- gl.compileShader(fragmentShader);
- if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {
- console.log(gl.getShaderInfoLog(fragmentShader));
- return null;
- }
- shaderProgram = gl.createProgram();
- gl.attachShader(shaderProgram, vertexShader);
- gl.attachShader(shaderProgram, fragmentShader);
- gl.linkProgram(shaderProgram);
- if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) {
- console.log("Could not initialise shaders");
- return null;
- }
- gl.useProgram(shaderProgram);
- /* set vertex attributes locations */
- aPositionLocation=gl.getAttribLocation(shaderProgram, "aPosition");
- normalLocation=gl.getAttribLocation(shaderProgram,"aNormal");
- // gl.bindAttribLocation(shaderProgram,"aNormal",2);
- /* set uniform variables locations */
- projectionLocation=gl.getUniformLocation(shaderProgram, "projection");
- rotationLocation=gl.getUniformLocation(shaderProgram, "rotation");
- moveLocation=gl.getUniformLocation(shaderProgram, "move");
- /* load data buffers */
- sinxcosyBuffer= gl.createBuffer();
- gl.bindBuffer(gl.ARRAY_BUFFER, sinxcosyBuffer );
- let sinxcosyArray=[]
- for (let i = -500; i < 500; i+=2) {
- for(let j=-500 ; j<500;j+=2)
- sinxcosyArray.push(i/100,j/100,Math.sin(i/100)*Math.cos(j/100));
- }
- let sinxcosyArray2=[]
- for(let i=0;i<sinxcosyArray.length;i+=3){
- if(i+1503<sinxcosyArray.length && (i + 3) % 500 != 0){
- vx=sinxcosyArray[i+3]-sinxcosyArray[i];
- vy=sinxcosyArray[i+4]-sinxcosyArray[i+1];
- vz=sinxcosyArray[i+5]-sinxcosyArray[i+2];
- wx=sinxcosyArray[i+1500]-sinxcosyArray[i];
- wy=sinxcosyArray[i+1501]-sinxcosyArray[i+1];
- wz=sinxcosyArray[i+1502]-sinxcosyArray[i+2];
- nx=(vy*wz)-(vz*wy);
- ny=(vz*wx)-(vx*wz);
- nz=(vx*wy)-(vy*wx);
- sinxcosyArray2.push(sinxcosyArray[i],sinxcosyArray[i+1],sinxcosyArray[i+2]);
- sinxcosyArray2.push(nx,ny,nz);
- sinxcosyArray2.push(sinxcosyArray[i+3],sinxcosyArray[i+4],sinxcosyArray[i+5]);
- sinxcosyArray2.push(nx,ny,nz);
- sinxcosyArray2.push(sinxcosyArray[i+1500],sinxcosyArray[i+1501],sinxcosyArray[i+1502])
- sinxcosyArray2.push(nx,ny,nz);
- wx=sinxcosyArray[i+1503]-sinxcosyArray[i+1500];
- wy=sinxcosyArray[i+1504]-sinxcosyArray[i+1501];
- wz=sinxcosyArray[i+1505]-sinxcosyArray[i+1502];
- vx=sinxcosyArray[i+3]-sinxcosyArray[i+1500];
- vy=sinxcosyArray[i+4]-sinxcosyArray[i+1501];
- vz=sinxcosyArray[i+5]-sinxcosyArray[i+1502];
- nx=(vy*wz)-(vz*wy);
- ny=(vz*wx)-(vx*wz);
- nz=(vx*wy)-(vy*wx);
- sinxcosyArray2.push(sinxcosyArray[i+1500],sinxcosyArray[i+1501],sinxcosyArray[i+1502])
- sinxcosyArray2.push(nx,ny,nz);
- sinxcosyArray2.push(sinxcosyArray[i+1503],sinxcosyArray[i+1504],sinxcosyArray[i+1505])
- sinxcosyArray2.push(nx,ny,nz);
- sinxcosyArray2.push(sinxcosyArray[i+3],sinxcosyArray[i+4],sinxcosyArray[i+5]);
- sinxcosyArray2.push(nx,ny,nz);
- }
- }
- console.log(sinxcosyArray2.length)
- gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(sinxcosyArray2) , gl.STATIC_DRAW );
- plot=sinxcosyBuffer
- rippleBuffer=gl.createBuffer();
- gl.bindBuffer(gl.ARRAY_BUFFER,rippleBuffer);
- let rippleArray=[];
- for (let i = -500; i < 500; i+=2) {
- for(let j=-500 ; j<500;j+=2)
- rippleArray.push(i/100,j/100, Math.sin(10*(i/100)*(i/100)+(j/100)*(j/100))/10 );
- }
- let rippleArray2=[];
- for(let i=0;i<rippleArray.length;i+=3){
- vx=rippleArray[i+3]-rippleArray[i];
- vy=rippleArray[i+4]-rippleArray[i+1];
- vz=rippleArray[i+5]-rippleArray[i+2];
- wx=rippleArray[i+1500]-rippleArray[i];
- wy=rippleArray[i+1501]-rippleArray[i+1];
- wz=rippleArray[i+1502]-rippleArray[i+2];
- nx=(vy*wz)-(vz*wy);
- ny=(vz*wx)-(vx*wz);
- nz=(vx*wy)-(vy*wx);
- rippleArray2.push(rippleArray[i],rippleArray[i+1],rippleArray[i+2]);
- rippleArray2.push(nx,ny,nz);
- rippleArray2.push(rippleArray[i+3],rippleArray[i+4],rippleArray[i+5]);
- rippleArray2.push(nx,ny,nz);
- rippleArray2.push(rippleArray[i+1500],rippleArray[i+1501],rippleArray[i+1502])
- rippleArray2.push(nx,ny,nz);
- vx=rippleArray[i+1503]-rippleArray[i+1500];
- vy=rippleArray[i+1504]-rippleArray[i+1501];
- vz=rippleArray[i+1505]-rippleArray[i+1502];
- wx=rippleArray[i+3]-rippleArray[i+1503];
- wy=rippleArray[i+4]-rippleArray[i+1504];
- wz=rippleArray[i+5]-rippleArray[i+1505];
- nx=(vy*wz)-(vz*wy);
- ny=(vz*wx)-(vx*wz);
- nz=(vx*wy)-(vy*wx);
- rippleArray2.push(rippleArray[i+1500],rippleArray[i+1501],rippleArray[i+1502])
- rippleArray2.push(nx,ny,nz);
- rippleArray2.push(rippleArray[i+1503],rippleArray[i+1504],rippleArray[i+1505])
- rippleArray2.push(nx,ny,nz);
- rippleArray2.push(rippleArray[i+3],rippleArray[i+4],rippleArray[i+5]);
- rippleArray2.push(nx,ny,nz);
- }
- gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(rippleArray2) , gl.STATIC_DRAW );
- console.log(rippleArray2.length)
- pyrammidBuffer=gl.createBuffer();
- gl.bindBuffer(gl.ARRAY_BUFFER,pyrammidBuffer);
- let pyramidArray=[];
- for (let i = -500; i < 500; i+=2) {
- for(let j=-500 ; j<500;j+=2)
- pyramidArray.push(i/100,j/100, 1-Math.abs((i/100)+(j/100))-Math.abs((j/100)-(i/100)) );
- }
- let pyramidArray2=[];
- for(let i=0;i<pyramidArray.length;i+=3){
- vx=pyramidArray[i+3]-pyramidArray[i];
- vy=pyramidArray[i+4]-pyramidArray[i+1];
- vz=pyramidArray[i+5]-pyramidArray[i+2];
- wx=pyramidArray[i+1500]-pyramidArray[i];
- wy=pyramidArray[i+1501]-pyramidArray[i+1];
- wz=pyramidArray[i+1502]-pyramidArray[i+2];
- nx=(vy*wz)-(vz*wy);
- ny=(vz*wx)-(vx*wz);
- nz=(vx*wy)-(vy*wx);
- pyramidArray2.push(pyramidArray[i],pyramidArray[i+1],pyramidArray[i+2]);
- pyramidArray2.push(nx,ny,nz);
- pyramidArray2.push(pyramidArray[i+3],pyramidArray[i+4],pyramidArray[i+5]);
- pyramidArray2.push(nx,ny,nz);
- pyramidArray2.push(pyramidArray[i+1500],pyramidArray[i+1501],pyramidArray[i+1502])
- pyramidArray2.push(nx,ny,nz);
- vx=pyramidArray[i+1503]-pyramidArray[i+1500];
- vy=pyramidArray[i+1504]-pyramidArray[i+1501];
- vz=pyramidArray[i+1505]-pyramidArray[i+1502];
- wx=pyramidArray[i+3]-pyramidArray[i+1503];
- wy=pyramidArray[i+4]-pyramidArray[i+1504];
- wz=pyramidArray[i+5]-pyramidArray[i+1505];
- nx=(vy*wz)-(vz*wy);
- ny=(vz*wx)-(vx*wz);
- nz=(vx*wy)-(vy*wx);
- pyramidArray2.push(pyramidArray[i+1500],pyramidArray[i+1501],pyramidArray[i+1502])
- pyramidArray2.push(nx,ny,nz);
- pyramidArray2.push(pyramidArray[i+3],pyramidArray[i+4],pyramidArray[i+5]);
- pyramidArray2.push(nx,ny,nz);
- pyramidArray2.push(pyramidArray[i+1503],pyramidArray[i+1504],pyramidArray[i+1505])
- pyramidArray2.push(nx,ny,nz);
- }
- console.log(pyramidArray2.length)
- gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(pyramidArray2) , gl.STATIC_DRAW );
- // SUCCESS
- return shaderProgram;
- };
- var drawBufferFace= function ( gl, rotation, move, projection, buffer ) {
- /* Parameters:
- gl - WebGL context
- view, projection - gl matrices 4x4 (column major)
- textureUnit - integer from [0 ... gl.MAX_TEXTURE_IMAGE_UNITS]
- */
- gl.depthFunc(gl.LESS);
- gl.useProgram(shaderProgram);
- gl.uniformMatrix4fv(rotationLocation, false, rotation);
- gl.uniform3fv(moveLocation, move );
- gl.uniformMatrix4fv(projectionLocation, false, projection);
- gl.enableVertexAttribArray(aPositionLocation);
- gl.enableVertexAttribArray(normalLocation);
- gl.bindBuffer(gl.ARRAY_BUFFER, plot);
- gl.vertexAttribPointer(aPositionLocation, 3, gl.FLOAT, false, 6 * Float32Array.BYTES_PER_ELEMENT, 0);
- gl.vertexAttribPointer(normalLocation,3,gl.FLOAT,false,6*Float32Array.BYTES_PER_ELEMENT,3*Float32Array.BYTES_PER_ELEMENT);
- gl.drawArrays(gl.TRIANGLES, 0,8964036/6);
- }
- var cubeFace; // array of cube face direction constants
- var skyboxXYZ; // array of argument mappings for skybox functions
- /** Model-view and projection matrices **/
- const PROJECTION_Z_NEAR = 0.25;
- const PROJECTION_Z_FAR = 300;
- const PROJECTION_ZOOM_Y = 4.0;
- const identityMatrix4= [
- [ 1,0,0,0 ],
- [ 0,1,0,0 ],
- [ 0,0,1,0 ],
- [ 0,0,0,1 ],
- ];
- var rotationMatrix4= identityMatrix4;
- var moveVector=[0,0,10];
- var createProjectionMatrix4= function (gl, zNear, zFar, zoomY ) {
- /* arguments:
- gl - GL context
- zNear, zFar, zoomY - Y-frustum parameters
- returns: 4x4 row-major order perspective matrix
- */
- var xx= zoomY*gl.viewportHeight/gl.viewportWidth;
- var yy= zoomY;
- var zz= (zFar+zNear)/(zFar-zNear);
- var zw= 1;
- var wz= -2*zFar*zNear/(zFar-zNear);
- return [
- [ xx, 0, 0, 0],
- [ 0, yy, 0, 0],
- [ 0, 0, zz, wz],
- [ 0, 0, zw, 0]
- ];
- }
- var glVector3 = function ( x,y,z ){
- return new Float32Array(x,y,z);
- };
- var glMatrix4 = function ( xx, yx, zx, wx,
- xy, yy, zy, wy,
- xz, yz, zz, wz,
- xw, yw, zw, ww )
- {
- // sequence of concatenated columns
- return new Float32Array( [ xx, xy, xz, xw,
- yx, yy, yz, yw,
- zx, zy, zz, zw,
- wx, wy, wz, ww ] );
- };
- var glMatrix4FromMatrix= function( m ) {
- /* arguments:
- m - the 4x4 array with the matrix in row-major order
- returns: sequence of elements in column-major order in Float32Array for GL
- */
- return glMatrix4(
- m[0][0], m[0][1], m[0][2], m[0][3],
- m[1][0], m[1][1], m[1][2], m[1][3],
- m[2][0], m[2][1], m[2][2], m[2][3],
- m[3][0], m[3][1], m[3][2], m[3][3]
- );
- };
- var scalarProduct4 = function( v,w ) {
- return v[0]*w[0]+v[1]*w[1]+v[2]*w[2]+v[3]*w[3];
- };
- var matrix4Column = function( m, c ) {
- return [ m[0][c], m[1][c], m[2][c], m[3][c] ];
- };
- var matrix4Product = function( m1, m2){
- var sp = scalarProduct4;
- var col = matrix4Column;
- return [
- [ sp(m1[0], col(m2, 0)) , sp(m1[0], col(m2, 1)), sp(m1[0], col(m2, 2)), sp(m1[0], col(m2, 3)) ],
- [ sp(m1[1], col(m2, 0)) , sp(m1[1], col(m2, 1)), sp(m1[1], col(m2, 2)), sp(m1[1], col(m2, 3)) ],
- [ sp(m1[2], col(m2, 0)) , sp(m1[2], col(m2, 1)), sp(m1[2], col(m2, 2)), sp(m1[1], col(m2, 3)) ],
- [ sp(m1[3], col(m2, 0)) , sp(m1[3], col(m2, 1)), sp(m1[3], col(m2, 2)), sp(m1[3], col(m2, 3)) ]
- ];
- };
- var matrix4RotatedXZ= function(matrix, alpha ){
- var c = Math.cos( alpha );
- var s = Math.sin( alpha );
- var rot = [ [ c, 0, -s, 0 ],
- [ 0, 1, 0, 0 ],
- [ s, 0, c, 0 ],
- [ 0, 0, 0, 1 ]
- ];
- return matrix4Product( rot, matrix );
- };
- var matrix4RotatedYZ= function(matrix, alpha ){
- var c = Math.cos( alpha );
- var s = Math.sin( alpha );
- var rot = [ [ 1, 0, 0, 0 ],
- [ 0, c, -s, 0 ],
- [ 0, s, c, 0 ],
- [ 0, 0, 0, 1 ]
- ];
- return matrix4Product( rot, matrix );
- };
- /* redraw variables */
- var boxFaceTextures=[];
- var redraw=function(){
- var projectionMatrix=glMatrix4FromMatrix( createProjectionMatrix4(gl,
- PROJECTION_Z_NEAR,
- PROJECTION_Z_FAR,
- PROJECTION_ZOOM_Y )
- );
- var rotationMatrix=glMatrix4FromMatrix( rotationMatrix4 ); //tmp
- gl.enable(gl.DEPTH_TEST);
- gl.clearColor(0, 0, 0, 1.0);
- gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
- drawBufferFace(gl,rotationMatrix,moveVector,projectionMatrix,sinxcosyBuffer);
- // drawBufferFace( gl, rotationMatrix, moveVector, projectionMatrix,
- // xPlusArrayBuffer, boxFaceTextures[0] , 1 )
- }
- onWindowResize = function () {
- var wth = parseInt(window.innerWidth)-10;
- var hth = parseInt(window.innerHeight)-10;
- canvasGL.setAttribute("width", ''+wth);
- canvasGL.setAttribute("height", ''+hth);
- gl.viewportWidth = wth;
- gl.viewportHeight = hth;
- gl.viewport(0,0,wth,hth);
- redraw();
- };
- function onKeyDown(e){
- // var code=e.keyCode? e.keyCode : e.charCode;
- var code= e.which || e.keyCode;
- var alpha= Math.PI/32;
- switch(code)
- {
- case 38: // up
- case 73: // I
- rotationMatrix4=matrix4RotatedYZ(rotationMatrix4, alpha );
- break;
- case 40: // down
- case 75: // K
- rotationMatrix4=matrix4RotatedYZ(rotationMatrix4, -alpha );
- break;
- case 37: // left
- case 74:// J
- rotationMatrix4=matrix4RotatedXZ(rotationMatrix4, -alpha );
- break;
- case 39:// right
- case 76: // L
- rotationMatrix4=matrix4RotatedXZ(rotationMatrix4, alpha );
- break;
- case 70: // F
- moveVector[2]++;
- break;
- case 66: // B
- case 86: // V
- moveVector[2]--;
- break;
- case 32: // space
- rotationMatrix4= identityMatrix4;
- break;
- case 68:
- plot=sinxcosyBuffer
- break;
- case 83:
- plot=rippleBuffer;
- break;
- case 65:
- plot=pyrammidBuffer;
- break;
- }
- redraw();
- }
- window.onload= function(){
- html={};
- html.canvasGL=document.querySelector('#canvasGL');
- html.canvasTex=document.querySelector('#canvasTex');
- gl = canvasGL.getContext("webgl2");
- makeShaderProgram(gl);
- onWindowResize();
- window.onresize= onWindowResize;
- window.onkeydown= onKeyDown;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement