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

1 Like

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.

1 Like

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.

1 Like

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);

}

2 Likes

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.

1 Like

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