Beispiel #1
0
void GuiManager::Initialize() {
    if(mGuiSystem == nullptr) {
        CameraComponent* c = DisplayManager::Get()->GetMainCamera();
        if(c == nullptr || c->GetCamera() == nullptr) {
            // cannot initialize, there is no camera, so there is no viewport
            Logger::Get().Error("Cannot initialize GUI System - no main camera set.");
            return;
        }
        Ogre::SceneManager* scene_mgr = c->GetCamera()->getSceneManager();

        mPlatform = new MyGUI::OgrePlatform();

        // Disable MyGUI output completely, Ogre will throw an exception if a
        // resource cannot be found
        MyGUI::LogManager::getInstance().setSTDOutputEnabled(false);

        mPlatform->initialise(DisplayManager::Get()->GetRenderWindow(), scene_mgr, Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);

        mGuiSystem = new MyGUI::Gui();
        mGuiSystem->initialise();

        EventManager::Get()->AddListener(this);

        // Show / hide the mouse cursor.
        SetMouseCursorVisible(mMouseCursorVisible);

        // Create the root widget.
        mRootGuiWindow.Create();
    }
}
Beispiel #2
0
Component* CameraComponent::Clone(Entity * toEntity)
{
    CameraComponent * newComponent = new CameraComponent();
	newComponent->SetEntity(toEntity);
    newComponent->camera = (Camera*)camera->Clone();

    return newComponent;
}
Beispiel #3
0
	CameraComponent* CameraComponent::create(
		const std::string& compName, ngn::GameObject& obj, const ngn::Properties& param,
		ISceneManager* smgr, IrrlichtComponentSystem* sys)
	{
		ICameraSceneNode* cameraNode = smgr->addCameraSceneNode();
		CameraComponent* camcom = new CameraComponent(compName, obj, cameraNode, sys);

		if (param.getBool("active", true) == false)
			camcom->setActive(false);

		return camcom;
	}
Beispiel #4
0
void ae3d::Renderer::RenderSkybox( const TextureCube* skyTexture, const CameraComponent& camera )
{
    Matrix44 modelViewProjection;
    Matrix44::Multiply( camera.GetView(), camera.GetProjection(), modelViewProjection );

    builtinShaders.skyboxShader.Use();
    builtinShaders.skyboxShader.SetMatrix( "_ModelViewProjection", modelViewProjection.m );
    builtinShaders.skyboxShader.SetTexture( "skyMap", skyTexture, 0 );

    GfxDevice::SetDepthFunc( GfxDevice::DepthFunc::LessOrEqualWriteOff );
    skyboxBuffer.Bind();
    skyboxBuffer.Draw();
}
Camera * GetCamera(Entity * fromEntity)
{
	if(NULL != fromEntity)
	{
		CameraComponent *component = static_cast<CameraComponent *>(fromEntity->GetComponent(Component::CAMERA_COMPONENT));
		if(component)
		{
			return component->GetCamera();
		}
	}
    
    return NULL;
}
Entity* CommonFactory::CreateCamera()
{
    Entity* camera = new Entity();
    TransformComponent* transformComponent = new TransformComponent();
    PhysicsComponent* physicsComponent = new PhysicsComponent();
    CameraComponent* cameraComponent = new CameraComponent();
    cameraComponent->UseCamera();
    
    camera->AddComponent(physicsComponent);
    camera->AddComponent(cameraComponent);
    camera->AddComponent(transformComponent);
    
    return camera;
}
    void CascadedShadowMapper::SetSunPositionDelegate(chimera::IEventPtr data)
    {
        std::shared_ptr<chimera::SetSunPositionEvent> e = std::static_pointer_cast<chimera::SetSunPositionEvent>(data);
        CameraComponent* cmp;
        m_lightActorCamera->VQueryComponent(CM_CMP_CAMERA, (IActorComponent**)&cmp);
        util::Vec3 newPos = e->m_position;
        newPos.Normalize();
        newPos.Scale(1000.0f);
        cmp->GetCamera()->LookAt(newPos, util::Vec3(0,0,0));
//         util::Vec3 f(0,0,0);
//         util::Vec3 u(0,1,0);
//         util::Mat4 m;
//         XMStoreFloat4x4(&m.m_m, XMMatrixLookAtLH(XMLoadFloat3(&newPos.m_v), XMLoadFloat3(&(f.m_v)), XMLoadFloat3(&u.m_v)));
    }
    CascadedShadowMapper::CascadedShadowMapper(UCHAR cascades) 
        : m_cascades(cascades), m_ppTargets(NULL), /*m_camera(1024, 1024, 0.01, 1000),*/ m_pCascadesSettings(NULL), m_ppBlurChain(NULL)
    {

        /*
#ifdef CSM_DEBUG
        for(USHORT i = 0; i < m_cascades; ++i)
        {
            m_cascadeCameraActor[i] = chimera::g_pApp->GetLogic()->VCreateActor("staticcamera.xml");
            std::stringstream ss;
            ss << "cascadeCam";
            ss << i;
            m_cascadeCameraActor[i]->SetName(ss.str());
        }
#endif
        */
        m_intensity = util::Vec3(1,1,1);

        m_ambient = util::Vec3(0.1f, 0.1f, 0.1f);

        std::unique_ptr<ActorDescription> desc = CmGetApp()->VGetLogic()->VGetActorFactory()->VCreateActorDescription();
        CameraComponent* cc = desc->AddComponent<CameraComponent>(CM_CMP_CAMERA);
        cc->SetCamera(std::shared_ptr<ICamera>(new util::FPSCamera(1,1,1e-2f,1e3)));
        TransformComponent* tc = desc->AddComponent<TransformComponent>(CM_CMP_TRANSFORM);

        m_lightActorCamera = CmGetApp()->VGetLogic()->VCreateActor(std::move(desc));

        //util::Vec3 lightPos(1.0f,1.3f,0.6f);
        util::Vec3 lightPos(1.0f, 0.2, 0);
        lightPos.Normalize();
        lightPos.Scale(util::Vec3(1000.0f, 1000.0f, 1000.0f));
        tc->GetTransformation()->SetTranslation(lightPos.x, lightPos.y, lightPos.z);
        cc->GetCamera()->MoveToPosition(tc->GetTransformation()->GetTranslation());
        m_lightActorCamera->SetName("cascadeLightCamera");

        /*
        m_viewActor = chimera::g_pApp->GetLogic()->VCreateActor("rendercamera.xml");
        m_viewActor->SetName("cascadeViewCamera");
        m_viewActor->GetComponent<chimera::TransformComponent>(chimera::TransformComponent::COMPONENT_ID).lock()->GetTransformation()->SetTranslate(0,5,-5);
        m_viewActor->GetComponent<chimera::CameraComponent>(chimera::CameraComponent::COMPONENT_ID).lock()->GetCamera()->MoveToPosition(
            m_viewActor->GetComponent<chimera::TransformComponent>(chimera::TransformComponent::COMPONENT_ID).lock()->GetTransformation()->GetTranslation());

        */
        ADD_EVENT_LISTENER(this, &CascadedShadowMapper::SetSunPositionDelegate, CM_EVENT_SET_SUN_POSITION);
        ADD_EVENT_LISTENER(this, &CascadedShadowMapper::SetSunIntensityDelegate, CM_EVENT_SET_SUN_INTENSITY);
        ADD_EVENT_LISTENER(this, &CascadedShadowMapper::SetSunAmbientDelegate, CM_EVENT_SET_SUN_AMBIENT);
    }
Beispiel #9
0
		void Scene::OnUpdate(const Timestep& ts)
		{
			CameraComponent* cc = nullptr;

			for (Object* object : m_Objects)
			{
				object->Update(ts);

				for (auto comp : object->GetComponents()) {
					Component* component = comp.second;
					if (StringEquals(component->GetType()->name, CameraComponent::GetStaticType()->name))
						cc = (CameraComponent*)component;
					else
						component->OnUpdate(ts);
				}
			}

			if (cc != nullptr) cc->OnUpdate(ts);

			m_Camera->OnUpdate(ts);
		}
void SceneManager::updateExclusiveScene()
{
	//auto go = m_activeList[m_exclusiveScene].first->getAllGameObjects();

	//for (size_t i = 0; i < go.size(); i++)
	//{
	//	Audio * audio = go[i]->getGameComponent<Audio>();
	//	if (audio != nullptr)
	//	{
	//		audio->pause();
	//	}
	//}

	for (size_t i = m_activeList.size() - 1; i >= 0; i--)
	{
		if (m_activeList[i].second == Modality::Exclusive)
		{
			m_exclusiveScene = i;
			break;
		}
	}

	auto go = m_activeList[m_exclusiveScene].first->getAllGameObjects();
	for (size_t i = 0; i < go.size(); i++)
	{
		CameraComponent* camera = go[i]->getGameComponent<CameraComponent>();
		if (camera != nullptr)
		{
			m_coreEngine->getPhysicsEngine()->setMainCamera(*camera->getCamera3D());
			m_coreEngine->getRenderingEngine()->setMainCamera(*camera->getCamera3D());
		}

		SkyboxRenderer* skybox = go[i]->getGameComponent<SkyboxRenderer>();
		if (skybox != nullptr)
		{
			m_coreEngine->getRenderingEngine()->setSkybox(*skybox->getSkybox());
		}
	}
}
Beispiel #11
0
void GuiManager::Initialize() {
    if(mGuiSystem == nullptr) {
        CameraComponent* c = DisplayManager::Get()->GetMainCamera();
        if(c == nullptr || c->GetCamera() == nullptr) {
            // cannot initialize, there is no camera, so there is no viewport
            Logger::Get().Error("Cannot initialize GUI System - no main camera set.");
            return;
        }
        Ogre::SceneManager* scene_mgr = c->GetCamera()->getSceneManager();

        mPlatform = new MyGUI::OgrePlatform();
        mPlatform->initialise(DisplayManager::Get()->GetRenderWindow(), scene_mgr, Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);

        mGuiSystem = new MyGUI::Gui();
        mGuiSystem->initialise();

        EventManager::Get()->AddListener(this);

        // show/hide mouse cursor
        SetMouseCursorVisible(mMouseCursorVisible);
    }
}
	void DrawAxis(bgfx::VertexBufferHandle vertexHandle_, bgfx::ProgramHandle programhandle_)
	{
		CameraComponent *pCamera = GameInfo::Instance().GetActiveCamera();
		Viewport &viewport = pCamera->GetViewport();

		Matrix4 matProj, matWorld;

		//matWorld.CreateRotationZ(0.5f * MATH_PI);
		//matWorld.CreateTranslation(0.0f, 0.0f, -1.0f);
		//matWorld.CreateScale(1.0f / (float)CA_DEFAULT_WIDTH, 1.0f / (float)CA_DEFAULT_HEIGHT, 1.0f);
		//matWorld.CreateScale(0.989f, 1.0f, 1.0f);
		Vector3F scale(0.989f, 1.0f, 1.0f);
		Quaternion rot;
		rot.FromAxisAngle(Vector3F::UnitZ(), 0.5f * MATH_PI);
		matWorld.Transformation(
			nullptr, nullptr, 
			&scale,
			nullptr, 
			&rot, //rotation
			nullptr);


		matProj.OrthoOffCenter(
			static_cast<float>(viewport.X() * CA_DEFAULT_WIDTH), // TODO get screen size
			static_cast<float>(viewport.Y() * CA_DEFAULT_HEIGHT), 
			static_cast<float>(viewport.Width() * CA_DEFAULT_WIDTH), 
			static_cast<float>(viewport.Height() * CA_DEFAULT_HEIGHT),
			0.0f, 1000.0f);

		bgfx::setViewTransform(1, NULL, matProj);
		//bgfx::setViewTransform(1, pCamera->GetViewMatrix(), pCamera->GetProjectionMatrix());

		bgfx::setViewRect(1, 0, 0, Game::Instance()->GetWindow()->getSize().x, Game::Instance()->GetWindow()->getSize().y);
		bgfx::setTransform(matWorld);

		bgfx::setVertexBuffer(vertexHandle_);
		bgfx::setState(BGFX_STATE_RGB_WRITE	| BGFX_STATE_MSAA | BGFX_STATE_PT_LINES);
		bgfx::submit(1, programhandle_);
	}
Beispiel #13
0
void GuiManager::Initialize() {
    if(mGuiSystem == nullptr) {
        CameraComponent* c = DisplayManager::Get()->GetMainCamera();
        if(c == nullptr || c->GetCamera() == nullptr) {
            // cannot initialize, there is no camera, so there is no viewport
            Logger::Get().Error("Cannot initialize GUI System - no main camera set.");
            return;
        }
        InputManager* inputMgrPtr = InputManager::Get();
        QObject::connect(inputMgrPtr, SIGNAL(sKeyPressed(const OIS::KeyEvent&)), this, SLOT(sKeyPressed(const OIS::KeyEvent&)));
        QObject::connect(inputMgrPtr, SIGNAL(sKeyReleased(const OIS::KeyEvent&)), this, SLOT(sKeyReleased(const OIS::KeyEvent&)));
        QObject::connect(inputMgrPtr, SIGNAL(sMouseMoved(const OIS::MouseEvent&)), this, SLOT(sMouseMoved(const OIS::MouseEvent&)));
        QObject::connect(inputMgrPtr, SIGNAL(sMousePressed(const OIS::MouseEvent&, OIS::MouseButtonID)),
                this, SLOT(sMousePressed(const OIS::MouseEvent&, OIS::MouseButtonID)));
        QObject::connect(inputMgrPtr, SIGNAL(sMouseReleased(const OIS::MouseEvent&, OIS::MouseButtonID)),
                this, SLOT(sMouseReleased(const OIS::MouseEvent&, OIS::MouseButtonID)));
        Ogre::SceneManager* scene_mgr = c->GetCamera()->getSceneManager();

        mPlatform = new MyGUI::OgrePlatform();

        // Disable MyGUI output completely, Ogre will throw an exception if a
        // resource cannot be found
        MyGUI::LogManager::getInstance().setSTDOutputEnabled(false);

        mPlatform->initialise(DisplayManager::Get()->GetRenderWindow(), scene_mgr, Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);

        mGuiSystem = new MyGUI::Gui();
        mGuiSystem->initialise();

//        EventManager::Get()->AddListener(this);

        // Show / hide the mouse cursor.
        SetMouseCursorVisible(mMouseCursorVisible);

        // Initialize the root widget.
        mRootGuiWindow.Initialize();
    }
    void CascadedShadowMapper::VRender(ISceneGraph* graph)
    {

        IRenderer* renderer = CmGetApp()->VGetHumanView()->VGetRenderer();
        IDeviceTexture* vn[4];
        for(UCHAR i = 0; i < m_cascades + 1; ++i)
        {
            vn[i] = NULL;
        }
        renderer->VSetTextures(eEffect0, (vn+1), m_cascades);

        ICamera* playerView = graph->VGetCamera().get();

        Frustum cascadeFrusta;
        Frustum ortographicFrusta;

        CameraComponent* lcc = GetActorCompnent<CameraComponent>(m_lightActorCamera, CM_CMP_CAMERA);

        //std::shared_ptr<chimera::CameraComponent> vcc = m_viewActor->GetComponent<chimera::CameraComponent>(chimera::CameraComponent::COMPONENT_ID).lock();
        
        renderer->VPushViewTransform(lcc->GetCamera()->GetView(), lcc->GetCamera()->GetIView(), lcc->GetCamera()->GetEyePos(), lcc->GetCamera()->GetViewDir());

        ICamera* lightCamera = lcc->GetCamera().get();
        //util::ICamera* viewCamera = vcc->GetCamera().get();
        ICamera* viewCamera = playerView;

        //util::Mat4 viewToLight = util::Mat4::Mul(lightCamera->GetView(), viewCamera->GetIView());//vcc->GetCamera()->GetIView());

        float distances[3];

        for(UCHAR ci = 0; ci < m_cascades; ++ci)
        {
            CascadeSettings& settings = m_pCascadesSettings[ci];
            
            /*util::StaticCamera* staticCam;
            staticCam = (util::StaticCamera*)(m_cascadeCameraActor[ci]->GetComponent<chimera::CameraComponent>(chimera::CameraComponent::COMPONENT_ID).lock()->GetCamera().get());*/

            float farr = settings.end;
            float nnear = settings.start;
 
            cascadeFrusta.CreatePerspective(viewCamera->GetAspect(), viewCamera->GetFoV(), nnear, farr);

            util::Vec3 vmin(FLT_MAX, FLT_MAX, FLT_MAX);
            util::Vec3 vmax(FLT_MIN, FLT_MIN, FLT_MIN);
            util::Vec3 vFrustumPoints[8];
            util::Vec3 vecs[8];

            for(uint i = 0; i < 8; ++i)
            {
                util::Vec3 v = util::Mat4::Transform(viewCamera->GetIView(), cascadeFrusta.GetPoints()[i]);

                vFrustumPoints[i] = v;

                util::Vec3 pos = util::Mat4::Transform(lightCamera->GetView(), v);

                vmax = util::Vec3::Max(vmax, pos);
                vmin = util::Vec3::Min(vmin, pos);
            }

            /*FLOAT bound = (farr - nnear) / 1024.0f;

            util::Vec3 fmin((INT)vmin.x / bound, (INT)vmin.y / bound, (INT)vmin.y / bound);
            fmin.Scale(bound);
            vmin = fmin;

            util::Vec3 fmax((INT)(vmax.x / bound), (INT)(vmax.y / bound), (INT)(vmax.y / bound));
            fmax.Scale(bound);
            vmax = fmax; */

            /*vmax = util::Mat4::Transform(lightCamera->GetIView(), vmax);
            vmin = util::Mat4::Transform(lightCamera->GetIView(), vmin); */
            /*util::Vec3 vDiagonal = vFrustumPoints[tbd::rightUpNear] - vFrustumPoints[tbd::leftDownFar];
            FLOAT l = vDiagonal.Length();
            vDiagonal.Set(l, l, l);
            // The offset calculated will pad the ortho projection so that it is always the same size 
            // and big enough to cover the entire cascade interval.
            util::Vec3 diff = vmax - vmin;
            util::Vec3 vBoarderOffset = vDiagonal - diff;
            vBoarderOffset.Scale(0.5f);

            vBoarderOffset.z = 0;
            // Add the offsets to the projection.
            vmax = vmax + vBoarderOffset;
            vmin = vmin - vBoarderOffset; */
            
            float n = min(-120, vmin.z); //todo
            float ff = vmax.z;

            distances[ci] = ff - n;

            XMMATRIX mat = XMMatrixOrthographicOffCenterLH(vmin.x, vmax.x, vmin.y, vmax.y, n, ff);

            XMStoreFloat4x4(&settings.m_projection.m_m, mat);

            /*
            util::StaticCamera staticCam(1,1,1,1);
#ifdef CSM_DEBUG
            staticCam.SetOrthographicProjectionOffCenter(vmin.x, vmax.x, vmin.y, vmax.y, n, ff);
            staticCam.SetView(lightCamera->GetView(), lightCamera->GetIView());
            ortographicFrusta = staticCam.GetFrustum();
#endif*/
            ortographicFrusta.CreateOrthographicOffCenter(vmin.x, vmax.x, vmin.y, vmax.y, n, ff);
            ortographicFrusta.Transform(lightCamera->GetIView());
   
            renderer->VPushProjectionTransform(settings.m_projection, ff - n, 1);

            m_ppTargets[ci]->VClear();
            m_ppTargets[ci]->VBind();

            graph->VPushFrustum(&ortographicFrusta);
            m_pProgram->VBind();
            graph->VOnRender(CM_RENDERPATH_SHADOWMAP);

            m_pProgramInstanced->VBind();
            graph->VOnRender(CM_RENDERPATH_SHADOWMAP_INSTANCED);

            /*m_pProgramInstanced->VBind();
            graph->VOnRender(eRenderPath_DrawToShadowMapInstanced);*/
            graph->VPopFrustum();

            renderer->VPopProjectionTransform();

            m_ppBlurChain[ci]->VProcess();

         //   d3d::GetContext()->GenerateMips(m_ppBlurredTargets[ci]->GetShaderRessourceView());
        }

        renderer->VPopViewTransform();
        CmGetApp()->VGetHumanView()->VGetRenderer()->VGetCurrentRenderTarget()->VBind();

        IDeviceTexture* v[3];
        for(UCHAR i = 0; i < m_cascades; ++i)
        {
            v[i] = m_ppBlurredTargets[i]->VGetTexture();
        }
        renderer->VSetTextures(eEffect0, v, m_cascades);

        //ID3D11ShaderResourceView* debugView = m_ppBlurredTargets[0]->GetShaderRessourceView();
        //d3d::GetContext()->PSSetShaderResources(d3d::eEffect3, 1, &debugView); //debugging samplers
        
        util::Mat4 mats[3]; //TODO
        //FLOAT distances[3];
        for(UCHAR i = 0; i < m_cascades; ++i)
        {
            mats[i] = m_pCascadesSettings[i].m_projection;
        }

        IConstShaderBuffer* lb = renderer->VGetConstShaderBuffer(eEnvLightingBuffer);
        _LightingBuffer* _lb = (_LightingBuffer*)lb->VMap();
        _lb->m_view = lightCamera->GetView().m_m;
        _lb->m_iView = lightCamera->GetIView().m_m;
        _lb->m_projection[0] = mats[0].m_m;
        _lb->m_projection[1] = mats[1].m_m;
        _lb->m_projection[2] = mats[2].m_m;
        _lb->m_lightPos.x = lcc->GetCamera()->GetEyePos().x;
        _lb->m_lightPos.y = lcc->GetCamera()->GetEyePos().y;
        _lb->m_lightPos.z = lcc->GetCamera()->GetEyePos().z;
        _lb->m_intensity.x = m_intensity.x;
        _lb->m_intensity.y = m_intensity.y;
        _lb->m_intensity.z = m_intensity.z;
        _lb->m_ambient.x = m_ambient.x;
        _lb->m_ambient.y = m_ambient.y;
        _lb->m_ambient.z = m_ambient.z;
        _lb->m_distances.x = distances[0];
        _lb->m_distances.y = distances[1];
        _lb->m_distances.z = distances[2];
        lb->VUnmap();
       // renderer->SetCSMSettings(lightCamera->GetView(), lightCamera->GetIView(), mats, lcc->GetCamera()->GetEyePos(), distances);
    }
    bool InitializeCameraComponent(IActorComponent* cmp, ICMStream* stream)
    {
        CameraComponent* cameraCmp = (CameraComponent*)cmp;
        tinyxml2::XMLElement* pData = (tinyxml2::XMLElement*)stream;

        tinyxml2::XMLElement* settings = pData->FirstChildElement("Settings");
        if(settings)
        {
            float fov, aspect, viewDir, n, f;
        
            RETURN_IF_FAILED(tinyxml2::XML_NO_ATTRIBUTE != settings->QueryFloatAttribute("fov", &fov));
            RETURN_IF_FAILED(tinyxml2::XML_NO_ATTRIBUTE != settings->QueryFloatAttribute("aspect", &aspect));
            RETURN_IF_FAILED(tinyxml2::XML_NO_ATTRIBUTE != settings->QueryFloatAttribute("viewAxis", &viewDir));
            RETURN_IF_FAILED(tinyxml2::XML_NO_ATTRIBUTE != settings->QueryFloatAttribute("far", &f));
            RETURN_IF_FAILED(tinyxml2::XML_NO_ATTRIBUTE != settings->QueryFloatAttribute("near", &n));
        
            //TODO: do we have to keep it?
            tinyxml2::XMLElement* type = pData->FirstChildElement("Type");

            if(type)
            {
                cameraCmp->m_type = type->GetText();
            }
            else
            {
                cameraCmp->m_type = std::string("FreeLook");
            }

            if(cameraCmp->m_type == std::string("FPSCharacter"))
            {
                cameraCmp->m_camera = std::shared_ptr<util::FPSCamera>(new util::CharacterCamera(
                    chimera::CmGetApp()->VGetHumanView()->VGetRenderer()->VGetWidth(), 
                    chimera::CmGetApp()->VGetHumanView()->VGetRenderer()->VGetHeight(), 
                    (float)n, 
                    (float)f)
                    );
            }
            else if(cameraCmp->m_type == std::string("FPSShakeCharacter"))
            {
                cameraCmp->m_camera = std::shared_ptr<util::FPSCamera>(new util::CharacterHeadShake(
                    chimera::CmGetApp()->VGetHumanView()->VGetRenderer()->VGetWidth(), 
                    chimera::CmGetApp()->VGetHumanView()->VGetRenderer()->VGetHeight(), 
                    (float)n, 
                    (float)f)
                    ); 
            }
            else if(cameraCmp->m_type == "FPSStatic")
            {
                cameraCmp->m_camera = std::shared_ptr<util::StaticCamera>(new util::StaticCamera(
                    chimera::CmGetApp()->VGetHumanView()->VGetRenderer()->VGetWidth(), 
                    chimera::CmGetApp()->VGetHumanView()->VGetRenderer()->VGetHeight(), 
                    (float)n, 
                    (float)f)
                    ); 
            }
            else
            {
                LOG_CRITICAL_ERROR("FPS Camera is bugged"); //use FPSCharacter

            }
            cameraCmp->m_camera->SetFoV(DEGREE_TO_RAD(fov));

            tinyxml2::XMLElement* activate = pData->FirstChildElement("Activate");

            if(activate)
            {
                CmGetApp()->VGetHumanView()->VSetTarget(cameraCmp->VGetActor());
            }

            return true;
        }

        return false;
    }
  GRAPHICSDLL_API void CameraController::Update(float dt)
  {
    Input* input = (Input*)Engine::GetCore()->GetSystem(ST_Input);
    InputHandler* handler = input->GetHandler();

    
    if (handler->Check("Rotate"))
    {
      if(last_mouse_pos_ == Vector2i(-1, -1))
      {
        last_mouse_pos_ = handler->GetMousePos();
      }
      else if(handler->GetMousePos() != last_mouse_pos_)
      {
        Vector2i curPos = handler->GetMousePos();
        Vector2 amountToRotate = (curPos - last_mouse_pos_).to_f() * dt;
        CameraComponent* cameraComp = (CameraComponent*)GetSibling(CT_CameraComponent);
        Vector3 lookAt = cameraComp->GetLookAt();
        Transform* tr = (Transform*)GetSibling(CT_Transform);
        Vector3 view = lookAt - tr->GetPosition();
        view.Normalize();
        
        
        view = RotateAround(Vector3(0, 1, 0), amountToRotate.x, view);
        view.Normalize();
        Vector3 right = Vector3(0,1,0).Cross(view);
        right.Normalize();
        view = RotateAround(right, amountToRotate.y, view);

        
        lookAt = (tr->GetPosition() + view);


        cameraComp->SetLookAt(lookAt);
        last_mouse_pos_ = Vector2i(-1, -1);
      }
    }
    else if(handler->Check("Move"))
    {
      if (last_mouse_pos_ == Vector2i(-1, -1))
      {
        last_mouse_pos_ = handler->GetMousePos();
      }
      else if (handler->GetMousePos() != last_mouse_pos_)
      {
        Vector2i curPos = handler->GetMousePos();
        Vector2 amountToMove = (curPos - last_mouse_pos_).to_f() * dt;
        CameraComponent* cameraComp = (CameraComponent*)GetSibling(CT_CameraComponent);
        Vector3 lookAt = cameraComp->GetLookAt();
        Transform* tr = (Transform*)GetSibling(CT_Transform);

        Vector3 view = lookAt - tr->GetPosition();
        view.Normalize();
        Vector3 right = Vector3(0.0f,1.0f,0.0f).Cross(view);
        right.Normalize();
        Vector3 up = view.Cross(right);
        up.Normalize();

        Vector3 pos = tr->GetPosition();
        amountToMove *= 5.0f;
        pos += right * -amountToMove.x;
        pos += up * amountToMove.y;

        lookAt += right * -amountToMove.x;
        lookAt += up * amountToMove.y;
        tr->SetPosition(pos);
        cameraComp->SetLookAt(lookAt);

        last_mouse_pos_ = Vector2i(-1, -1);
      }
    }
    else if (handler->Check("ZoomIn"))
    {
      CameraComponent* cameraComp = (CameraComponent*)GetSibling(CT_CameraComponent);
      Vector3 lookAt = cameraComp->GetLookAt();
      Transform* tr = (Transform*)GetSibling(CT_Transform);
      Vector3 view = lookAt - tr->GetPosition();
      view.Normalize();
      view *= dt;
      tr->SetPosition(tr->GetPosition() += view );
      cameraComp->SetLookAt(lookAt += view );
      
    }
    else if (handler->Check("ZoomOut"))
    {
      CameraComponent* cameraComp = (CameraComponent*)GetSibling(CT_CameraComponent);
      Vector3 lookAt = cameraComp->GetLookAt();
      Transform* tr = (Transform*)GetSibling(CT_Transform);
      Vector3 view = lookAt - tr->GetPosition();
      view.Normalize();
      view *= dt;
      tr->SetPosition(tr->GetPosition() -= view);
      cameraComp->SetLookAt(lookAt -= view);

    }
    else if (handler->GetScrollPos())
    {
      CameraComponent* cameraComp = (CameraComponent*)GetSibling(CT_CameraComponent);
      Vector3 lookAt = cameraComp->GetLookAt();
      Transform* tr = (Transform*)GetSibling(CT_Transform);
      Vector3 view = lookAt - tr->GetPosition();
      view.Normalize();
      view *= dt;
      tr->SetPosition(tr->GetPosition() + view * (float)handler->GetScrollPos());
      cameraComp->SetLookAt(lookAt + view * (float)handler->GetScrollPos());

    }
    else
    {
      last_mouse_pos_ = Vector2i(-1, -1);
    }

    
  }
    bool CascadedShadowMapper::VOnRestore(void)
    {
        uint startSize = CmGetApp()->VGetConfig()->VGetInteger("iCSMSize");

        if(!m_ppTargets)
        {
            m_ppTargets = new IRenderTarget*[m_cascades];
            m_ppBlurredTargets = new IRenderTarget*[m_cascades];
            m_ppBlurChain = new IEffectChain*[m_cascades];

            for(UCHAR i = 0; i < m_cascades; ++i)
            {
                m_ppTargets[i] = CmGetApp()->VGetHumanView()->VGetGraphicsFactory()->VCreateRenderTarget().release();
                m_ppBlurredTargets[i] = CmGetApp()->VGetHumanView()->VGetGraphicsFactory()->VCreateRenderTarget().release();

                uint dim = startSize / (1 << i);

                m_ppBlurChain[i] = CmGetApp()->VGetHumanView()->VGetEffectFactory()->VCreateEffectChain();

                CMShaderDescription desc;
                desc.file = L"Effects.hlsl";
                desc.function = "VSMBlurH";
                IEffect* e0 = m_ppBlurChain[i]->VAppendEffect(desc);
                e0->VAddSource(m_ppTargets[i]);

                desc.function = "VSMBlurV";
                IEffect* e1 = m_ppBlurChain[i]->VAppendEffect(desc);
                //e1->VAddRequirement(e0);
                e1->VSetTarget(m_ppBlurredTargets[i]);

                m_ppBlurChain[i]->VOnRestore(dim, dim);
            }
        }

        SAFE_ARRAY_DELETE(m_pCascadesSettings);

        m_pCascadesSettings = new CascadeSettings[m_cascades];

        float f = 1000;
        
        float factor = 3.5;
        float l = 0;
        for(UCHAR i = 0; i < m_cascades; ++i)
        {
            l += (float)pow(factor, i);
        }
        float t = 1.0f / l;
        float sum = 0;

        float lastZ = 0;

        for(UCHAR i = 1; i <= m_cascades; ++i)
        {
            uint dim = startSize / (1 << (i-1));
            m_ppTargets[i - 1]->VSetClearColor(1000, 1000, 1000, 1000);
            //m_ppTargets[i - 1]->SetMiscflags(D3D11_RESOURCE_MISC_GENERATE_MIPS);
            m_ppTargets[i - 1]->VOnRestore(dim, dim, eFormat_R32G32_FLOAT);

            m_pCascadesSettings[i - 1].start = -10;
            sum += pow(factor, (i-1)) * t;
            m_pCascadesSettings[i - 1].end = 14;

            m_ppBlurChain[i - 1]->VOnRestore(dim, dim);
        }

        float cuttOffset = 0;

        m_pCascadesSettings[0].start = 0;//-cuttOffset;
        m_pCascadesSettings[0].end = 16;

        m_pCascadesSettings[1].start = m_pCascadesSettings[0].end - cuttOffset;
        m_pCascadesSettings[1].end = 55;

        m_pCascadesSettings[2].start = m_pCascadesSettings[1].end - cuttOffset;
        m_pCascadesSettings[2].end = 500;

        /*m_cascadesSettings[3].start = 256;
        m_cascadesSettings[3].end = 1000; */
        CMShaderProgramDescription desc;

        desc.vs.file = L"CascadedShadowMap.hlsl";
        desc.vs.function = "CSM_VS";
        desc.vs.layoutCount = 3;
        desc.vs.inputLayout[0].name = "POSITION";
        desc.vs.inputLayout[0].format = eFormat_R32G32B32_FLOAT;
        desc.vs.inputLayout[0].instanced = false;
        desc.vs.inputLayout[0].slot = 0;
        desc.vs.inputLayout[0].position = 0;

        desc.vs.inputLayout[1].format = eFormat_R32G32B32_FLOAT;
        desc.vs.inputLayout[1].name = "NORMAL";
        desc.vs.inputLayout[1].instanced = false;
        desc.vs.inputLayout[1].slot = 0;
        desc.vs.inputLayout[1].position = 1;

        desc.vs.inputLayout[2].name = "TEXCOORD";
        desc.vs.inputLayout[2].format = eFormat_R32G32_FLOAT;
        desc.vs.inputLayout[2].instanced = false;
        desc.vs.inputLayout[2].slot = 0;
        desc.vs.inputLayout[2].position = 2;

        desc.fs.file = desc.vs.file;
        desc.fs.function = "CSM_PS";

        m_pProgram = CmGetApp()->VGetHumanView()->VGetRenderer()->VGetShaderCache()->VCreateShaderProgram("CSM", &desc);

        desc.vs.file = L"CascadedShadowMap.hlsl";
        desc.vs.function = "CSM_Instanced_VS";

        desc.vs.layoutCount = 4;

        desc.vs.inputLayout[0].instanced = false;
        desc.vs.inputLayout[0].name = "POSITION";
        desc.vs.inputLayout[0].position = 0;
        desc.vs.inputLayout[0].slot = 0;
        desc.vs.inputLayout[0].format = eFormat_R32G32B32_FLOAT;

        desc.vs.inputLayout[1].instanced = false;
        desc.vs.inputLayout[1].name = "NORMAL";
        desc.vs.inputLayout[1].position = 1;
        desc.vs.inputLayout[1].slot = 0;
        desc.vs.inputLayout[1].format = eFormat_R32G32B32_FLOAT;

        desc.vs.inputLayout[2].instanced = false;
        desc.vs.inputLayout[2].name = "TEXCOORD";
        desc.vs.inputLayout[2].position = 2;
        desc.vs.inputLayout[2].slot = 0;
        desc.vs.inputLayout[2].format = eFormat_R32G32_FLOAT;

        desc.vs.inputLayout[3].instanced = true;
        desc.vs.inputLayout[3].name = "TANGENT";
        desc.vs.inputLayout[3].position = 3;
        desc.vs.inputLayout[3].slot = 1;
        desc.vs.inputLayout[3].format = eFormat_R32G32B32_FLOAT;

        m_pProgramInstanced = CmGetApp()->VGetHumanView()->VGetRenderer()->VGetShaderCache()->VCreateShaderProgram("CSM_Instanced", &desc);

        util::Vec3 eyePos;
        eyePos = GetActorCompnent<TransformComponent>(m_lightActorCamera, CM_CMP_TRANSFORM)->GetTransformation()->GetTranslation();
        //m_camera.LookAt(eyePos, util::Vec3(0,0,0));

        CameraComponent* cc = GetActorCompnent<CameraComponent>(m_lightActorCamera, CM_CMP_CAMERA);
        cc->GetCamera()->LookAt(eyePos, util::Vec3(0,0,0));

        //m_camera.MoveToPosition(eyePos);
        //m_camera.Rotate(0, 0.785f);
        //m_camera.Rotate(0, XM_PIDIV2);
        //m_camera.GetView().Print();
        return true;
    }
void DebugRenderSystem::Process()
{
    uint32 size = entities.size();
	for(uint32 i = 0; i < size; ++i)
	{
        Entity * entity = entities[i];
        
        DebugRenderComponent * debugRenderComponent = cast_if_equal<DebugRenderComponent*>(entity->GetComponent(Component::DEBUG_RENDER_COMPONENT));
        TransformComponent * transformComponent = cast_if_equal<TransformComponent*>(entity->GetComponent(Component::TRANSFORM_COMPONENT));
        //RenderComponent * renderComponent = cast_if_equal<RenderComponent*>(entity->GetComponent(Component::RENDER_COMPONENT));
        
        Matrix4 worldTransform = /*(*transformComponent->GetWorldTransform()) * */camera->GetMatrix();
        RenderManager::Instance()->SetMatrix(RenderManager::MATRIX_MODELVIEW, camera->GetMatrix());

        AABBox3 debugBoundigBox = entity->GetWTMaximumBoundingBoxSlow();
        uint32 debugFlags = debugRenderComponent->GetDebugFlags();

		// Camera debug draw
		if(debugFlags & DebugRenderComponent::DEBUG_DRAW_CAMERA)
		{
			CameraComponent * entityCameraComp = (CameraComponent *) entity->GetComponent(Component::CAMERA_COMPONENT);

			if(NULL != entityCameraComp)
			{
				Camera* entityCamera = entityCameraComp->GetCamera();
				if(NULL != entityCamera && camera != entityCamera)
				{
					Color camColor(0.0f, 1.0f, 0.0f, 1.0f);
					Vector3 camPos = entityCamera->GetPosition();
					//Vector3 camDirect = entityCamera->GetDirection();
					AABBox3 camBox(camPos, 2.5f);

					// If this is clip camera - show it as red camera
					if (entityCamera == entity->GetScene()->GetClipCamera()) camColor = Color(1.0f, 0.0f, 0.0f, 1.0f);

					RenderManager::Instance()->SetRenderEffect(RenderManager::FLAT_COLOR);
					RenderManager::Instance()->SetState(RenderState::STATE_COLORMASK_ALL | RenderState::STATE_DEPTH_WRITE);
					RenderManager::Instance()->SetColor(camColor);

					RenderHelper::Instance()->DrawBox(camBox, 2.5f);

					RenderManager::Instance()->SetState(RenderState::DEFAULT_3D_STATE);
					RenderManager::Instance()->ResetColor();

					debugBoundigBox = camBox;
				}
			}
		}

		// UserNode debug draw
		if(debugFlags & DebugRenderComponent::DEBUG_DRAW_USERNODE)
		{
			if(NULL != entity->GetComponent(Component::USER_COMPONENT))
			{
				Color dcColor(0.0f, 0.0f, 1.0f, 1.0f);
				AABBox3 dcBox(Vector3(), 1.0f);

				Matrix4 prevMatrix = RenderManager::Instance()->GetMatrix(RenderManager::MATRIX_MODELVIEW);
				Matrix4 finalMatrix = transformComponent->GetWorldTransform() * prevMatrix;
				RenderManager::Instance()->SetMatrix(RenderManager::MATRIX_MODELVIEW, finalMatrix);

				RenderManager::Instance()->SetRenderEffect(RenderManager::FLAT_COLOR);
				RenderManager::Instance()->SetState(RenderState::STATE_COLORMASK_ALL | RenderState::STATE_DEPTH_WRITE | RenderState::STATE_DEPTH_TEST);

				RenderManager::Instance()->SetColor(1.f, 1.f, 0, 1.0f);
				RenderHelper::Instance()->DrawLine(Vector3(0, 0, 0), Vector3(1.f, 0, 0));
				RenderManager::Instance()->SetColor(1.f, 0, 1.f, 1.0f);
				RenderHelper::Instance()->DrawLine(Vector3(0, 0, 0), Vector3(0, 1.f, 0));
				RenderManager::Instance()->SetColor(0, 1.f, 1.f, 1.0f);
				RenderHelper::Instance()->DrawLine(Vector3(0, 0, 0), Vector3(0, 0, 1.f));

				RenderManager::Instance()->SetColor(dcColor);
				RenderHelper::Instance()->DrawBox(dcBox);

				RenderManager::Instance()->SetState(RenderState::DEFAULT_3D_STATE);
				RenderManager::Instance()->ResetColor();
				RenderManager::Instance()->SetMatrix(RenderManager::MATRIX_MODELVIEW, prevMatrix);

				dcBox.GetTransformedBox(transformComponent->GetWorldTransform(), debugBoundigBox);
			}
		}

		// LightNode debug draw
		if (debugFlags & DebugRenderComponent::DEBUG_DRAW_LIGHT_NODE)
		{
			LightComponent *lightComp = (LightComponent *) entity->GetComponent(Component::LIGHT_COMPONENT);

			if(NULL != lightComp)
			{
				Light* light = lightComp->GetLightObject();

				if(NULL != light)
				{
					Vector3 lPosition = light->GetPosition();

					RenderManager::Instance()->SetRenderEffect(RenderManager::FLAT_COLOR);
					RenderManager::Instance()->SetState(RenderState::STATE_COLORMASK_ALL | RenderState::STATE_DEPTH_WRITE);
					RenderManager::Instance()->SetColor(1.0f, 1.0f, 0.0f, 1.0f);

					switch (light->GetType())
					{
					case Light::TYPE_DIRECTIONAL:
						{
							Vector3 lDirection = light->GetDirection();

							RenderHelper::Instance()->DrawArrow(lPosition, lPosition + lDirection * 10, 2.5f);
							RenderHelper::Instance()->DrawBox(AABBox3(lPosition, 0.5f), 1.5f);

							debugBoundigBox = AABBox3(lPosition, 2.5f);
						}
						break;
					default:
						{
							AABBox3 lightBox(lPosition, 2.5f);
							RenderHelper::Instance()->DrawBox(lightBox, 2.5f);

							debugBoundigBox = lightBox;
						}
						break;
					}

					RenderManager::Instance()->SetState(RenderState::DEFAULT_3D_STATE);
					RenderManager::Instance()->ResetColor();
				}
			}
		}
        
        if ((debugFlags & DebugRenderComponent::DEBUG_DRAW_AABOX_CORNERS))
        {            
            RenderManager::Instance()->SetRenderEffect(RenderManager::FLAT_COLOR);
            RenderManager::Instance()->SetState(RenderState::STATE_COLORMASK_ALL | RenderState::STATE_DEPTH_WRITE | RenderState::STATE_DEPTH_TEST);
            RenderManager::Instance()->SetColor(1.0f, 1.0f, 1.0f, 1.0f);
            RenderHelper::Instance()->DrawCornerBox(debugBoundigBox, 1.5f);
            RenderManager::Instance()->SetState(RenderState::DEFAULT_3D_STATE);
            RenderManager::Instance()->SetColor(1.0f, 1.0f, 1.0f, 1.0f);
            //		RenderManager::Instance()->SetMatrix(RenderManager::MATRIX_MODELVIEW, prevMatrix);
        }
        
        if (debugFlags & DebugRenderComponent::DEBUG_DRAW_RED_AABBOX)
        {
            RenderManager::Instance()->SetRenderEffect(RenderManager::FLAT_COLOR);
            RenderManager::Instance()->SetState(RenderState::STATE_COLORMASK_ALL | RenderState::STATE_DEPTH_WRITE);
            RenderManager::Instance()->SetColor(1.0f, 0.0f, 0.0f, 1.0f);
            RenderHelper::Instance()->DrawBox(debugBoundigBox, 1.5f);
            RenderManager::Instance()->SetState(RenderState::DEFAULT_3D_STATE);
            RenderManager::Instance()->SetColor(1.0f, 1.0f, 1.0f, 1.0f);
        }
        

        // UserNode Draw
#if 0
       	
        if (debugFlags & DEBUG_DRAW_USERNODE)
        {
            Matrix4 prevMatrix = RenderManager::Instance()->GetMatrix(RenderManager::MATRIX_MODELVIEW);
            Matrix4 finalMatrix = worldTransform * prevMatrix;
            RenderManager::Instance()->SetMatrix(RenderManager::MATRIX_MODELVIEW, finalMatrix);
            
            RenderManager::Instance()->SetRenderEffect(RenderManager::FLAT_COLOR);
            RenderManager::Instance()->SetState(RenderStateBlock::STATE_COLORMASK_ALL | RenderStateBlock::STATE_DEPTH_WRITE | RenderStateBlock::STATE_DEPTH_TEST);
            RenderManager::Instance()->SetColor(0, 0, 1.0f, 1.0f);
            RenderHelper::Instance()->DrawBox(drawBox);
            RenderManager::Instance()->SetColor(1.f, 1.f, 0, 1.0f);
            RenderHelper::Instance()->DrawLine(Vector3(0, 0, 0), Vector3(1.f, 0, 0));
            RenderManager::Instance()->SetColor(1.f, 0, 1.f, 1.0f);
            RenderHelper::Instance()->DrawLine(Vector3(0, 0, 0), Vector3(0, 1.f, 0));
            RenderManager::Instance()->SetColor(0, 1.f, 1.f, 1.0f);
            RenderHelper::Instance()->DrawLine(Vector3(0, 0, 0), Vector3(0, 0, 1.f));
            RenderManager::Instance()->SetState(RenderStateBlock::DEFAULT_3D_STATE);
            RenderManager::Instance()->SetColor(1.0f, 1.0f, 1.0f, 1.0f);
            RenderManager::Instance()->SetMatrix(RenderManager::MATRIX_MODELVIEW, prevMatrix);
        }
#endif
        
#if 0
        // ParticleEffectNode
        if (debugFlags != DEBUG_DRAW_NONE)
        {
            if (!(flags & SceneNode::NODE_VISIBLE))return;
            
            RenderManager::Instance()->SetRenderEffect(RenderManager::FLAT_COLOR);
            RenderManager::Instance()->SetState(RenderStateBlock::STATE_COLORMASK_ALL | RenderStateBlock::STATE_DEPTH_WRITE);
            
            Vector3 position = Vector3(0.0f, 0.0f, 0.0f) * GetWorldTransform();
            Matrix3 rotationPart(GetWorldTransform());
            Vector3 direction = Vector3(0.0f, 0.0f, 1.0f) * rotationPart;
            direction.Normalize();
            
            RenderManager::Instance()->SetColor(0.0f, 0.0f, 1.0f, 1.0f);
            
            RenderHelper::Instance()->DrawLine(position, position + direction * 10, 2.f);
            
            RenderManager::Instance()->SetState(RenderStateBlock::DEFAULT_3D_STATE);
            RenderManager::Instance()->SetColor(1.0f, 1.0f, 1.0f, 1.0f);
        }
#endif
        
    }
}