commit 06d9bd36d1663f9686490c530d7a8417fd033c5e Author: bill Date: Thu Feb 18 03:02:48 2021 +0800 initial commit diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/.DS_Store differ diff --git a/8081_earthmap10k.jpg b/8081_earthmap10k.jpg new file mode 100644 index 0000000..812458c Binary files /dev/null and b/8081_earthmap10k.jpg differ diff --git a/earthmap1k.jpg b/earthmap1k.jpg new file mode 100644 index 0000000..7dcab8a Binary files /dev/null and b/earthmap1k.jpg differ diff --git a/index.html b/index.html new file mode 100644 index 0000000..8fe0e25 --- /dev/null +++ b/index.html @@ -0,0 +1,321 @@ + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib1.js b/lib1.js new file mode 100644 index 0000000..33a7345 --- /dev/null +++ b/lib1.js @@ -0,0 +1,175 @@ + +////////////////////////////////////////////////////////////////////////////////////////// +// +// THIS IS THE SUPPORT LIBRARY. YOU PROBABLY DON'T WANT TO CHANGE ANYTHING HERE JUST YET. +// +////////////////////////////////////////////////////////////////////////////////////////// + +let fragmentShaderHeader = ['' // WHATEVER CODE WE WANT TO PREDEFINE FOR FRAGMENT SHADERS + , 'precision highp float;' + , 'float noise(vec3 point) { float r = 0.; for (int i=0;i<16;i++) {' + , ' vec3 D, p = point + mod(vec3(i,i/4,i/8) , vec3(4.0,2.0,2.0)) +' + , ' 1.7*sin(vec3(i,5*i,8*i)), C=floor(p), P=p-C-.5, A=abs(P);' + , ' C += mod(C.x+C.y+C.z,2.) * step(max(A.yzx,A.zxy),A) * sign(P);' + , ' D=34.*sin(987.*float(i)+876.*C+76.*C.yzx+765.*C.zxy);P=p-C-.5;' + , ' r+=sin(6.3*dot(P,fract(D)-.5))*pow(max(0.,1.-2.*dot(P,P)),4.);' + , '} return .5 * sin(r); }' +].join('\n'); + +let nfsh = fragmentShaderHeader.split('\n').length; // NUMBER OF LINES OF CODE IN fragmentShaderHeader + +let isFirefox = navigator.userAgent.indexOf('Firefox') > 0; // IS THIS THE FIREFOX BROWSER? +let errorMsg = ''; +// +// Initialize a texture and load an image. +// When the image finished loading copy it into the texture. +// +function loadTexture(gl, url) { + const texture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, texture); + + // Because images have to be downloaded over the internet + // they might take a moment until they are ready. + // Until then put a single pixel in the texture so we can + // use it immediately. When the image has finished downloading + // we'll update the texture with the contents of the image. + const level = 0; + const internalFormat = gl.RGBA; + const width = 1; + const height = 1; + const border = 0; + const srcFormat = gl.RGBA; + const srcType = gl.UNSIGNED_BYTE; + const pixel = new Uint8Array([0, 0, 255, 255]); // opaque blue + gl.texImage2D(gl.TEXTURE_2D, level, internalFormat, + width, height, border, srcFormat, srcType, + pixel); + + const image = new Image(); + image.onload = function () { + gl.bindTexture(gl.TEXTURE_2D, texture); + gl.texImage2D(gl.TEXTURE_2D, level, internalFormat, + srcFormat, srcType, image); + + // WebGL1 has different requirements for power of 2 images + // vs non power of 2 images so check if the image is a + // power of 2 in both dimensions. + if (isPowerOf2(image.width) && isPowerOf2(image.height)) { + // Yes, it's a power of 2. Generate mips. + gl.generateMipmap(gl.TEXTURE_2D); + } else { + // No, it's not a power of 2. Turn off mips and set + // wrapping to clamp to edge + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + } + }; + image.src = url; + + return texture; +} + +function isPowerOf2(value) { + return (value & (value - 1)) == 0; +} +function gl_start(canvas, vertexShader, fragmentShader) { // START WEBGL RUNNING IN A CANVAS + + setTimeout(function () { + try { + canvas.gl = canvas.getContext('experimental-webgl'); // Make sure WebGl is supported. IT WOULD BE GREAT TO USE WEBGL2 INSTEAD. + } catch (e) { throw 'Sorry, your browser does not support WebGL.'; } + + canvas.setShaders = function (vertexShader, fragmentShader) { // Add the vertex and fragment shaders: + + let gl = this.gl, program = gl.createProgram(); // Create the WebGL program. + + function addshader(type, src) { // Create and attach a WebGL shader. + function spacer(color, width, height) { + return '
 
'; + } + errorMessage.innerHTML = '
'; + // errorMarker.innerHTML = spacer('white', 1, 1) + '\u25B6'; + let shader = gl.createShader(type); + gl.shaderSource(shader, src); + gl.compileShader(shader); + if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) { + let msg = gl.getShaderInfoLog(shader); + console.log('Cannot compile shader:\n\n' + msg); + + let a = msg.substring(6, msg.length); + let line = 0; + if (a.substring(0, 3) == ' 0:') { + a = a.substring(3, a.length); + line = parseInt(a) - nfsh; + + editor.session.setAnnotations([{ + row: line, + column: 0, + text: msg, + type: "error" + }]); + } + let j = a.indexOf(':'); + a = 'line ' + (line+1) + a.substring(j, a.length); + if ((j = a.indexOf('\n')) > 0) + a = a.substring(0, j); + errorMessage.innerHTML = a; + } + else + editor.session.clearAnnotations(); + gl.attachShader(program, shader); + }; + + addshader(gl.VERTEX_SHADER, vertexShader); // Add the vertex and fragment shaders. + addshader(gl.FRAGMENT_SHADER, fragmentShaderHeader + fragmentShader); + + gl.linkProgram(program); // Link the program, report any errors. + if (!gl.getProgramParameter(program, gl.LINK_STATUS)) + console.log('Could not link the shader program!'); + gl.useProgram(program); + gl.program = program; + + let texture = loadTexture(gl, './earthmap1k.jpg') //Texture loading. + // Tell WebGL we want to affect texture unit 0 + gl.activeTexture(gl.TEXTURE0); + // Bind the texture to texture unit 0 + gl.bindTexture(gl.TEXTURE_2D, texture); + // Tell the shader we bound the texture to texture unit 0 + gl.uniform1i(gl.getUniformLocation(program, 'uSampler'), 0); + + + gl.bindBuffer(gl.ARRAY_BUFFER, gl.createBuffer()); // Create a square as a triangle strip + gl.bufferData(gl.ARRAY_BUFFER, new Float32Array( // consisting of two triangles. + [-1, 1, 0, 1, 1, 0, -1, -1, 0, 1, -1, 0]), gl.STATIC_DRAW); + + let aPos = gl.getAttribLocation(program, 'aPos'); // Set aPos attribute for each vertex. + gl.enableVertexAttribArray(aPos); + gl.vertexAttribPointer(aPos, 3, gl.FLOAT, false, 0, 0); + } + + canvas.setShaders(vertexShader, fragmentShader); // Initialize everything, + + setInterval(function () { // Start the animation loop. + gl = canvas.gl; + if (gl.startTime === undefined) // First time through, + gl.startTime = Date.now(); // record the start time. + animate(gl); + gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4); // Render the square. + }, 30); + + }, 100); // Wait 100 milliseconds after page has loaded before starting WebGL. +} + +// THE animate() CALLBACK FUNCTION CAN BE REDEFINED IN index.html. + +function animate() { } + +let gl; +function setUniform(type, name, a, b, c, d, e, f) { + let loc = gl.getUniformLocation(gl.program, name); + (gl['uniform' + type])(loc, a, b, c, d, e, f); +} +