double dScale = getDeviceScale( );  ChartWithAxes cwa = (ChartWithAxes) getModel( );   Vector lightDirection = new Vector( -1, 1, -1, false );  final Bounds bo = getPlotBounds( );  double width = bo.getWidth( ); double height = bo.getHeight( );     if ( width > height && width != 0 ) {  height += ( width - height ) * ( height / width ) / 4; } else if ( width < height && height != 0 ) {  height += ( height - width ) * ( width / height ) / 4; }  engine = new Engine3D( cwa.getRotation( ), lightDirection, width, height, 500 * dScale, 1500 * dScale, 10 * dScale, 10000 * dScale, 100 );
return ( (PlotWith3DAxes) oComputations ).get3DEngine( );
	public final Engine3D get3DEngine( )	{		if ( engine == null )		{			double dScale = getDeviceScale( );			ChartWithAxes cwa = (ChartWithAxes) getModel( );			// Use a fixed light direction here.			Vector lightDirection = new Vector( -1, 1, -1, false );			// Vector lightDirection = new Vector( 0, 0, -1, false );			final Bounds bo = getPlotBounds( );			double width = bo.getWidth( );			double height = bo.getHeight( );			// TODO read from custom panning setting			// automatically adjust panning offset			if ( width > height && width != 0 )			{				// decrease y-offset				height += ( width - height ) * ( height / width ) / 4;			}			else if ( width < height && height != 0 )			{				// increase y-offset				height += ( height - width ) * ( width / height ) / 4;			}			engine = new Engine3D( cwa.getRotation( ),					lightDirection,					width,					height,					500 * dScale,					1500 * dScale,					10 * dScale,					10000 * dScale,					100 );		}		return engine;	}