/**
 * 3DzzD Tutorial
 *
 * This sample demonstrate how to load and display 3D files
 *
 * (c) Bruno Augier 2006 
 * 
 * http://dzzd.net
 */

import java.awt.*;


/**
 * import 3DzzD API
 */ 
import dzzd.DzzD;
import dzzd.*;


/**
 * Main sample class
 * 
 * To avoid a lot of work, we extends DzzDApplet
 *  so init3DzzD() will be called once applet started and 
 *  a default renderer will exist.
 *
 * We also implements IScene3DRenderCallBack to avoid
 *  using a separated class to handle renderer events
 */
public final class Sample extends DzzDApplet implements IScene3DRenderCallBack
{			
  	/**
     * This method is called by the superclass DzzDApplet once applet started
     *  there, we will initialise our renderer and start to load some 3D files
     */
	public void init3DzzD()
	{
		//Set cursor for Render3D
		this.getScene3DRender().getRender3D().setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
			
		//This class will handle renderer events
		this.getScene3DRender().setScene3DRenderCallBack(this);	
		
		//Ask the API to load the 3d file
		this.getScene3DRender().getScene3D().loadScene3DFrom3DS(this.getBaseURL()+"MODELS/","CUBE.3DS");
	}
	

	/**
	 * This method will be called periodically each times a ressource is loading : 3D files,textures, ...
	 *  there, we will control our loading process and can inform users about its progress : loading progress...
	 */
	public void render3DObjectMonitor(IScene3DRender r)
	{
		//If something is loading, let some time for loading threads
		try
		{
			Thread.sleep(100);
		}
		catch(InterruptedException ie)
		{
		}		
		 
		//There we know that our 3d file has been loaded
		if(r.getScene3D().getMesh3DByName("CUBE.3DS")!=null)
		{
			//Move camera to put object on field of view
			r.getScene3D().getCurrentCamera3D().getPosition().setZ(-200); 			
			
			//Set main light direction
			IPoint3D lr=r.getScene3D().getLight3DById(0).getRotation();
			lr.set(-0.8,-0.6,0);
							
			//Set background color
			r.getScene3D().setBackgroundColor(0xFFFFFF);
		}
		
	}	
		
	double rotateX;
	double rotateY;
	double cameraZ;

	public void render3DWorldSpace(IScene3DRender r)
	{
		if(r.getScene3D().getMesh3DByName("CUBE.3DS")==null)
			return;
			
		IDirectInput di=r.getRender3D().getDirectInput();
	
		if(!di.isMouseB1())
		{
			rotateX=r.getScene3D().getMesh3DByName("CUBE").getRotation().getX();
			rotateY=r.getScene3D().getMesh3DByName("CUBE").getRotation().getY();
			
		}
		else
		{
			r.getScene3D().getMesh3DByName("CUBE").getRotation().setX(rotateX+((di.getMouseY()-di.getMouseDragY())*Math.PI/200));
			r.getScene3D().getMesh3DByName("CUBE").getRotation().setY(rotateY+((di.getMouseX()-di.getMouseDragX())*Math.PI/200));
		}
		
		if(!di.isMouseB3())
		{
			cameraZ=r.getScene3D().getCurrentCamera3D().getPosition().getZ();
		}
		else
		{
			double distY=di.getMouseY()-di.getMouseDragY();
			r.getScene3D().getCurrentCamera3D().getPosition().setZ(cameraZ+distY);
		}
		
			
	}
	public void render3DstartCallBack(IScene3DRender r){}
	public void render3DStart(IScene3DRender r){}
	public void render3DCameraSpace(IScene3DRender r){}
	public void render3DPixelsUpdate(IScene3DRender r){}
	public void render3DPixelsUpdated(IScene3DRender r){}	
	public void render3DEnd(IScene3DRender r){}		
	public void render3DSwitched(IScene3DRender r){}
}
