Reveal bg image with circle following mouse

i have two layers, both are flat pictures. i want to uncover the lower picture with the mouse pointer. an circle has to follow the mouse. >>>> that’s what I´ve got right now.

PVector theBallPosition;
PVector theBallVelocity;
PImage bg,front;

 
void setup(){
  smooth();
  frameRate(60);
  size(1366,768);
  bg = loadImage("3dfaces.png");
 
 
  theBallPosition = new PVector(width/5,height/5); 
  theBallVelocity = new PVector(0,0); 
  loadImage("3dfaces.png");
}

 
void draw(){
  noStroke();
  fill(255);
  background(bg); // Background color
  ellipseMode(CENTER);
  ellipse(mouseX,mouseY,300,300); // Placing the circle

Question: how can i subtract my “mouse circle” with the picture on the top so I only see the background image

Im not sure how its accessed in p5 but i know there is a function native to javascript that allows you to fill with holes. As opposed to filling with a shape the shape is converted to a hole, will track down when at my desk.

Check out bitmap collision on coding math channel, it does exactly what you’re looking for. It uses the image data to do this, and “destination-out” is the way to set the fill style to cookie cutter.

Use mask()?

If I understand correctly, you want to mask one image using a circle, to reveal the layer on top / below, right? See the example below to learn how to draw into a separate ‘masking canvas’ that you can then apply to your image.

PGraphics mask;
PImage bgImage, topImage;

void setup()
{
  size(600, 600);

  // create pgraphics canvas to draw into
  mask = createGraphics(width, height);
  
  // load images
  bgImage = loadImage("background.png");
  bgImage.resize(width, height);
  topImage = loadImage("foreground.png");
  topImage.resize(width, height);
}


void draw()
{
  // update - draw into mask (no actual drawing takes place yet)
  mask.beginDraw();
  mask.background(0);
  mask.ellipseMode(CENTER);
  mask.fill(255);
  mask.noStroke();
  mask.ellipse(mouseX, mouseY, 200, 200);
  mask.endDraw();
  
  // draw background image
  image(bgImage, 0, 0, width, height);
  
  // apply mask to top image & draw top image
  topImage.mask(mask);
  image(topImage, 0, 0, width, height);

}

Oh and if you want to invert the effect, ‘revealing the background’, you’d simply draw the circle in black and the masks background in white.

That’s exactly what I was searching for. Thank you very much! :slight_smile: