Ejemplo n.º 1
0
void SceneTerrain::PreRender()
{
	Frustum& frust = Frustum::getInstance();
	VarManager& var = VarManager::getInstance();

	vec3 eye_pos = Camera::getInstance().getEye();
	vec3 sun_pos = eye_pos - vec3(m_vSunVector);
	GLdouble tabOrtho[TERRAIN_SHADOWMAPS_COUNT] = {20.0, 100.0};
//	float sizey = fabs(sinf(m_vSunAngle.y)) + 1.0f;
	float sizey = 1.0f;

	// On place la caméra à la lumière et on récupère les matrices
	SetLightCameraMatrices();

	glMatrixMode(GL_PROJECTION);
	glPushMatrix();


	// Affichage de la Depth map du point de vue du soleil dans un FBO
	for(GLuint i=0; i<TERRAIN_SHADOWMAPS_COUNT; i++)
	{
		glMatrixMode(GL_PROJECTION);
		glLoadIdentity();
		glOrtho(-tabOrtho[i], tabOrtho[i], -tabOrtho[i]*sizey, tabOrtho[i]*sizey, (GLdouble)var.getf("cam_znear"), (GLdouble)var.getf("cam_zfar"));
		glMatrixMode(GL_MODELVIEW);
		Frustum::getInstance().Extract(sun_pos);
		
		m_fboDepthMapFromLight[i].Begin();
			glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
			RenderEnvironment(false, true);
		m_fboDepthMapFromLight[i].End();
	}


	// Récupération des matrices MV et proj de la lumière
//	Frustum::getInstance().Extract(sun_pos);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	glOrtho(-1.0, 1.0, -1.0, 1.0, (GLdouble)var.getf("cam_znear"), (GLdouble)var.getf("cam_zfar"));
	Frustum::getInstance().Extract(sun_pos);
	mat4& matLightMV = frust.getModelviewMatrix();
	mat4& matLightProj = frust.getProjectionMatrix();
	m_matSunModelviewProj = matLightProj * matLightMV;


	// On remet les matrices comme avant
	glMatrixMode(GL_PROJECTION);
	glPopMatrix();
	RestoreLightCameraMatrices();
	Frustum::getInstance().Extract(eye_pos);


	// Affichage de la scène réfléchie dans un FBO
	m_fboWaterReflection.Begin();
		glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
		RenderEnvironment(true, false);
	m_fboWaterReflection.End();
}
Ejemplo n.º 2
0
void CModelViewer::SetFrame(int frame)
{
	if (m_mesh)
		m_mesh->SetFrame((float)frame);

	if (!IsAutoRefresh())
		RenderEnvironment();
}
Ejemplo n.º 3
0
void CModelViewer::SetLOD(int lod)
{
	if (lod < 0 || lod >= MAX_GROUP)
		return;

	m_LOD = lod;

	if (!IsAutoRefresh())
		RenderEnvironment();
}
Ejemplo n.º 4
0
void fp_RenderRaytrace::OnD3D10FrameRender(
        ID3D10Device* D3DDevice,
        const D3DXMATRIX*  View,
        const D3DXMATRIX*  Projection,
        const D3DXMATRIX*  ViewProjection,
        const D3DXMATRIX*  InvView,
        bool UpdateVis) {  
    //HRESULT hr;
    RenderEnvironment(D3DDevice, View, Projection);
    if(UpdateVis)
        FillVolumeTexture(D3DDevice);
    RenderVolume(D3DDevice, View, ViewProjection, InvView);    

    // TODO: find out why things get messed up when pass does not get reseted
    //m_TechRenderRaytrace->GetPassByIndex(0)->Apply(0);
}
Ejemplo n.º 5
0
void CModelViewer::wheelEvent(QWheelEvent* event)
{
	if (event->orientation() == Qt::Vertical)
	{
		m_cameraDist -= (float)event->delta() / 120.0f;

		if (m_cameraDist < 0.1f)
			m_cameraDist = 0.1f;
		else if (m_cameraDist > 400.0f)
			m_cameraDist = 400.0f;

		if (!IsAutoRefresh())
			RenderEnvironment();

		event->accept();
	}
}
Ejemplo n.º 6
0
void CModelViewer::SetMesh(CAnimatedMesh* mesh)
{
	m_mesh = mesh;
	m_cameraPos = D3DXVECTOR3(0.0f, 0.0f, 0.0f);

	if (m_mesh)
	{
		const Bounds bounds = m_mesh->GetBounds();
		m_cameraDist = bounds.Max.x + 8.0f;
		m_cameraPos.y = (bounds.Min.y + bounds.Max.y) / 2.0f;
	}
	else
		m_cameraDist = 8.0f;

	m_cameraRot = D3DXVECTOR2(180.0f, 30.0f);

	if (!IsAutoRefresh())
		RenderEnvironment();
}
Ejemplo n.º 7
0
void CModelViewer::mouseMoveEvent(QMouseEvent* event)
{
	if (m_movingCamera)
	{
		const QPoint mousePos = QPoint(event->x(), event->y());
		const QPoint mouseMove = m_lastMousePos - mousePos;

		if (QApplication::queryKeyboardModifiers() & Qt::ShiftModifier)
		{
			const float phiRadian = m_cameraRot.y * M_PI / 180.0f;
			const float thetaRadian = m_cameraRot.x * M_PI / 180.0f;
			D3DXVECTOR3 eye, moveX, moveY;
			eye.x = cos(phiRadian) * sin(thetaRadian);
			eye.y = sin(phiRadian);
			eye.z = cos(phiRadian) * cos(thetaRadian);
			D3DXVec3Cross(&moveY, &eye, &D3DXVECTOR3(0.0f, 1.0f, 0.0f));
			D3DXVec3Normalize(&moveY, &moveY);
			D3DXVec3Cross(&moveX, &eye, &moveY);
			D3DXVec3Normalize(&moveX, &moveX);
			m_cameraPos += moveX * ((float)mouseMove.y() / 750.0f * (m_cameraDist + 1.0f));
			m_cameraPos += moveY * ((float)mouseMove.x() / 750.0f * (m_cameraDist + 1.0f));
		}
		else
		{
			m_cameraRot.x -= (float)mouseMove.x() / 4.0f;
			m_cameraRot.y -= (float)mouseMove.y() / 4.0f;

			if (m_cameraRot.y > 89.9f)
				m_cameraRot.y = 89.9f;
			else if (m_cameraRot.y < -89.9f)
				m_cameraRot.y = -89.9f;
		}

		m_lastMousePos = mousePos;

		if (!IsAutoRefresh())
			RenderEnvironment();

		event->accept();
	}
}
Ejemplo n.º 8
0
void SceneTerrain::Render()
{
	VarManager& var = VarManager::getInstance();


	// Affichage de la scène normale
	RenderEnvironment(false, false);

	// Affichage de la surface de l'eau
	RenderWaterSurface();


/*
	// Affichage du texte
	glColor3f(1.0f, 1.0f, 1.0f);
	std::stringstream strStream;
	strStream << var.geti("terrain_chunks_drawn") << " chunks";
	DrawString(vec2(1.0f, 20.0f), GLUT_BITMAP_HELVETICA_18, strStream.str());
	strStream.str("");
	strStream << var.geti("terrain_chunks_reflected_drawn") << " reflected chunks";
	DrawString(vec2(1.0f, 1.0f), GLUT_BITMAP_HELVETICA_18, strStream.str());
*/
}