package app;
import java.awt.Cursor;
import java.nio.FloatBuffer;
import java.util.Date;
import java.util.Random;
import javax.media.opengl.*;
import javax.media.opengl.glu.*;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
import oscP5.OscMessage;
import oscP5.OscP5;
import codeanticode.glgraphics.GLGraphics;
import codeanticode.glgraphics.GLTexture;
import codeanticode.glgraphics.GLTextureFilter;
import codeanticode.glgraphics.GLTextureWindow;
import processing.core.*;
import processing.opengl.*;
import remixlab.proscene.Camera;
import scenes.ElasticGrid;
import scenes.Grid;
import scenes.Scene;
import servers.WiiController;
import textures.FacesLoader;
import utils.Config;
import utils.ConsoleIO;
public class SerLiquidoVisual extends PApplet {
public static void main(String[] args) {
if(true) {
System.setProperty("apple.laf.useScreenMenuBar", "false");
System.setProperty("apple.awt.fakefullscreen", "true");
PApplet.main(new String[] { "--present", "app.SerLiquidoVisual" });
} else{
PApplet.main(new String[] { "app.SerLiquidoVisual" });
}
}
///////////////////////////////////////////////////////
// CONFIGURACIONES:
//
///////////////////////////////////////////////////////
public static Logger logger = Logger.getLogger(SerLiquidoVisual.class);
private static final long serialVersionUID = 1;
private String configFile = ("data/config.ini");
private Config config = new Config(configFile);
///////////////////////////////////////////////////////
// GUI:
///////////////////////////////////////////////////////
//TODO USAR UNIVERSE !!!
PFont OSD_FONT = createFont("Arial", 16);
private int GUI_W = config.getIntParameter("GUI_W");
private int GUI_H = config.getIntParameter("GUI_H");
private int GUI_X = config.getIntParameter("GUI_X");
private int GUI_Y = config.getIntParameter("GUI_Y");
//////////////////////////////////////////////////////////////////////////////////////
// OUTPUT
//////////////////////////////////////////////////////////////////////////////////////
private int OUTPUT_W = config.getIntParameter("OUTPUT_W");
private int OUTPUT_H = config.getIntParameter("OUTPUT_H");
private int OUTPUT_X = config.getIntParameter("OUTPUT_X");
private int OUTPUT_Y = config.getIntParameter("OUTPUT_Y");
//////////////////////////////////////////////////////////////////////////////////////
// TEXTURAS
//////////////////////////////////////////////////////////////////////////////////////
private GLTextureWindow OUTPUT_WINDOW;
private GLTexture OUTPUT_TEXTURE;
private GLTexture tex0;
private GLTexture nightShot;
GLTextureFilter ns;
GLTextureFilter dream;
// aca voy a cargar las imagenes de las caras
private FacesLoader faces;
//////////////////////////////////////////////////////////////////////////////////////
// CAMARA
//////////////////////////////////////////////////////////////////////////////////////
private Camera OUTPUT_CAMERA;
///////////////////////////////////////////////////////
// ESCENAS
///////////////////////////////////////////////////////
private int currentScene = 1;
private ElasticGrid serLiquido ;
///////////////////////////////////////////////////////
// AUDIO
///////////////////////////////////////////////////////
///////////////////////////////////////////////////////
// VARIOS
///////////////////////////////////////////////////////
private Random random = new Random();
private WiiController wii = new WiiController();
boolean wiiFeedback = false;
////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////
private OscP5 coreListen;
private int inputPort = 8600;
public void setup(){
PropertyConfigurator.configure("./data/logs/logger.properties");
logger.info("CREATING PAPPLET");
// size(GUI_W,GUI_H, GLGraphics.GLGRAPHICS);
size(OUTPUT_W,OUTPUT_H, GLGraphics.GLGRAPHICS);
frameRate(60);
frame.setLocation(GUI_X, GUI_Y);
frame.setCursor(Cursor.CROSSHAIR_CURSOR);
mySetup();
coreListen = new OscP5(this,inputPort);
}
void mySetup(){
////////////////////////////////////////////////////
// OUTPUT
/////////////////////////////////////////////////////
logger.info("CREATING OUTPUT TEXTURE");
OUTPUT_TEXTURE = new GLTexture(this, OUTPUT_W, OUTPUT_H);
// a la ventana de salida yo solo le paso una textura
// que funciona como canvas ya que luego
// cada escena en particular me va a devolver una textura
// de Opengl con la que puedo hacer distintas coas.
// logger.info("CREATING OUTPUT WINDOW");
//
// OUTPUT_WINDOW = new GLTextureWindow(this, OUTPUT_X, OUTPUT_Y, OUTPUT_W, OUTPUT_H);
// OUTPUT_WINDOW.setTexture(OUTPUT_TEXTURE);
// OUTPUT_WINDOW.init();
// Loading required filters.
logger.info("LOADING TEXTURE FILTERS");
ns = new GLTextureFilter(this, "./data/shaders/nigth.xml");
tex0 = new GLTexture(this, OUTPUT_W, OUTPUT_H, GLTexture.FLOAT);
dream = new GLTextureFilter(this, "./data/shaders/dream.xml");
nightShot = new GLTexture(this, OUTPUT_W, OUTPUT_H, GLTexture.FLOAT);
////////////////////////////////////////////////////
// setup escene
/////////////////////////////////////////////////////
logger.info("CREATING ESCENE: ELASTIC GRID");
serLiquido = new ElasticGrid( (PApplet) this, OUTPUT_W, OUTPUT_H);
((ElasticGrid) serLiquido).setup();
//////////////////////////////////////////////////////////
logger.info("CREATING FACE LOADER");
faces = new FacesLoader(this);
//textureLoader.importImages("/Users/diex/Documents/WORK/PROGRAMACION/EclipseWS/SerLiquido/imagenes/Claudio paul");
//////////////////////////////////////////////////////////////////////////
// CAMARA
//////////////////////////////////////////////////////////////////////////
// cuando creo la camara le paso false
// para que no la asocie con la matriz de camara
// que usa el PAPlet que uso como gui.
// OUTPUT_CAMERA = new Camera(false, this);
OUTPUT_CAMERA = new Camera(false, this);
OUTPUT_CAMERA.centerScene();
}
////////////////////////////////////////////////////
// PROCESSING DRAW
/////////////////////////////////////////////////////
boolean canUpdateTextures = false;
public void draw(){
background(0);
fill(0);
OUTPUT_CAMERA.setPosition(new PVector(-OUTPUT_W/2, -OUTPUT_H/2));
//////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////
// OUTPUT
//////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////
if(canUpdateTextures) setFaces(name1, name2);
// TODO mecanismo para que el update de la escena corra en un thread
serLiquido.noiseShake(frameCount , .5f );
if(random(1) < 0.1f){
if(faces.hasFaces()) flipFace();
}
serLiquido.update();
// transformaciones
serLiquido.setScale(50f);
serLiquido.setPosition(new PVector(0,1,0));
// le paso una camara
serLiquido.cameraFeed(OUTPUT_CAMERA);
// dibujo
serLiquido.draw();
// capturo la textura y la paso al viewport
// dream.apply(serLiquido.getTexture(), tex1);
ns.apply(serLiquido.getTexture() , nightShot );
OUTPUT_TEXTURE.copy(nightShot);
image(OUTPUT_TEXTURE,0,0);
////////////////////////////////////////////////////
// DEBUG
/////////////////////////////////////////////////////
// println(frameRate);
}
public void stop() {
super.stop();
}
String name1;
String name2;
void oscEvent(OscMessage theOscMessage) {
/* check if theOscMessage has the address pattern we are looking for. */
logger.info("RECEIVED OSC EVENT: "+ theOscMessage.addrPattern() + " : " +theOscMessage.typetag());
if(theOscMessage.checkAddrPattern("/visitorReady")){
name1 = theOscMessage.get(0).stringValue();
name2 = theOscMessage.get(1).stringValue();
canUpdateTextures = true;
}
}
public void setFaces(String name1, String name2){
logger.info("RESETING FACES POOL");
faces.resetTextures();
logger.info("LOADING FACES FOR: "+ name1);
faces.importImages("./imagenes/" + name1);
logger.info("LOADING FACES FOR: "+ name2);
faces.importImages("./imagenes/" + name2);
canUpdateTextures = false;
}
public void flipFace(){
int id = (int) random(1 , faces.getSize() - 1);
logger.info("FLIP FACE: ID ="+id+" faces.size="+ faces.getSize() );
serLiquido.setTexture(faces.getImage(id));
}
////////////////////////////////////////////////////
// KEYBOARD MAPPING
/////////////////////////////////////////////////////
int id = 0;
public void keyPressed(){
if( key == 'r') {
faces.resetTextures();
faces.importImages("./imagenes/" + "Diego alberti");
faces.importImages("./imagenes/" + "Madonna");
}
if( key == 'f') {
wiiFeedback = ! wiiFeedback;
wii.forcefeedback(wiiFeedback);
}
if( key == 's') serLiquido.shake(-1);
if( key == 'b') serLiquido.flock(-1);
if( key == ']'){
id = (id + 1) % faces.getSize();
serLiquido.setTexture(faces.getImage(id));
}
if( key == '['){
id = abs( (id - 1) % faces.getSize());
serLiquido.setTexture(faces.getImage(id));
}
// scene[currentScene].keyPressed(key);
// if(key == 'r' || key == 'R') serLiquido.setup();
if(key == 's' || key == 'S') {
System.out.println("SAVING");
}
if(key == 'o' || key == 'O') {
// millis = 0;
System.out.println("MILLIS 0");
}
if(key == ' '){
long d = System.nanoTime();
// saveFrame(d + "_.jpg");
println("SAVED : " + d + "_.jpg" );
}
}
public static void main(String args[]) {
PApplet.main(new String[] {"app.SerLiquidoVisual"});}
}