package de.wb3player.fileaccess.output.drawstyle.jogl;

import javax.media.opengl.GL;
import javax.media.opengl.GL2;
import javax.media.opengl.glu.GLU;
import javax.vecmath.Color3f;

import de.wb3player.fileaccess.output.drawstyle.DrawableMethods;
import de.wb3player.logger.LoggerFactory;
import de.wb3player.logger.LoggerInterface;
import de.wb3player.model.exception.DrawableMethodsException;

public abstract class AbstractJoglDrawableMethods implements DrawableMethods {


	protected static LoggerInterface logger = LoggerFactory.getLoggerInstance(AbstractJoglDrawableMethods.class);
	
	protected float mat[] = new float[4];	
	
	protected GL2 gl;	
	protected GLU glu;

	protected String name = "AbstractJoglDrawableMethods";
	protected String description = "AbstractJoglDrawableMethods: methods for drawing WB3 objects in JOGL";
	
	
	public AbstractJoglDrawableMethods() {
		logger.debug("Constructor called");
		
	}
	
	public void setGL(GL2 gl, GLU glu) {
		this.gl = gl;
		this.glu = glu;	
	}
	
		
	@Override	
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public String getDescription() {
		return description;
	}

	public void setDescription(String description) {
		this.description = description;
	}

	@Override
	public abstract void draw(Object object) throws DrawableMethodsException;
	
	public void setMaterial(GL2 gl, Color3f color, float alpha) {
		mat[0] = color.x;
		mat[1] = color.y; 
		mat[2] = color.z;
		mat[3] = alpha;
		
		float mat_diffuse[] = {0.1f, 0.1f, 0.1f, 0.0f};
        float mat_specular[] = {0.7f, 0.7f, 0.7f, 0.7f};
        float mat_shininess = 50f;
        float mat_emission[] = {0.1f, 0.1f, 0.1f, 0.1f};
		
       
		gl.glMaterialfv( GL.GL_FRONT_AND_BACK, GL2.GL_AMBIENT, mat,0 );
		gl.glMaterialfv( GL.GL_FRONT_AND_BACK, GL2.GL_DIFFUSE, mat_diffuse,0 );
		gl.glMaterialfv( GL.GL_FRONT_AND_BACK, GL2.GL_SPECULAR, mat_specular,0 );
		gl.glMaterialf( GL.GL_FRONT_AND_BACK, GL2.GL_SHININESS, mat_shininess );
		gl.glMaterialfv( GL.GL_FRONT_AND_BACK, GL2.GL_EMISSION, mat_emission,0 );
		
    }
	
	public void setMaterial(GL2 gl, Color3f color) {
		setMaterial(gl, color, 1.0f);
	}

}