void ParticleRenderSystem::calcCameraPlanes()
{
    EntityManager* entitymanager = m_world->getEntityManager();
    Entity* cam = entitymanager->getFirstEntityByComponentType(ComponentType::TAG_MainCamera);

    CameraInfo* info = static_cast<CameraInfo*>(cam->getComponent(ComponentType::CameraInfo));

    Transform* transform = static_cast<Transform*>(
                               cam->getComponent( ComponentType::ComponentTypeIdx::Transform ) );

    AglVector3 position = transform->getTranslation();
    AglQuaternion rotation = transform->getRotation();
    AglVector3 lookTarget = position+transform->getMatrix().GetForward();
    AglVector3 up = transform->getMatrix().GetUp();

    AglMatrix view = AglMatrix::createViewMatrix(position,
                     lookTarget,
                     up);

    AglMatrix viewProj = view * info->m_projMat;

    m_cameraPlanes[0] = viewProj.getColumn(3)+viewProj.getColumn(0); //LEFT
    m_cameraPlanes[1] = viewProj.getColumn(3)-viewProj.getColumn(0); //RIGHT
    m_cameraPlanes[2] = viewProj.getColumn(3)-viewProj.getColumn(1); //TOP
    m_cameraPlanes[3] = viewProj.getColumn(3)+viewProj.getColumn(1); //BOTTOM
    m_cameraPlanes[4] = viewProj.getColumn(2);						 //NEAR
    m_cameraPlanes[5] = viewProj.getColumn(3)-viewProj.getColumn(2); //FAR

    for (unsigned int i = 0; i < 6; i++)
    {
        float l = sqrt(m_cameraPlanes[i].x * m_cameraPlanes[i].x +
                       m_cameraPlanes[i].y * m_cameraPlanes[i].y +
                       m_cameraPlanes[i].z * m_cameraPlanes[i].z);

        m_cameraPlanes[i].x /= l;
        m_cameraPlanes[i].y /= l;
        m_cameraPlanes[i].z /= l;
        m_cameraPlanes[i].w /= l;
    }
}
예제 #2
0
void HudSystem::process()
{
	ClientStateSystem* stateSystem = static_cast<ClientStateSystem*>(m_world->
		getSystem(SystemType::ClientStateSystem));
	
	if(stateSystem->getStateDelta(GameStates::INGAME) == EnumGameDelta::ENTEREDTHISFRAME)
	{
		m_backend->showDocument(m_hudIndex);
		m_hudVisible = true;

		setHUDData(SCORE,"-1");
		setHUDData(TIME,"00:00");
		setHUDData(SERVERNAME, m_client->getServerName().c_str());

		GraphicsBackendSystem* gfx = static_cast<GraphicsBackendSystem*>(m_world->getSystem(SystemType::GraphicsBackendSystem));

		m_screenSize = gfx->getWindowSize();

		float screenRatio = gfx->getAspectRatio();

		/*float wingRatio = 228.0f / 527.0f;
		AglVector2 wingsize = AglVector2(1.0f, 1.0f*gfx->getAspectRatio() * wingRatio) * screenRatio;

		float timerRatio = 109.0f / 953.0f;
		AglVector2 timerSize = AglVector2(0.4f, 0.4f*gfx->getAspectRatio() * timerRatio) * screenRatio;
		*/
		float constRatio = 65.0f / 1025.0f;
		AglVector2 constSize = AglVector2(0.6f, 0.6f*gfx->getAspectRatio() * constRatio) * screenRatio;

		/*m_leftWing = createSprite(AglVector3(-1.0f+wingsize.x*0.5f, 1.0f-wingsize.y*0.5f, 0.0f), "leftwing_HUD.png", wingsize);
		m_rightWing = createSprite(AglVector3(1.0f-wingsize.x*0.5f, 1.0f-wingsize.y*0.5f, 0.0f), "rightwing_HUD.png", wingsize);
		m_timerMonitor = createSprite(AglVector3(0.0f, 1.0f-timerSize.y, 0.0f), "timer_HUD.png", timerSize);*/


		m_constructionMode = createConstructionSprite(
			AglVector3(0.0f, -1.0f-constSize.y + 0.5f, 0.0f), 
			"construction_mode_label.png", constSize);
	}
	else if (stateSystem->getCurrentState() == GameStates::INGAME)
	{
		GraphicsBackendSystem* gfx = static_cast<GraphicsBackendSystem*>
			(m_world->getSystem(SystemType::GraphicsBackendSystem));

		AglVector2 newSize = gfx->getWindowSize();

		if (newSize.x != m_screenSize.x || newSize.y != m_screenSize.y)
		{
			m_screenSize = newSize;
			float screenRatio = 1280 / m_screenSize.x;

			/*float wingRatio = 228.0f / 527.0f;
			AglVector2 wingsize = AglVector2(0.3f, 0.3f*gfx->getAspectRatio() * wingRatio) * screenRatio;

			float timerRatio = 109.0f / 953.0f;
			AglVector2 timerSize = AglVector2(0.4f, 0.4f*gfx->getAspectRatio() * timerRatio) * screenRatio;
			*/
			float constRatio = 65.0f / 1025.0f;
			AglVector2 constSize = AglVector2(0.6f, 0.6f*gfx->getAspectRatio() * constRatio) * screenRatio;
			/*
			reinitSprite(m_leftWing, AglVector3(-1.0f+wingsize.x*0.5f, 1.0f-wingsize.y*0.5f, 0.0f), wingsize);
			reinitSprite(m_rightWing, AglVector3(1.0f-wingsize.x*0.5f, 1.0f-wingsize.y*0.5f, 0.0f), wingsize);
			reinitSprite(m_timerMonitor, AglVector3(0.0f, 1.0f-timerSize.y, 0.0f), timerSize);*/
			
			reinitSprite(m_constructionMode, AglVector3(0.0f, -1.0f-constSize.y + 0.5f, 0.0f), constSize);
		}
		
		EntityManager* entitymanager = m_world->getEntityManager();
		
		Entity* ship = entitymanager->getFirstEntityByComponentType(ComponentType::TAG_MyShip);
		ShipEditMode_TAG* editMode = static_cast<ShipEditMode_TAG*>(ship->getComponent(ComponentType::TAG_ShipEditMode));
		if (editMode)
		{
			ParticleSystemsComponent* ps = static_cast<ParticleSystemsComponent*>(
				m_constructionMode->getComponent(ComponentType::ParticleSystemsComponent));
			if(ps)
			{
				AglParticleSystem* particleSystem = ps->getParticleSystemPtr(0);
				if(particleSystem)
				{
					AglParticleSystemHeader* particleHeader = particleSystem->getHeaderPtr();
					if(particleHeader)
					{
						particleHeader->color = AglVector4(1, 1, 1, 1);
					}
				}
			}
		}
		else
		{	
			ParticleSystemsComponent* ps = static_cast<ParticleSystemsComponent*>(
				m_constructionMode->getComponent(ComponentType::ParticleSystemsComponent));
			AglParticleSystem* partSystem = ps->getParticleSystemPtr(0);
			if(partSystem)
			{
				AglParticleSystemHeader* header = partSystem->getHeaderPtr();
				if(header)
				{
					header->color = AglVector4(0, 0, 0, 0);
				}
			}
		}
		

	}
	else if(stateSystem->getStateDelta(GameStates::RESULTS) == EnumGameDelta::ENTEREDTHISFRAME){
		m_backend->hideDocument(m_hudIndex);
		m_hudVisible = false;
	}
}