package com.haxademic.render.ello;

import com.haxademic.core.app.P;
import com.haxademic.core.app.PAppletHax;
import com.haxademic.core.app.config.AppSettings;
import com.haxademic.core.app.config.Config;
import com.haxademic.core.draw.context.OpenGLUtil;
import com.haxademic.core.draw.context.PG;
import com.haxademic.core.draw.image.MotionBlurPGraphics;
import com.haxademic.core.file.FileUtil;
import com.haxademic.core.math.easing.Penner;

import processing.core.PConstants;
import processing.core.PGraphics;
import processing.core.PShape;

public class GifRenderEllo025LoadingAnimationV3
extends PAppletHax {
	public static void main(String args[]) { arguments = args; PAppletHax.main(Thread.currentThread().getStackTrace()[1].getClassName()); }
	
	PShape _logo;
	PShape _logoInverse;
	float _frames = 62;
	
	protected PGraphics _pg;
	protected MotionBlurPGraphics _pgMotionBlur;
	
	protected void config() {
		Config.setProperty( AppSettings.WIDTH, 500 );
		Config.setProperty( AppSettings.HEIGHT, 500 );
		Config.setProperty( AppSettings.SMOOTHING, AppSettings.SMOOTH_HIGH );

		Config.setProperty( AppSettings.RENDERING_MOVIE, false );
		Config.setProperty( AppSettings.RENDERING_GIF, false );
		Config.setProperty( AppSettings.RENDERING_GIF_FRAMERATE, 60 );
		Config.setProperty( AppSettings.RENDERING_GIF_QUALITY, 15 );
		Config.setProperty( AppSettings.RENDERING_GIF_START_FRAME, Math.round(_frames) );
		Config.setProperty( AppSettings.RENDERING_GIF_STOP_FRAME, Math.round(_frames*2) );
	}
	
	protected void firstFrame() {

		_logo = p.loadShape(FileUtil.haxademicDataPath()+"svg/ello-mouth-gray-01.svg");
		buildCanvas();
	}

	protected void buildCanvas() {
		_pg = p.createGraphics( p.width, p.height, P.P3D );
		_pg.smooth(OpenGLUtil.SMOOTH_HIGH);
		_pgMotionBlur = new MotionBlurPGraphics(30);
	}


	protected void drawApp() {
		p.background(255);
		drawGraphics(_pg);
		_pgMotionBlur.updateToCanvas(_pg, p.g, 0.8f);
	}

	public void drawGraphics(PGraphics pg) {
		
		float frameRadians = PConstants.TWO_PI / _frames;
		float percentComplete = ((float)(p.frameCount%_frames)/_frames);
//		float easedPercent = Penner.easeInOutExpo(percentComplete, 0, 1, 1);
//		float easedPercent = Penner.easeInOutQuart(percentComplete, 0, 1, 1);
		float easedPercent = Penner.easeInOutCubic(percentComplete, 0, 1, 1);

		float frameOsc = P.sin( PConstants.TWO_PI * percentComplete);
		float elloSize = (float)(p.width);
		
		PG.setDrawCenter(pg);
		pg.beginDraw();
		pg.clear();
		pg.background(255);
		pg.noStroke();

		pg.translate(pg.width/2, pg.height/2);
		float rotations = 2;
		pg.rotate(easedPercent * PConstants.TWO_PI * rotations);
		pg.shape(_logo, 0, 0, elloSize, elloSize);

		pg.endDraw();
	}
}