From 63ecdebe2c3d7ce95448fa18cfd89978f3468242 Mon Sep 17 00:00:00 2001 From: hernowoaris <hernowoarisutanto@gmail.com> Date: Thu, 9 Mar 2023 17:22:01 +0700 Subject: [PATCH] add polygon, triangle, rectangle, and select button --- worksheet1.html | 7 +- worksheet1.js | 174 ++++++++++++++++++++++++++++++++++-------------- 2 files changed, 127 insertions(+), 54 deletions(-) diff --git a/worksheet1.html b/worksheet1.html index 6066839..69e9991 100644 --- a/worksheet1.html +++ b/worksheet1.html @@ -39,9 +39,10 @@ </div> <div class="box container-shape"> <div class="container-button-shape"> - <button id ="line">Line</button> - <button id ="triangle">Triangle</button> - <button id ="rectangle">Rectangle</button> + <button class="button-shape" id ="polygon" type="button">Polygon</button> + <button class="button-shape" id ="line" type="button">Line</button> + <button class="button-shape" id ="triangle" type="button">Triangle</button> + <button class="button-shape" id ="rectangle" type="button">Rectangle</button> </div> <button id ="end-polygon">End Polygon</button> </div> diff --git a/worksheet1.js b/worksheet1.js index 8e424bb..3199719 100644 --- a/worksheet1.js +++ b/worksheet1.js @@ -6,25 +6,17 @@ var gl; var maxNumPositions = 200; var index = 0; var cindex = 0; -var t, tt; +var t = []; //vertices +var tt; //vec4 color var numPolygons = 0; var numPositions = []; numPositions[0] = 0; var start = [0]; - +var first = true; var ObjShape = ""; var drawArraysConfig = {}; - -var colors = [ - vec4(0.0, 0.0, 0.0, 1.0), // black - vec4(1.0, 0.0, 0.0, 1.0), // red - vec4(1.0, 1.0, 0.0, 1.0), // yellow - vec4(0.0, 1.0, 0.0, 1.0), // green - vec4(0.0, 0.0, 1.0, 1.0), // blue - vec4(1.0, 0.0, 1.0, 1.0), // magenta - vec4(0.0, 1.0, 1.0, 1.0) // cyan -]; - +var SHAPES = []; // list dari gambar yang dibuat +var speed = 100; init(); @@ -58,12 +50,6 @@ function init() { gl.vertexAttribPointer(colorLoc, 4, gl.FLOAT, false, 0, 0); gl.enableVertexAttribArray(colorLoc); - // var m = document.getElementById("gl-canvas"); - - // m.addEventListener("click", function() { - // cindex = m.selectedIndex; - // }); - const red = document.getElementById("red"); const green = document.getElementById("green"); const blue = document.getElementById("blue"); @@ -75,50 +61,136 @@ function init() { updateColor(); - - var buttonShape = document.getElementsByClassName("container-button-shape"); - console.log(buttonShape); - for (var i=0; i<buttonShape.length; i++) { - let button = buttonShape[i] - button.addEventListener("click", function() { - removeClass(button); - ObjShape = button.value - button.classList.add("selected") - }) - } + document.getElementById('polygon').addEventListener('click', function() { + ObjShape = 'polygon'; + console.log("jadi polygon") + }); + document.getElementById('rectangle').addEventListener('click', function() { + ObjShape = 'rectangle'; + }); + document.getElementById('triangle').addEventListener('click', function() { + ObjShape = 'triangle'; + }); + var a = document.getElementById("end-polygon") a.addEventListener("click", function(){ - numPolygons++; - numPositions[numPolygons] = 0; - start[numPolygons] = index; - render(); + if(ObjShape == "polygon"){ + numPolygons++; + numPositions[numPolygons] = 0; + start[numPolygons] = index; + drawArraysConfig = { + "nama": ObjShape, + "mode": gl.TRIANGLE_FAN, + "index": index - numPositions[numPolygons-1], + "step": numPositions[numPolygons - 1] + } + // reset vertices & menambahkan ke gambar yang dibuat + SHAPES.push(drawArraysConfig) + t = [] + render() + } }); + - canvas.addEventListener("mousedown", function(event){ - t = getCanvasCoordinate(event, canvas) - gl.bindBuffer( gl.ARRAY_BUFFER, bufferId ); - gl.bufferSubData(gl.ARRAY_BUFFER, 8*index, flatten(t)); - - tt = vec4(red.value/255.0 ,green.value/255.0 , blue.value/255.0 , 1.0); - console.log(tt) - gl.bindBuffer( gl.ARRAY_BUFFER, cBufferId ); - gl.bufferSubData(gl.ARRAY_BUFFER, 16*index, flatten(tt)); - numPositions[numPolygons]++; - index++; + canvas.addEventListener("mousedown", function(event){ + if(ObjShape == "polygon"){ + t = getCanvasCoordinate(event, canvas); + gl.bindBuffer(gl.ARRAY_BUFFER, bufferId); + gl.bufferSubData(gl.ARRAY_BUFFER, 8*index, flatten(t)) + + tt = vec4(red.value/255.0 ,green.value/255.0 , blue.value/255.0 , 1.0); + + gl.bindBuffer(gl.ARRAY_BUFFER, cBufferId); + gl.bufferSubData(gl.ARRAY_BUFFER, 16*index, flatten(tt)) + + numPositions[numPolygons]++ + index++ + } + else if(ObjShape == "rectangle"){ + drawArraysConfig = { + "nama": ObjShape, + "mode": gl.TRIANGLE_FAN, + "index": index, + "step": 4 + } + if(first) { + first = false; + gl.bindBuffer( gl.ARRAY_BUFFER, bufferId) + t[0] = getCanvasCoordinate(event, canvas); + } + + else { + first = true; + t[2] = getCanvasCoordinate(event, canvas); + t[1] = vec2(t[0][0], t[2][1]); + t[3] = vec2(t[2][0], t[0][1]); + for(var i=0; i<4; i++) gl.bufferSubData(gl.ARRAY_BUFFER, 8*(index+i), flatten(t[i])); + index += 4; + + gl.bindBuffer( gl.ARRAY_BUFFER, cBufferId); + var tt = vec4(red.value/255.0 ,green.value/255.0 , blue.value/255.0 , 1.0); + for(var i=0; i<4; i++) gl.bufferSubData(gl.ARRAY_BUFFER, 16*(index-4+i), flatten(tt)); + + // reset vertices & menambahkan ke gambar yang dibuat + t = []; + SHAPES.push(drawArraysConfig); + } + } + else if(ObjShape == "triangle") { + drawArraysConfig = { + "nama": ObjShape, + "mode": gl.TRIANGLE_FAN, + "index": index, + "step": 3 + } + gl.bindBuffer( gl.ARRAY_BUFFER, bufferId); + if(first) { + first = false; + t[0] = getCanvasCoordinate(event, canvas) + } + + else { + if(t.length == 1) { + t[1] = getCanvasCoordinate(event, canvas) + } + else { + first = true; + t[2] = getCanvasCoordinate(event, canvas) + + for(var i=0; i<3; i++) gl.bufferSubData(gl.ARRAY_BUFFER, 8*(index+i), flatten(t[i])); + index += 3; + + gl.bindBuffer( gl.ARRAY_BUFFER, cBufferId); + var tt = vec4(red.value/255.0 ,green.value/255.0 , blue.value/255.0 , 1.0); + for(var i=0; i<3; i++) gl.bufferSubData(gl.ARRAY_BUFFER, 16*(index-3+i), flatten(tt)) + + // reset vertices & menambahkan ke gambar yang dibuat + t = []; + SHAPES.push(drawArraysConfig); + } + } + } }); - - + if(ObjShape != "polygon") { + render(); + } } function render() { - gl.clear( gl.COLOR_BUFFER_BIT ); - for(var i=0; i<numPolygons; i++) { - gl.drawArrays( gl.TRIANGLE_FAN, start[i], numPositions[i] ); + // for(var i=0; i<numPolygons; i++) { + // gl.drawArrays( gl.TRIANGLE_FAN, start[i], numPositions[i] ); + // } + for(var i = 0; i<SHAPES.length; i++){ + var obj = SHAPES[i]; + gl.drawArrays( obj["mode"], obj["index"], obj["step"] ); } + setTimeout(() => { + requestAnimationFrame(render) + }, speed); } //fungsi untuk mendapatkan koordinat pada saat mousedown event @@ -141,4 +213,4 @@ function updateColor() { const rgb = `rgb(${r}, ${g}, ${b})`; color.value = rgb; color.style.backgroundColor = rgb; - } +} -- GitLab