void WASDCameraController::Input(UIEvent * event)
{
	if (currScene == 0)
		return;
	Camera * camera = currScene->GetCurrentCamera();
    if (!camera)return;
    if (event->phase == UIEvent::PHASE_KEYCHAR)
    {   
		if(!IsKeyModificatorsPressed())
		{
			switch (event->tid) 
			{
			case DVKEY_Z:
				{
					LookAtSelection();
					break;
				}
			case DVKEY_T:
				{
					if (!camera)return;

					viewZAngle = 0;
					viewYAngle = MAX_ANGLE;

					Matrix4 mt, mt2;
					mt.CreateRotation(Vector3(0,0,1), DegToRad(viewZAngle));
					mt2.CreateRotation(Vector3(1,0,0), DegToRad(viewYAngle));
					mt2 *= mt;
					Vector3 vect = Vector3(0,0, 200);

					Vector3 position = vect + Vector3(0, 10, 0) * mt2;

					camera->SetTarget(position);
					camera->SetPosition(vect);					
					break;					
				}

			case DVKEY_1:
				{
					EditorSettings::Instance()->SetCameraSpeedIndex(0);
					SetSpeed(EditorSettings::Instance()->GetCameraSpeed());
					break;
				}

			case DVKEY_2:
				{
					EditorSettings::Instance()->SetCameraSpeedIndex(1);
					SetSpeed(EditorSettings::Instance()->GetCameraSpeed());
					break;
				}

			case DVKEY_3:
				{
					EditorSettings::Instance()->SetCameraSpeedIndex(2);
					SetSpeed(EditorSettings::Instance()->GetCameraSpeed());
					break;
				}

			case DVKEY_4:
				{
					EditorSettings::Instance()->SetCameraSpeedIndex(3);
					SetSpeed(EditorSettings::Instance()->GetCameraSpeed());
					break;
				}

			case DVKEY_9:
				{
					if (speed - 50 >= 0)
					{
						speed -= 50;
					}
					break;
				}

			case DVKEY_0:
				{        
					if (speed + 50 <= 5000)
					{
						speed += 50;
					}
					break;
				}

			default:
				break;
			}		
		}
    } 

	bool altBut3 = (selection && event->tid == UIEvent::BUTTON_3 && IsKeyModificatorPressed(DVKEY_ALT));
	
	
	if(UIEvent::PHASE_BEGAN == event->phase)
	{
		startPt = stopPt = event->point;			

		if (altBut3)
		{
			const Vector3 & pos = camera->GetPosition();
			AABBox3 box = selection->GetWTMaximumBoundingBoxSlow();
			center = box.GetCenter();
			radius = (center - pos).Length();
		}
	}
	else if(UIEvent::PHASE_DRAG == event->phase || UIEvent::PHASE_ENDED == event->phase)
	{
		startPt = stopPt;
		stopPt = event->point;

		if (event->tid == UIEvent::BUTTON_2)
		{
			UpdateCam2But(camera);
		}
		else if (altBut3)
		{
			UpdateCamAlt3But(camera);			
		}
		else if (event->tid == UIEvent::BUTTON_3)
		{
			UpdateCam3But(camera);
		}
	}	
}
void WASDCameraController::Update(float32 timeElapsed)
{
    if (currScene == 0)
		return;
    UITextField *tf = dynamic_cast<UITextField *>(UIControlSystem::Instance()->GetFocusedControl());
	Camera * camera = currScene->GetCurrentCamera();

	if(camera != lastCamera)
	{
		lastCamera = camera;
		UpdateAngels(camera);
	}

	if(!tf && camera)
    {
        float32 moveSpeed = speed * timeElapsed;        

		if(!IsKeyModificatorsPressed())
        {
            bool moveUp = (InputSystem::Instance()->GetKeyboard()->IsKeyPressed(DVKEY_UP) | 
                           InputSystem::Instance()->GetKeyboard()->IsKeyPressed(DVKEY_W));
            if(moveUp)
            {
                Vector3 pos = camera->GetPosition();
                Vector3 direction = camera->GetDirection();
                //Logger::Debug("oldpos: %f %f %f olddir: %f %f %f", pos.x, pos.y, pos.z, direction.x, direction.y, direction.z);
                
                direction.Normalize();
                pos += direction * moveSpeed;
                camera->SetPosition(pos);
                camera->SetDirection(direction);    // right now required because camera rebuild direction to target, and if position & target is equal after set position it produce wrong results
                
                //Logger::Debug("newpos: %f %f %f", pos.x, pos.y, pos.z);
            }
 
            bool moveLeft = (InputSystem::Instance()->GetKeyboard()->IsKeyPressed(DVKEY_LEFT) | 
                           InputSystem::Instance()->GetKeyboard()->IsKeyPressed(DVKEY_A));
            if(moveLeft)
            {
                Vector3 pos = camera->GetPosition();
                Vector3 dir = camera->GetDirection();
                Vector3 left = camera->GetLeft();
                
                pos -= left * moveSpeed;
                camera->SetPosition(pos);
                camera->SetDirection(dir);
            }
            
            
            bool moveDown = (InputSystem::Instance()->GetKeyboard()->IsKeyPressed(DVKEY_DOWN) | 
                             InputSystem::Instance()->GetKeyboard()->IsKeyPressed(DVKEY_S));
            if(moveDown)
            {
                Vector3 pos = camera->GetPosition();
                Vector3 direction = camera->GetDirection();
                //Logger::Debug("oldpos: %f %f %f olddir: %f %f %f", pos.x, pos.y, pos.z, direction.x, direction.y, direction.z);
                
                pos -= direction * moveSpeed;
                camera->SetPosition(pos);
                camera->SetDirection(direction);    // right now required because camera rebuild direction to target, and if position & target is equal after set position it produce wrong results
                //Logger::Debug("newpos: %f %f %f olddir: %f %f %f", pos.x, pos.y, pos.z, direction.x, direction.y, direction.z);
            }

            
            bool moveRight = (InputSystem::Instance()->GetKeyboard()->IsKeyPressed(DVKEY_RIGHT) | 
                             InputSystem::Instance()->GetKeyboard()->IsKeyPressed(DVKEY_D));
            if(moveRight)
            {
                Vector3 pos = camera->GetPosition();
                Vector3 dir = camera->GetDirection();
                Vector3 left = camera->GetLeft();
                
                pos += left * moveSpeed;
                camera->SetPosition(pos);
                camera->SetDirection(dir);
            }
        }
    }
    
    CameraController::Update(timeElapsed);
}
bool EditorBodyControl::ProcessKeyboard(UIEvent *event)
{
    if (event->phase == UIEvent::PHASE_KEYCHAR)
    {
        UITextField *tf = dynamic_cast<UITextField *>(UIControlSystem::Instance()->GetFocusedControl());
        if(!tf)
        {
            modificationPanel->Input(event);
            
			if(!IsKeyModificatorsPressed())
			{
				Camera * newCamera = 0;
				switch(event->tid)
				{
				case DVKEY_ESCAPE:
					{
						UIControl *c = UIControlSystem::Instance()->GetFocusedControl();
						if(c == this || c == scene3dView)
						{
                        SceneData *activeScene = SceneDataManager::Instance()->SceneGetActive();
							activeScene->SelectNode(NULL);
						}

						break;
					}

				case DVKEY_C:
					newCamera = scene->GetCamera(2);
					break;

				case DVKEY_V:
					newCamera = scene->GetCamera(3);
					break;

				case DVKEY_B:
					newCamera = scene->GetCamera(4);
					break;

				case DVKEY_X:
					{
						bool Z = InputSystem::Instance()->GetKeyboard()->IsKeyPressed(DVKEY_Z);
						bool C = InputSystem::Instance()->GetKeyboard()->IsKeyPressed(DVKEY_C);
						if(!Z && !C)
						{
							ProcessIsSolidChanging();
						}

						break;
					}

				default:
					break;
				}

				if (newCamera)
				{
					scene->SetCurrentCamera(newCamera);
					scene->SetClipCamera(scene->GetCamera(0));
				}
			}
            else if(InputSystem::Instance()->GetKeyboard()->IsKeyPressed(DVKEY_CTRL) && (event->tid == DVKEY_BACKSPACE))
            {
                sceneGraph->RemoveWorkingNode();
                
                SceneData *activeScene = SceneDataManager::Instance()->SceneGetActive();
                activeScene->SelectNode(NULL);
                activeScene->RebuildSceneGraph();
            }
        }
	}
	
    return true;
}