0

So i have an animation where the small colorful small circles are growing. enter image description here

I wish to access the RGB value of the point where my mouse clicks.

I tried two ways to present the x,y. one is in [-1,1]. The other way is the original values. But none of them worked.

I skipped some codes in the main function as they are not relevant to the click function.

var VSHADER_SOURCE =
'attribute vec4 a_Position;\n' +
'uniform float u_SizeChange;\n' +
'void main() {\n' +
'  gl_Position.x = u_SizeChange * a_Position.x;\n' +
'  gl_Position.y = u_SizeChange * a_Position.y;\n' +
'  gl_Position.z = u_SizeChange * a_Position.z;\n' +
'  gl_Position.w = 1.0;\n' +
'}\n';

var FSHADER_SOURCE =
'precision mediump float;\n' +
'uniform vec4 u_FragColor;\n' +
'void main() {\n' +
'  gl_FragColor = u_FragColor;\n' +
'}\n';
function main() {
  var canvas = document.getElementById('webgl');

  // Get the rendering context for WebGL
  var gl = getWebGLContext(canvas);
  if (!gl) {
    console.log('Failed to get the rendering context for  WebGL');
    return;
  }

  // Initialize shaders
  if (!initShaders(gl, VSHADER_SOURCE, FSHADER_SOURCE)) {
    console.log('Failed to intialize shaders.');
    return;
  }    
var tick = function() {
  canvas.onmousedown = function(ev){click(ev,canvas,random_location,gl);};
  gl.clearColor(0.0, 0.0, 0.0, 1.0);
  gl.clear(gl.COLOR_BUFFER_BIT);   

  draw_circle(gl, 0, 0, disk_radius/400,[1.0,1.0,1.0,1.0]);
  if (game_running==true){requestAnimationFrame(tick, canvas);}      
};
        
  tick();
  
} }

function click(ev,canvas,random_location,gl) {
  var x = ev.clientX; // x coordinate of a mouse pointer
  var y = ev.clientY; // y coordinate of a mouse pointer
  var rect = ev.target.getBoundingClientRect() ;

  x = ((x - rect.left) - canvas.width/2)/(canvas.width/2);
  y = (canvas.height/2 - (y - rect.top))/(canvas.height/2);

  var x = ev.clientX - canvas.offsetLeft;
  var y = ev.clientY - canvas.offsetTop;
  const pixel = new Uint8Array(4);
  gl.readPixels(x, y, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, pixel);
  console.log(x,y);
  console.log(pixel);
  for (var i=0; i<=random_location.length;i++){
    // bacteria_alive[i]=false;
    if (bacteria_alive[i]==false){continue;}
    distance_to_center = cal_distance(x,y,0+disk_radius*Math.sin(random_location[i])/400,0+disk_radius*Math.cos(random_location[i])/400);  

    if (distance_to_center < radius/400){
      bacteria_alive[i]=false;
      break;

    }
  }

  }

Leo
  • 93
  • 1
  • 8
  • check https://stackoverflow.com/questions/17130395/real-mouse-position-in-canvas – James Mar 23 '23 at 00:05
  • @Leo **(1)** You cannot have **two variables with same name** in same function. If you somehow need two X vars then try unique names like example: `var xA` and `var xB` ... **(2)** When you check, is your X number correct from `var x = ev.clientX - canvas.offsetLeft;`? Before doing a `gl.readPixels` first try `alert("Getting pixel from: " + x);` to know if it's a `-1` or a `NaN` situation if getting all `0` in every point you click. Check your input (click point's X/Y) if the output (all zeros) is the problem... – VC.One Mar 28 '23 at 09:35

0 Answers0