package app;
import java.awt.Cursor;
import java.awt.DisplayMode;
import java.awt.Frame;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.nio.FloatBuffer;
import java.util.Date;
import java.util.Random;
import javax.media.opengl.*;
import javax.media.opengl.glu.*;
import netP5.NetAddress;
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(false) {
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 Config config = new Config("data/visual.ini");
///////////////////////////////////////////////////////
// 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");
private boolean FULLSCREEN;
//////////////////////////////////////////////////////////////////////////////////////
// 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 ;
///////////////////////////////////////////////////////
// VARIOS
///////////////////////////////////////////////////////
private Random random = new Random();
// TODO que lo levante del archivo de configuracion
private OscP5 oscGateway;
private int oscInputPort = 8600;
private int oscCorePort = 7601;
private NetAddress oscCoreLocation;
public void setup(){
PropertyConfigurator.configure("./data/logs/logger.properties");
logger.info("CREATING PAPPLET");
size(OUTPUT_W,OUTPUT_H, GLGraphics.GLGRAPHICS);
frameRate(60);
frame.setLocation(GUI_X, GUI_Y);
frame.setCursor(Cursor.CROSSHAIR_CURSOR);
mySetup();
oscInputPort = config.getIntParameter("oscInputPort");
oscCorePort = config.getIntParameter("oscCorePort");
oscCoreLocation = new NetAddress(config.getStringParameter("oscCoreIp"), oscCorePort);
oscGateway = new OscP5(this,oscInputPort);
if(config.getBoolParameter("fullscreen")){
try {
logger.info("ENTER FULLSCREEN");
GraphicsDevice myGraphicsDevice = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
myGraphicsDevice.setFullScreenWindow(frame);
} catch (Exception e) {
e.printStackTrace();
System.exit(0);
}
}
}
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();
// engania pichanga
faces.resetTextures();
faces.importImages("./imagenes/" + "diego alberti");
faces.importImages("./imagenes/" + "Madonna");
faces.importImages("./imagenes/" + " ana paula rosso ");
faces.importImages("./imagenes/" + "Alberto olmedo");
faces.importImages("./imagenes/" + "einstein");
faces.importImages("./imagenes/" + "eva duarte");
faces.importImages("./imagenes/" + "Leo messi");
faces.importImages("./imagenes/" + "Mona GIMENEZ");
faces.importImages("./imagenes/" + "patricia valeria bermudez");
flipFace();
}
////////////////////////////////////////////////////
// PROCESSING DRAW
/////////////////////////////////////////////////////
boolean canUpdateTextures = false;
public void draw(){
if(canUpdateTextures) {
setFaces(name1, name2);
}else{
if(frameCount % 150 == 0) sendOSCMessage("/pingVisual",oscCoreLocation);
background(0);
fill(0);
OUTPUT_CAMERA.setPosition(new PVector(-OUTPUT_W/2, -OUTPUT_H/2));
//////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////
// OUTPUT
//////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////
// TODO mecanismo para que el update de la escena corra en un thread
serLiquido.noiseShake(frameCount , .5f );
if(random(1) < 0.005f){
if(faces.hasFaces()) flipFace();
}
serLiquido.update();
// transformaciones
serLiquido.setScale(70f);
serLiquido.setPosition(new PVector(0,1,0));
serLiquido.pitch(PI);
// 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
/////////////////////////////////////////////////////
}
}
public void sendOSCMessage(String message, NetAddress dest){
OscMessage myMessage = new OscMessage(message);
oscGateway.send(myMessage, oscCoreLocation);
}
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 == '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" );
}
}
}