Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- window.mat4 = glMatrix.mat4
- window.mat2 = glMatrix.mat2
- window.mat2d= glMatrix.mat2d
- window.mat3= glMatrix.mat3
- window.mat4= glMatrix.mat4
- window.quat= glMatrix.quat
- window.quat2= glMatrix.quat2
- window.vec2= glMatrix.vec2
- window.vec3= glMatrix.vec3
- window.vec4= glMatrix.vec4
- window.toRadian = glMatrix.toRadian;
- //https://www.youtube.com/watch?v=fNK1E5DdYxk&list=PLjcVFFANLS5zH_PeKC6I8p0Pt1hzph_rt&index=9
- /**var model = function(gl, verticies, indicies){ //, normals, color){
- var me = {};
- me.vertexBuffer = gl.createBuffer();
- me.indexBuffer = gl.createBuffer();
- //this.normalBuffer = gl.createBuffer();
- me.indexcount = indicies.length;
- me.world = mat4.create();
- //this.color = color;
- gl.bindBuffer(gl.ARRAY_BUFFER, me.vertexBuffer);
- gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(verticies), gl.STATIC_DRAW);
- //gl.bindBuffer(gl.ARRAY_BUFFER, this.normalBuffer);
- //gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(normals), gl.STATIC_DRAW);
- gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, me.indexBuffer);
- gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(indicies), gl.STATIC_DRAW);
- console.log(me);
- gl.bindBuffer(gl.ARRAY_BUFFER, null);
- gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null);
- return me;
- };**/
- const generateCube = function(position, scale, textures){
- var me = {};
- me.position = position;
- me.scale = scale;
- me.textureMap = textures;
- me.verts = [
- // X Y Z U V
- // Top
- -1.0, 1.0, -1.0, 0, 0,
- -1.0, 1.0, 1.0, 0, 1,
- 1.0, 1.0, 1.0, 1, 1,
- 1.0, 1.0, -1.0, 1, 0,
- // Left
- -1.0, 1.0, 1.0, 0, 0,
- -1.0, -1.0, 1.0, 1, 0,
- -1.0, -1.0, -1.0, 1, 1,
- -1.0, 1.0, -1.0, 0, 1,
- // Right
- 1.0, 1.0, 1.0, 1, 1,
- 1.0, -1.0, 1.0, 0, 1,
- 1.0, -1.0, -1.0, 0, 0,
- 1.0, 1.0, -1.0, 1, 0,
- // Front
- 1.0, 1.0, 1.0, 1, 1,
- 1.0, -1.0, 1.0, 1, 0,
- -1.0, -1.0, 1.0, 0, 0,
- -1.0, 1.0, 1.0, 0, 1,
- // Back
- 1.0, 1.0, -1.0, 0, 0,
- 1.0, -1.0, -1.0, 0, 1,
- -1.0, -1.0, -1.0, 1, 1,
- -1.0, 1.0, -1.0, 1, 0,
- // Bottom
- -1.0, -1.0, -1.0, 1, 1,
- -1.0, -1.0, 1.0, 1, 0,
- 1.0, -1.0, 1.0, 0, 0,
- 1.0, -1.0, -1.0, 0, 1,
- ];
- me.indicies = [
- // Top
- 0, 1, 2,
- 0, 2, 3,
- // Left
- 5, 4, 6,
- 6, 4, 7,
- // Right
- 8, 9, 10,
- 8, 10, 11,
- // Front
- 13, 12, 14,
- 15, 14, 12,
- // Back
- 16, 17, 18,
- 16, 18, 19,
- // Bottom
- 21, 20, 22,
- 22, 20, 23
- ];
- me.vertexBuffer = gl.createBuffer();
- me.indexBuffer = gl.createBuffer();
- //this.normalBuffer = gl.createBuffer();
- me.indexcount = me.indicies.length;
- me.world = mat4.create();
- //this.color = color;
- gl.bindBuffer(gl.ARRAY_BUFFER, me.vertexBuffer);
- gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(me.verts), gl.STATIC_DRAW);
- //gl.bindBuffer(gl.ARRAY_BUFFER, this.normalBuffer);
- //gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(normals), gl.STATIC_DRAW);
- gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, me.indexBuffer);
- gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(me.indicies), gl.STATIC_DRAW);
- gl.bindBuffer(gl.ARRAY_BUFFER, null);
- gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null);
- return me;
- }
- generateCube.prototype.computeModelMatrix = function(now){
- }
- var vertexShaderText = [
- 'precision mediump float;',
- '',
- 'attribute vec3 vertPosition;',
- 'attribute vec2 vertTexCoord;',
- 'varying vec2 fragTexCoord;',
- 'uniform mat4 mWorld;',
- 'uniform mat4 mView;',
- 'uniform mat4 mProj;',
- '',
- 'void main(){',
- ' fragTexCoord = vertTexCoord;',
- ' gl_Position = mProj * mView * mWorld * vec4(vertPosition, 1.0);',
- '}'
- ].join("\n");
- var fragmentShaderText = [
- 'precision mediump float;',
- 'varying vec2 fragTexCoord;',
- 'uniform sampler2D sampler;',
- '',
- 'void main(){',
- ' gl_FragColor = texture2D(sampler, fragTexCoord);',
- //' gl_FragColor = vec4(1.0, 0.0, 1.0, 1.0);',
- '}'
- ].join("\n");
- var gl;
- var mousePos = { x: 0, y: 0};
- function updateAndOpenModal(gallery, painting){
- return function(){
- previewModalTitle.innerText = painting.title;
- //console.log(painting);
- //var context = previewModalModel.getContext('2d');
- gl = previewModalModel.getContext('webgl') || previewModalModel.getContext('experimental-webgl');
- if(!gl || !(gl instanceof WebGLRenderingContext)){
- gl = previewModalModel.getContext('2d');
- gl.fillStyle = "#ffffff";
- gl.font = "30px serif";
- gl.textAlign = "center";
- gl.fillText("Your browser doesn't support webgl.", previewModalModel.width / 2, previewModalModel.height / 2);
- }else{
- gl.clearColor(0.125, 0.125, 0.125, 1.0);
- gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
- gl.enable(gl.DEPTH_TEST);
- gl.enable(gl.CULL_FACE);
- //gl.frontFace(gl.COW);
- //gl.cullFace(gl.BACK);
- //
- // Create Shaders
- //
- var vertexShader = gl.createShader(gl.VERTEX_SHADER);
- var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
- gl.shaderSource(vertexShader, vertexShaderText);
- gl.shaderSource(fragmentShader, fragmentShaderText);
- gl.compileShader(vertexShader);
- if(!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)){
- console.error('WebGL: Error compiling vertex shader!', gl.getShaderInfoLog(vertexShader));
- return;
- }
- gl.compileShader(fragmentShader);
- if(!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)){
- console.error('WebGL: Error compiling fragment shader!', gl.getShaderInfoLog(fragmentShader));
- return;
- }
- //Program
- var program = gl.createProgram();
- gl.attachShader(program, vertexShader);
- gl.attachShader(program, fragmentShader);
- gl.linkProgram(program);
- if(!gl.getProgramParameter(program, gl.LINK_STATUS)){
- console.error('WebGL: Error linking program!', gl.getProgramInfoLog(program));
- return;
- }
- //comment out when release
- gl.validateProgram(program);
- if(!gl.getProgramParameter(program, gl.VALIDATE_STATUS)){
- console.error('WebGL: Error validating program!', gl.getProgramInfoLog(program));
- return;
- }
- //**/
- //
- // Create Scene
- //
- var models = [];
- //models.push(generateCube([0, 0, 0], [2, 1, 2], [0,0])); //location, size, textures
- models.push(generateCube([0, 1, 0], [2, 1, 2], [0,1, 6,2, 8,1]));
- //models.push(generateCube([1, 0, 0], [2, 1, 2], [0,0]));
- //models.push(generateCube([1, 0, 0], [2, 1, 2], [0,0]));
- var positionAttribLocation = gl.getAttribLocation(program, 'vertPosition');
- var texCoordAttribLocation = gl.getAttribLocation(program, 'vertTexCoord');
- //
- // Create Textures
- //
- loadTexture(0, "images/youpaint/mojang/smooth_stone.png");
- loadTexture(1, "images/youpaint/mojang/back.png");
- loadTexture(2, "images/youpaint/"
- + (gallery.id != null ? gallery.id + "_" : "") + painting.id
- + ".png");
- gl.useProgram(program);
- var matWorldUniformLocation = gl.getUniformLocation(program, 'mWorld');
- var matViewUniformLocation = gl.getUniformLocation(program, 'mView');
- var matProjUniformLocation = gl.getUniformLocation(program, 'mProj');
- var worldMatrix = new Float32Array(16);
- var viewMatrix = new Float32Array(16);
- var projMatrix = new Float32Array(16);
- mat4.identity(worldMatrix);
- mat4.identity(viewMatrix);
- mat4.lookAt(viewMatrix, [0, 0, -5], [0, 0, 0], [0, 1, 0]);
- mat4.perspective(projMatrix, glMatrix.glMatrix.toRadian(45), previewModalModel.width / previewModalModel.height, 0.1, 1000.0);
- gl.uniformMatrix4fv(matWorldUniformLocation, gl.FALSE, worldMatrix);
- gl.uniformMatrix4fv(matViewUniformLocation, gl.FALSE, viewMatrix);
- gl.uniformMatrix4fv(matProjUniformLocation, gl.FALSE, projMatrix);
- //
- // Main render loop
- //
- var xRotationMatrix = new Float32Array(16);
- var yRotationMatrix = new Float32Array(16);
- var identityMatrix = new Float32Array(16);
- mat4.identity(identityMatrix);
- var angle = 0;
- var angle2 = 0;
- var modelPositionMatrix = new Float32Array(16);
- mat4.identity(modelPositionMatrix);
- var loop = function() {
- gl.useProgram(program);
- angle = (mousePos.x - 0) / 2 * 2 * Math.PI;
- angle2 = (mousePos.y - 0) / 4 * 2 * Math.PI;
- //angle = performance.now() / 1000 / 6 * 2 * Math.PI;
- mat4.rotate(xRotationMatrix, identityMatrix, angle, [0, 1, 0]);//output, original, angle, rotate axis
- mat4.rotate(yRotationMatrix, identityMatrix, angle2, [1, 0, 0]);//output, original, angle, rotate axis
- mat4.mul(worldMatrix, yRotationMatrix, xRotationMatrix);
- gl.uniformMatrix4fv(matWorldUniformLocation, gl.FALSE, worldMatrix);
- gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
- //gl.drawArrays(gl.TRIANGLES, 0, 3); //Tris, skip, length
- for(var i = 0; i < models.length; i++){
- //for(var ii = 0; ii<8; ii++)
- // gl.disableVertexAttribArray(ii);
- //gl.uniformMatrix4fv(matWorldUniformLocation, gl.FALSE, models[i].world);
- // gl.uniformMatrix4fv(matWorldUniformLocation, gl.FALSE, worldMatrix);
- mat4.scale(modelPositionMatrix, modelPositionMatrix, models[i].scale);
- mat4.translate(modelPositionMatrix, modelPositionMatrix, models[i].position);
- // gl.uniformMatrix4fv(matWorldUniformLocation, gl.FALSE, worldMatrix);
- //console.log(worldMatrix);
- // mat4.translate(worldMatrix, worldMatrix, [0,1,0,1]);
- //console.log(worldMatrix);
- //gl.uniform4fv();
- gl.bindBuffer(gl.ARRAY_BUFFER, models[i].vertexBuffer);
- gl.vertexAttribPointer(
- positionAttribLocation, //Attriute Location
- 3, // # of elements per attribute
- gl.FLOAT, // Type of elements
- gl.FALSE, // Is normalized
- 5 * Float32Array.BYTES_PER_ELEMENT, // Size of individual vertex
- 0 // Offset from beginning of single vertex to this attribute
- );
- gl.vertexAttribPointer(
- texCoordAttribLocation, //Attriute Location
- 2, // # of elements per attribute
- gl.FLOAT, // Type of elements
- gl.FALSE, // Is normalized
- 5 * Float32Array.BYTES_PER_ELEMENT, // Size of individual vertex
- 3 * Float32Array.BYTES_PER_ELEMENT // Offset from beginning of single vertex to this attribute
- );
- gl.enableVertexAttribArray(positionAttribLocation);
- gl.enableVertexAttribArray(texCoordAttribLocation);
- gl.bindBuffer(gl.ARRAY_BUFFER, null);
- gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, models[i].indexBuffer);
- for(var ti = 0; ti < models[i].textureMap.length; ti+=2){
- gl.activeTexture(gl.TEXTURE0 + models[i].textureMap[ti + 1]);
- if(ti == models[i].textureMap.length - 2){
- gl.drawElements(gl.TRIANGLES, models[i].indexcount - (models[i].textureMap[ti] * 3), gl.UNSIGNED_SHORT, 0);
- //console.log("index", ti,
- // models[i].indexcount - (models[i].textureMap[ti] * 3),
- // models[i].textureMap[ti + 1] );
- } else {
- gl.drawElements(gl.TRIANGLES, (models[i].textureMap[ti + 2] - models[i].textureMap[ti]) * 3, gl.UNSIGNED_SHORT, 0);
- //console.log("index", ti,
- // (models[i].textureMap[ti + 2] - models[i].textureMap[ti]) * 3,
- // models[i].textureMap[ti + 1] );
- }
- }
- //gl.activeTexture(gl.TEXTURE0);
- //gl.drawElements(gl.TRIANGLES, models[i].indexcount, gl.UNSIGNED_SHORT, 0);
- gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null);
- }
- requestAnimationFrame(loop);
- };
- requestAnimationFrame(loop);
- }
- $('#previewModal').modal('show');
- }
- };
- window.addEventListener('load', function() {
- previewModalModel.addEventListener('mousemove', ev => {
- var rect = previewModalModel.getBoundingClientRect();
- mousePos.x = (ev.clientX - rect.left) / previewModalModel.width * 2 - 1;
- mousePos.y = (ev.clientY - rect.top) / previewModalModel.height * -2 + 1;
- });
- previewModalModel.addEventListener('mouseout', ev => {
- mousePos.x = 0;
- mousePos.y = 0;
- });
- });
- function loadTexture(index, url){
- gl.activeTexture(gl.TEXTURE0 + index);
- var texture = gl.createTexture();
- gl.bindTexture(gl.TEXTURE_2D, texture);
- gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT);
- gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT);
- gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
- gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
- gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, new Uint8Array([0, 0, 0, 255]));
- const image = new Image();
- image.onload = () => {
- gl.activeTexture(gl.TEXTURE0 + index);
- gl.bindTexture(gl.TEXTURE_2D, texture);
- gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);
- //gl.bindTexture(gl.TEXTURE_2D, null);
- //console.log("image triggered");
- }
- image.src = url;
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement