From 0f802beae8189f9eb38ae9dca983a09a56cc160e Mon Sep 17 00:00:00 2001 From: Syndamia Date: Fri, 16 Dec 2022 21:03:32 +0200 Subject: [WGL/H09] Added unfinished work --- .../Homework 09 - The virus/Homework.html | 323 ++++ .../Homework 09 - The virus/shaders.js | 39 + .../Homework 09 - The virus/shaders2.js | 38 + .../Homework 09 - The virus/webgl-fmi.js | 1736 ++++++++++++++++++++ 4 files changed, 2136 insertions(+) create mode 100644 Year 2/Computer Graphics with WebGL/Homework 09 - The virus/Homework.html create mode 100644 Year 2/Computer Graphics with WebGL/Homework 09 - The virus/shaders.js create mode 100644 Year 2/Computer Graphics with WebGL/Homework 09 - The virus/shaders2.js create mode 100644 Year 2/Computer Graphics with WebGL/Homework 09 - The virus/webgl-fmi.js diff --git a/Year 2/Computer Graphics with WebGL/Homework 09 - The virus/Homework.html b/Year 2/Computer Graphics with WebGL/Homework 09 - The virus/Homework.html new file mode 100644 index 0000000..aca4cff --- /dev/null +++ b/Year 2/Computer Graphics with WebGL/Homework 09 - The virus/Homework.html @@ -0,0 +1,323 @@ + + + + + Пластмасови столове + + + + + + + + +

Пластмасови столове

+ + + + + Искаме canvas, но няма! + + diff --git a/Year 2/Computer Graphics with WebGL/Homework 09 - The virus/shaders.js b/Year 2/Computer Graphics with WebGL/Homework 09 - The virus/shaders.js new file mode 100644 index 0000000..d78f08f --- /dev/null +++ b/Year 2/Computer Graphics with WebGL/Homework 09 - The virus/shaders.js @@ -0,0 +1,39 @@ + +var vShader = + 'uniform mat4 uProjectionMatrix;'+ + 'uniform mat4 uViewMatrix;'+ + 'uniform mat4 uModelMatrix;'+ + 'uniform mat4 uNormalMatrix;'+ + 'uniform bool uUseNormalMatrix;'+ + ''+ + 'uniform vec3 uAmbientColor;'+ + 'uniform vec3 uDiffuseColor;'+ + ''+ + 'uniform vec3 uLightDir;'+ + ''+ + 'attribute vec3 aXYZ;'+ + 'attribute vec3 aColor;'+ + 'attribute vec3 aNormal;'+ + ''+ + 'varying vec3 vColor;'+ + ''+ + 'void main ()'+ + '{'+ + ' mat4 mvMatrix = uViewMatrix * uModelMatrix;'+ + ' gl_Position = uProjectionMatrix * mvMatrix * vec4(aXYZ,1);'+ + ' mat4 nMatrix = uUseNormalMatrix?uNormalMatrix:mvMatrix;'+ + ''+ + ' vColor = uAmbientColor*aColor;'+ + ''+ + ' vec3 light = normalize(-uLightDir);'+ + ' vec3 normal = vec3(normalize(nMatrix*vec4(aNormal,0)));'+ + ' vColor += aColor*uDiffuseColor*max(dot(normal,light),0.0);'+ + '}'; + +var fShader = + 'precision mediump float;'+ + 'varying vec3 vColor;'+ + 'void main( )'+ + '{'+ + ' gl_FragColor = vec4(vColor,1);'+ + '}'; diff --git a/Year 2/Computer Graphics with WebGL/Homework 09 - The virus/shaders2.js b/Year 2/Computer Graphics with WebGL/Homework 09 - The virus/shaders2.js new file mode 100644 index 0000000..64e873a --- /dev/null +++ b/Year 2/Computer Graphics with WebGL/Homework 09 - The virus/shaders2.js @@ -0,0 +1,38 @@ +var vShader = + 'uniform mat4 uProjectionMatrix;' + + 'uniform mat4 uViewMatrix;' + + 'uniform mat4 uModelMatrix;' + + 'uniform mat4 uNormalMatrix;' + + 'uniform bool uUseNormalMatrix;' + + '' + + 'uniform vec3 uAmbientColor;' + + 'uniform vec3 uDiffuseColor;' + + '' + + 'uniform vec3 uLightDir;' + + '' + + 'attribute vec3 aXYZ;' + + 'attribute vec3 aColor;' + + 'attribute vec3 aNormal;' + + '' + + 'varying vec3 vColor;' + + '' + + 'void main ()' + + '{' + + ' mat4 mvMatrix = uViewMatrix * uModelMatrix;' + + ' gl_Position = uProjectionMatrix * mvMatrix * vec4(aXYZ,1);' + + ' mat4 nMatrix = uUseNormalMatrix?uNormalMatrix:mvMatrix;' + + '' + + ' vColor = uAmbientColor*aColor;' + + '' + + ' vec3 light = normalize(-uLightDir);' + + ' vec3 normal = vec3(normalize(nMatrix*vec4(aNormal,0)));' + + ' vColor += aColor*uDiffuseColor*abs(dot(normal,light));' + + '}'; + +var fShader = + 'precision mediump float;' + + 'varying vec3 vColor;' + + 'void main( )' + + '{' + + ' gl_FragColor = vec4(vColor,1);' + + '}'; diff --git a/Year 2/Computer Graphics with WebGL/Homework 09 - The virus/webgl-fmi.js b/Year 2/Computer Graphics with WebGL/Homework 09 - The virus/webgl-fmi.js new file mode 100644 index 0000000..94e2d69 --- /dev/null +++ b/Year 2/Computer Graphics with WebGL/Homework 09 - The virus/webgl-fmi.js @@ -0,0 +1,1736 @@ +// Библиотека WebGL-FMI v0.17.03 +// +// Работа с контексти и шейдъри +// getContext(id) +// getShader(id,type) +// getProgram(idv,idf) +// getVariables() +// +// Математически функции и константи +// random(a,b) +// radians(degrees) +// sin(a) +// cos(a) +// PI +// custom(obj,props) +// +// Работа с вектори и матрици +// unitVector(x) +// vectorProduct(x,y) +// scalarProduct(x,y) +// vectorPoints(x,y) +// multiplyMatrix(a,b) +// calculateNormalMatrix(a) +// +// Трансформации с матрици +// unitMatrix(); +// translateMatrix(v) +// scaleMatrix(v) +// xRotateMatrix(a) +// yRotateMatrix(a) +// zRotateMatrix(a) +// rotateMatrix(a,v) +// +// Трансформации със съставни матрици +// identity() +// translate(v) +// scale(v) +// xRotate(a) +// yRotate(a) +// zRotate(a) +// useMatrix() +// pushMatrix() +// popMatrix() +// cloneMatrix() +// +// Проектиране с матрици +// viewMatrix (eye, focus, up) +// orthoMatrix(width, height, near, far) +// perspMatrix(angle, aspect, near, far) +// lookAt(eye, focus, up) +// perspective(angle, aspect, near, far) +// +// Графични обекти (класове) +// Cube(center,size) +// Cuboid(center,size) +// Pyramid(center,size,height,n) +// Cone(center,size,height) +// Prism(center,size,height,n) +// Cylinder(center,size,height) +// Sphere(center,size) +// Spheroid(center,size) +// Icosahedron(center,size) +// GeodesicSphere(center,size) +// RotationalSolid(center,size,f) +// Torus(center,size,R,r) +// +// Константи +// CONE_SIDES = 32; +// CYLINDER_SIDES = 32; +// SPHERE_SIDES = 32; +// GEODESIC_SIDES = 3; +// TORUS_MAJOR_SIDES = 50; +// TORUS_MINOR_SIDES = 25; + + + +var gl; // глобален WebGL контекст +var glprog; // глобална GLSL програма +var glmat; // глобална матрица на модела +var glmatnew; // true, ако матрицата е променена, но не е подадена на шейдъра +var glvmat; // глобална матрица на гледната точка +var glstack = []; // стек от матрици на модела + + +// брой байтове в един WebGL FLOAT (трябва да са 4 байта) +var FLOATS = Float32Array.BYTES_PER_ELEMENT; + + +// връща WebGL контекст, свързан с HTML елемент с даден id +function getContext(id) +{ + var canvas = document.getElementById(id); + if (!canvas) + { + alert("Искаме canvas с id=\""+id+"\", а няма!"); + return null; + } + + var context = canvas.getContext("webgl"); + if (!context) + { + context = canvas.getContext("experimental-webgl"); + } + + if (!context) + { + alert("Искаме WebGL контекст, а няма!"); + } + + return context; +} + + +// връща компилиран шейдър +function getShader(id,type) +{ + var elem = document.getElementById(id); + var source = elem?elem.text:id; + var shader = gl.createShader(type); + + gl.shaderSource(shader,source); + gl.compileShader(shader); + if (!gl.getShaderParameter(shader,gl.COMPILE_STATUS)) + { + alert(gl.getShaderInfoLog(shader)); + return null; + } + + return shader; +} + + +// връща готова програма +function getProgram(idv,idf) +{ + var vShader = getShader(idv,gl.VERTEX_SHADER); + var fShader = getShader(idf,gl.FRAGMENT_SHADER); + + if (!vShader || !fShader) {return null;} + + var shaderProgram = gl.createProgram(); + gl.attachShader(shaderProgram,vShader); + gl.attachShader(shaderProgram,fShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram,gl.LINK_STATUS)) + { + alert(gl.getProgramInfoLog(shaderProgram)); + return null; + } + + gl.useProgram(shaderProgram); + return shaderProgram; +} + + +// намира адресите на всички глобални и атрибутни променливи +function getVariables() +{ + for (var i=0; i