void	WED_GISBoundingBox::ResizeSide(GISLayer_t l,int side, const Vector2& delta, bool symetric)
{
	MoveSide(l,side, delta);
	if(symetric)
		MoveSide(l,(side+2)%4,-delta);
}
int tetris_exec( int fdfb, int fdrc, int fdlcd, char *cfgfile )
{
	struct timeval	tv;
	int				x;
	int				i;
	int				fd;
	FILE			*fp;
	char			*line;
	char			*p;

	if ( FBInitialize( 720, 576, 8, fdfb ) < 0 )
		return -1;

	setup_colors();

	if ( RcInitialize( fdrc ) < 0 )
		return -1;

/* load setup */
	fp = fopen( CONFIGDIR "/games.cfg", "r" );
	if ( fp )
	{
		line=malloc(128);
		isalloc=1;
#ifdef HAVE_CURL
		proxy_addr=0;
		proxy_user=0;
#endif
		hscore=0;
		while( fgets( line, 128, fp ) )
		{
			if ( *line == '#' )
				continue;
			if ( *line == ';' )
				continue;
			p=strchr(line,'\n');
			if ( p )
				*p=0;
			p=strchr(line,'=');
			if ( !p )
				continue;
			*p=0;
			p++;
#ifdef HAVE_CURL
			if ( !strcmp(line,"proxy") )
				proxy_addr=strdup(p);
			else if ( !strcmp(line,"proxy_user") )
				proxy_user=strdup(p);
			else if ( !strcmp(line,"hscore") )
				hscore=strdup(p);
#endif
		}
		fclose(fp);
		free(line);
	}

	fd = open( GAMESDIR "/tetris.hscore", O_RDONLY );
	if ( fd == -1 )
	{
		mkdir( GAMESDIR, 567 );
		for( i=0; i < 8; i++ )
		{
			strcpy(hsc[i].name,"nobody");
			hsc[i].points=30;
		}
	}
	else
	{
		read( fd, hsc, sizeof(hsc) );
		close(fd);
	}

#ifdef HAVE_CURL
	if ( hscore )
	{
		LoadHScore();
	}
#endif

#if defined(HAVE_DBOX_HARDWARE) || defined(HAVE_SPARK_HARDWARE) || defined(HAVE_DUCKBOX_HARDWARE)
	Fx2ShowPig( 480, 400, 176, 144 );
#endif

	while( doexit != 3 )
	{
		BoardInitialize();
		DrawBoard( );	/* 0 = all */
		NextItem();
#ifdef HAVE_DREAMBOX_HARDWARE
		Fx2ShowPig(480, 400, 176, 144 );
#endif
		doexit=0;
		while( !doexit )
		{
			tv.tv_sec = 0;
			tv.tv_usec = 10000;
			x = select( 0, 0, 0, 0, &tv );		/* 10ms pause */
			RcGetActCode( );
			if ( doexit )
				break;
			tv.tv_sec = 0;
			tv.tv_usec = 10000;
			x = select( 0, 0, 0, 0, &tv );		/* 10ms pause */
			RcGetActCode( );
			if ( doexit )
				break;
			MoveSide();
			if ( !FallDown() )
			{
				RemoveCompl();
				if ( !NextItem() )
					doexit=1;
			}
#if defined(USEX) || defined(HAVE_SPARK_HARDWARE) || defined(HAVE_DUCKBOX_HARDWARE)
			FBFlushGrafic();
#endif

			RcGetActCode( );
		}

		if ( doexit != 3 )
		{
			actcode=0xee;
			DrawGameOver();
#if defined(USEX) || defined(HAVE_SPARK_HARDWARE) || defined(HAVE_DUCKBOX_HARDWARE)
			FBFlushGrafic();
#endif
			doexit=0;
			SaveGame();
#ifdef HAVE_CURL
			if ( use_ihsc )
				ShowIHScore();
#endif
			ShowHScore(hsc);
			Fx2PigPause();

#if defined(USEX) || defined(HAVE_SPARK_HARDWARE) || defined(HAVE_DUCKBOX_HARDWARE)
			FBFlushGrafic();
#endif
			i=0;
			actcode=0xee;
			while(( actcode != RC_OK ) && !doexit )
			{
				tv.tv_sec = 0;
				tv.tv_usec = 100000;
				x = select( 0, 0, 0, 0, &tv );		/* 100ms pause */
				RcGetActCode( );
				i++;
				if ( i == 50 )
				{
					FBDrawString( 190, 480, 48, "press OK for new game",GRAY,0);
#if defined(USEX) || defined(HAVE_SPARK_HARDWARE) || defined(HAVE_DUCKBOX_HARDWARE)
					FBFlushGrafic();
#endif
				}
			}
			Fx2PigResume();
		}
	}

	Fx2StopPig();

#if defined(HAVE_DBOX_HARDWARE) || defined(HAVE_SPARK_HARDWARE) || defined(HAVE_DUCKBOX_HARDWARE)
/* fx2 */
/* buffer leeren, damit neutrino nicht rumspinnt */
	realcode = RC_0;
	while( realcode != 0xee )
	{
		tv.tv_sec = 0;
		tv.tv_usec = 300000;
		x = select( 0, 0, 0, 0, &tv );		/* 300ms pause */
		RcGetActCode( );
	}
#endif

	RcClose();
	FBClose();

/* save hscore */
	fd = open( GAMESDIR "/tetris.hscore", O_CREAT|O_WRONLY, 438 );
	if ( fd != -1 )
	{
		write( fd, hsc, sizeof(hsc) );
		close(fd);
	}

	if ( isalloc )
	{
#ifdef HAVE_CURL
		if ( proxy_addr )
			free ( proxy_addr );
		if ( proxy_user )
			free ( proxy_user );
#endif
		if ( hscore )
			free ( hscore );
	}

	return 0;
}
void CameraController::Update()
{
	if ( m_ZoomDirection == ZOOM_DIRECTION_NONE )
	{
		return;
	}

	float targetY = 0;
	float targetViewY = 0;

	switch ( m_ZoomStatus )
	{
		case ZOOM_STATUS_NEAREST:
			targetY = NEAREST_Y;
			targetViewY = NEAREST_VIEW_Y;
			break;
		case ZOOM_STATUS_DEGREE_1:
			targetY = DEGREE_1_Y;
			targetViewY = DEGREE_1_VIEW_Y;
			break;
		case ZOOM_STATUS_DEGREE_2:
			targetY = DEGREE_2_Y;
			targetViewY = DEGREE_2_VIEW_Y;
			break;
		case ZOOM_STATUS_DEGREE_3:
			targetY = DEGREE_3_Y;
			targetViewY = DEGREE_3_VIEW_Y;
			break;
		case ZOOM_STATUS_FARTHEST:
		default:
			targetY = FARTHEST_Y;
			targetViewY = FARTHEST_VIEW_Y;
			break;
	}

	float time = static_cast<float>( Timer::GetInstance()->GetElapsedTime() ) / 1000;
	float delta = time * 10.0f;

	D3DXVECTOR3 view = m_LookAtPoint - m_EyePoint;
	D3DXVec3Normalize( &view, &view );
	float	dotView = D3DXVec3Dot( &view, &( -m_UpVector ) );

	// Log( "%-8f도!!! %-8f \n", dotView, targetViewY );
	// Log( "목표 = %f, 현위치 = %f \n", targetY, m_EyePoint.y );

	// 카메라 업
	if ( m_ZoomDirection == ZOOM_DIRECTION_BACK )
	{
		if ( dotView < targetViewY )
		{
			RotateUp( delta * dotView / ( m_EyePoint.y / 10 ) );
		}

		MoveElevate( delta * 10 );
		MoveForward( -delta * 10, true );

		if ( targetY < m_EyePoint.y )
		{
			m_ZoomDirection = ZOOM_DIRECTION_NONE;
			return;
		}
	}
	// 카메라 다운
	else if ( m_ZoomDirection == ZOOM_DIRECTION_FOWARD )
	{
		if ( dotView > targetViewY )
		{
			RotateUp( -delta * dotView / ( m_EyePoint.y / 10 ) );
		}

		MoveElevate( -delta * 10 );
		MoveForward( delta * 10, true );

		if ( targetY > m_EyePoint.y )
		{
			m_ZoomDirection = ZOOM_DIRECTION_NONE;
			return;
		}
	}

	if ( m_ZoomPointX > 0 )
	{
		m_ZoomPointX = __min( m_ZoomPointX, 50 );
		m_ZoomPointX -= delta;
		MoveSide( delta );
	}
	else if ( m_ZoomPointX < 0 )
	{
		m_ZoomPointX = __max( m_ZoomPointX, -50 );
		m_ZoomPointX += delta;
		MoveSide( -delta );
	}

	if ( m_ZoomPointY > 0 )
	{
		m_ZoomPointY = __min( m_ZoomPointY, 50 );
		m_ZoomPointY -= delta;
		MoveForward( -delta );
	}
	else if ( m_ZoomPointY < 0 )
	{
		m_ZoomPointY = __max( m_ZoomPointY, -50 );
		m_ZoomPointY += delta;
		MoveForward( delta );
	}
}