package scenes;
import java.util.Random;
import javax.media.opengl.GL;
import processing.core.PApplet;
import processing.core.PConstants;
import processing.core.PMatrix3D;
import processing.core.PVector;
import remixlab.proscene.Camera;
import remixlab.proscene.Frame;
import remixlab.proscene.Quaternion;
import utils.DrawingUtils;
import utils.Util;
import codeanticode.glgraphics.GLGraphics;
import codeanticode.glgraphics.GLGraphicsOffScreen;
import codeanticode.glgraphics.GLTexture;
public class Scene extends GLGraphicsOffScreen {
///////////////////////////////////////////////////////////////////
// CONFIGURACION DE LA ESCENA
///////////////////////////////////////////////////////////////////
protected Random random = new Random(System.currentTimeMillis());
// dejo el parent como protected
// porque tal vez lo necesita la clase que extiende de Scene
protected PApplet parent;
// la camara es privada
// o sea que solo la puede controlar el que la creo
// esta clase no tiene metodos para la camara
private Camera camera;
// es el eje de cordenadas 0,0,0 de la escena
protected Frame anchor = new Frame();
// yaw, pitch y roll son tres rotaciones distintas
// por eso es que las guardo en tres quats diferentes
protected Quaternion yaw = new Quaternion();
protected Quaternion pitch = new Quaternion();
protected Quaternion roll = new Quaternion();
// un cuarto quat es usado para componer las otras
// tres rotaciones y obtener una matriz para rotar
// el anchor
private Quaternion currentRotation = new Quaternion();
// la escala de la scene
protected PVector scale = new PVector(1,1,1);
/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
public Scene(PApplet parent, int OUTPUT_W, int OUTPUT_H){
super(parent, OUTPUT_W, OUTPUT_H);
System.out.println("bang");
this.parent = parent;
//////////////////////////////////////////////////////////////////////////
// CONFIGURACIONES DE OPENGL
//////////////////////////////////////////////////////////////////////////
// TODO revisar que hace GLGraphics
gl.glEnable (GL.GL_BLEND);
gl.glBlendFunc (GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA);
//gl.glEnable (GL.GL_DEPTH_TEST);
gl.glShadeModel(GL.GL_SMOOTH);
//gl.setSwapInterval(2); //set vertical sync on
gl.glEnable(GL.GL_NORMALIZE);
}
public void draw(){
beginDraw();
beginGL();
lights();
resetLights();
//>>>>>>>>>>>>luces aqui
gl.glPushMatrix();
background(0,255,0,255);
// aplico la transformacion de la camara
gl.glMultMatrixf(Util.glModelViewMatrix(camera.getModelViewMatrix()), 0);
gl.glTranslatef(
anchor.position().x,
anchor.position().y,
anchor.position().z);
// Acumulo las 3 rotaciones en una sola
currentRotation = new Quaternion();
currentRotation.multiply(yaw);
currentRotation.multiply(pitch);
currentRotation.multiply(roll);
anchor.setRotation(currentRotation);
// aplico las rotaciones
gl.glMultMatrixf(Util.glModelViewMatrix(anchor.matrix()), 0);
// el scale lo paso a parte porque no tengo un metodo
// para ajustar el scale en el Frame anchor
gl.glScalef(scale.x, scale.y, scale.z);
////<<<<<<<<<<<<<<<
ambientLight(100, 150, 100);
spotLight( 100, 255, 100,
0, 0, 0,
1, 0, 0,
90, 90); //(255, 255, 255, width/2, height/2, 1);
////<<<<<<<<<<<<<<<
// llama al metodo render scene
renderScene();
//DrawingUtils.drawAxis( this, 100);
// cierra el gl
gl.glPopMatrix();
endGL();
endDraw();
}
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
public void setScale(float scale){
this.scale.set(scale, scale, scale);
}
public void setPosition (PVector position){
anchor.setPosition(position);
}
public void yaw(float angle){
yaw.fromAxisAngle(Util.x, angle);
}
public void pitch(float angle){
pitch.fromAxisAngle(Util.y, angle);
}
public void roll(float angle){
roll.fromAxisAngle(Util.z, angle);
}
public void cameraFeed(Camera camera) {
this.camera = camera;
}
///////////////////////////////////////////////////////////////////////////
// estos metodos son los que reescribo en la clase que extiende a la scene
///////////////////////////////////////////////////////////////////////////
public void setup(){
}
public void update(){
}
protected void renderScene(){
}
public PVector getScale(){
return scale;
}
}