processingで描いたものをmadmapperに

madmapperというプロジェクションマッピングを行うソフトを使っていろいろ触っていたら、processingの結果をプロジェクションマッピングに使えるということがわかったので簡単に調べた結果を

madmapperの簡単な使い方については
https://www.youtube.com/watch?v=Q_Q85xBRzSo


madmapperとprocessingの連携については
qiitaの中にも
https://qiita.com/reona396/items/2fb5c24cbe8da6e832c0

という記事もあったし、

https://yoppa.org/tauinteraction15/6524.html
の
https://drive.google.com/file/d/0BzyVHU69QO3mVVlwWGhYRnJMVE0/view
でも
説明されていた。


簡単なprocessingのスケッチをmadmapper用に変換するのを自分で試してみた。

まず、「processingをはじめよう第2版」の初めに出てくるスケッチ


```

void setup() {
size(480,120);
}


void draw() {
  if (mousePressed) {
   fill(0);
  } else {
   fill(255);
  }
  
    ellipse(mouseX, mouseY, 80, 80);
    
}
```

これを

```
import codeanticode.syphon.*;//ライブラリを入れる。syphonというのがアプリ間で画像を送り合うものらしい

SyphonServer server;//これを使ってやりとりしている？


void settings(){//setupでなくここでsize関数とPJOGLというのを書いておく
  size(480, 120,P3D);
  PJOGL.profile=1;
}


void setup() {
  server = new SyphonServer(this,"Processing Syphon");//ここも付け加える。qiitaの記事の方ではdrawの関数内の各指示の前にserverをつけていたがyoppa.orgさんの方ではそれがついていなかった。全部にserverつけるの大変そうだったので、この記事ではyoppaさんの方のやり方を真似て変更してみた。
}


void draw() {
  if (mousePressed) {
   fill(0);
  } else {
   fill(255);
  }
  
    ellipse(mouseX, mouseY, 80, 80);
    server.sendScreen();//ここ追加。二つの記事でここの書き方も違った。
    
}
```
に書き換え実行
madmapperの方で指定することで投影することができた。




他もprocessingに入っているサンプルプログラムをmadmapperで表示するために変更して、同じ方法でいけるのか試してみた。
GUIのところのButtonというサンプルプログラムを


```
import codeanticode.syphon.*;//←←←←←←追加


SyphonServer server;//←←←←←←追加
/**
 * Button. 
 * 
 * Click on one of the colored shapes in the 
 * center of the image to change the color of 
 * the background. 
 */
 
int rectX, rectY;      // Position of square button
int circleX, circleY;  // Position of circle button
int rectSize = 90;     // Diameter of rect
int circleSize = 93;   // Diameter of circle
color rectColor, circleColor, baseColor;
color rectHighlight, circleHighlight;
color currentColor;
boolean rectOver = false;
boolean circleOver = false;

void settings(){//←←←←←←追加
  size(640, 360,P3D);//←←←←←←追加
  PJOGL.profile=1;//←←←←←←追加
}//←←←←←←追加

void setup() {
  server = new SyphonServer(this,"Processing Syphon");//←←←←←←追加
  rectColor = color(0);
  rectHighlight = color(51);
  circleColor = color(255);
  circleHighlight = color(204);
  baseColor = color(102);
  currentColor = baseColor;
  circleX = width/2+circleSize/2+10;
  circleY = height/2;
  rectX = width/2-rectSize-10;
  rectY = height/2-rectSize/2;
  ellipseMode(CENTER);
}

void draw() {
  update(mouseX, mouseY);
  background(currentColor);
  
  if (rectOver) {
    fill(rectHighlight);
  } else {
    fill(rectColor);
  }
  stroke(255);
  rect(rectX, rectY, rectSize, rectSize);
  
  if (circleOver) {
    fill(circleHighlight);
  } else {
    fill(circleColor);
  }
  stroke(0);
  ellipse(circleX, circleY, circleSize, circleSize);
  
    server.sendScreen();//←←←←←←追加
}

void update(int x, int y) {
  if ( overCircle(circleX, circleY, circleSize) ) {
    circleOver = true;
    rectOver = false;
  } else if ( overRect(rectX, rectY, rectSize, rectSize) ) {
    rectOver = true;
    circleOver = false;
  } else {
    circleOver = rectOver = false;
  }
}

void mousePressed() {
  if (circleOver) {
    currentColor = circleColor;
  }
  if (rectOver) {
    currentColor = rectColor;
  }
}

boolean overRect(int x, int y, int width, int height)  {
  if (mouseX >= x && mouseX <= x+width && 
      mouseY >= y && mouseY <= y+height) {
    return true;
  } else {
    return false;
  }
}

boolean overCircle(int x, int y, int diameter) {
  float disX = x - mouseX;
  float disY = y - mouseY;
  if (sqrt(sq(disX) + sq(disY)) < diameter/2 ) {
    return true;
  } else {
    return false;
  }
}

```
うまくいった。