示例#1
0
void DrawScene() {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glLoadIdentity();
    g_Camera.apply();

	DrawGroundGrid();
    
    GLfloat lpos[4];
    lpos[0]=g_LightPos.X; lpos[1]=g_LightPos.Y; lpos[2]=g_LightPos.Z; lpos[3]=1;
    glLightfv(GL_LIGHT0, GL_POSITION, lpos);

	g_Terrain.draw();

    glutSwapBuffers();
    glutPostRedisplay();
}
示例#2
0
HRESULT KG3DScenePvsEditor::RenderForMainWindow(KG3DSceneOutputWnd& wndCur)
{
	KG3DSceneOutputWnd* pWnd = &wndCur;
    KG3DRenderState RenderState;

    D3DXVECTOR3 vPlacePos;
    D3DXMATRIX  matProj;
    D3DXMATRIX  matView;

    KG3DRepresentObjectPVS* pPvs = m_pPvs;

    ProcessSpaceNodeByCamera(&pWnd->GetCamera());
    CalcFrustum(&pWnd->GetCamera());

    if (KG3DSceneSpaceNode::GetTopVisableNode() != g_cGraphicsTool.GetCurScene()->m_lpSceneOutDoorSpaceMgr)
        pPvs = static_cast<KG3DRepresentObjectPVS*>(KG3DSceneSpaceNode::GetTopVisableNode());
    
    if (pPvs)
        pPvs->UpdateVisiableSubset(NULL);

    if (m_bRunMode && m_pRunder)
    {
        KG3DTrackCamera* pTrackCamera = pWnd->GetCamera().GetTrackCameraInterface();

        D3DXVECTOR3 vecNpcPos;
        D3DXVECTOR3 vecNpcDir;

        m_pRunder->GetCurPosition(&vecNpcPos);
        m_pRunder->GetDirection(&vecNpcDir);
        vecNpcPos = vecNpcPos + D3DXVECTOR3(0.0f, 180.0f, 0.0f);

        pTrackCamera->BindScene(this);
        pTrackCamera->UpdateAsClient(vecNpcPos, vecNpcDir, m_pRunder->m_fMoveSpeed, m_pRunder->m_dwMovementType);
        pTrackCamera->FrameMove();
    }
    else
        TrackCamareFrameMove();

    if (m_lpPointLightRender)
        m_lpPointLightRender->FrameMove();

    RenderWindowBegin(pWnd,TRUE);

	if(m_lpLightMapBaker && m_lpLightMapBaker->m_bShowDebug)
	{
		m_lpLightMapBaker->ShowDebug();
	}
	else
	{
		RenderState.SetSamplerState(0, D3DSAMP_MAGFILTER, (D3DTEXTUREFILTERTYPE)g_cEngineOption.nSampMagFilter);
		RenderState.SetSamplerState(0, D3DSAMP_MINFILTER, (D3DTEXTUREFILTERTYPE)g_cEngineOption.nSampMinFilter);
		RenderState.SetSamplerState(0, D3DSAMP_MIPFILTER, (D3DTEXTUREFILTERTYPE)g_cEngineOption.nSampMipFilter);
		RenderState.SetSamplerState(0, D3DSAMP_MAXANISOTROPY ,g_cEngineOption.dwMaxAnisotropy);
		RenderState.SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
		RenderState.SetRenderState(D3DRS_ZENABLE, TRUE);

		g_cGraphicsTool.ApplyLight(*this);

		g_SetShaderSharedParams(*this, wndCur, NULL, NULL);//这个没有ConverMap
		if (m_pPvs)
		{
			m_pPvs->FrameMove();
			m_pPvs->RenderHierarchy(m_bCull, m_lpPointLightRender);
		}

		if (m_pHandObj)
		{
			if (GetPlaceObjectPos(vPlacePos, pWnd))
				m_pHandObj->SetTranslation(&vPlacePos);
			m_pHandObj->FrameMove();
			m_pHandObj->RenderHierarchy();
		}

		if (m_pHandPtl)
		{
			D3DXVECTOR3 vScal = D3DXVECTOR3(1.f, 1.f, 1.f);
			D3DXMATRIX  matLocal;
			D3DXMATRIX  matScal;

			D3DXMatrixIdentity(&matLocal);

			switch (m_dwPlacePortalMode)
			{
			case PLACE_PTL_BILLBOARD :    
				*((D3DXVECTOR3*)&matLocal.m[0]) = pWnd->GetCamera().GetCameraRight();
				*((D3DXVECTOR3*)&matLocal.m[1]) = pWnd->GetCamera().GetCameraUp();
				*((D3DXVECTOR3*)&matLocal.m[2]) = pWnd->GetCamera().GetCameraFront();
				break;
			case PLACE_PTL_LOCK_Y :
				*((D3DXVECTOR3*)&matLocal.m[0]) = pWnd->GetCamera().GetCameraRight();
				*((D3DXVECTOR3*)&matLocal.m[1]) = D3DXVECTOR3(0.f, 1.f, 0.f);
				D3DXVec3Cross((D3DXVECTOR3*)&matLocal.m[2], (D3DXVECTOR3*)&matLocal.m[0], (D3DXVECTOR3*)&matLocal.m[1]);
				break;
			case PLACE_PTL_HOR :
				*((D3DXVECTOR3*)&matLocal.m[0]) = D3DXVECTOR3(1.f, 0.f, 0.f);
				*((D3DXVECTOR3*)&matLocal.m[1]) = D3DXVECTOR3(0.f, 0.f, 1.f);
				*((D3DXVECTOR3*)&matLocal.m[2]) = D3DXVECTOR3(0.f, -1.f, 0.f);
				break;
			default :
				break;
			}

			if (GetPlacePortalPos(vPlacePos, pWnd, m_pHandPtl))
				*((D3DXVECTOR3*)&matLocal.m[3]) = vPlacePos;

			m_pHandPtl->GetScaling(&vScal);
			D3DXMatrixScaling(&matScal, vScal.x, vScal.y, vScal.z);

			matLocal = matScal * matLocal;

			m_pHandPtl->UpdateByMatrix(matLocal);

			m_pHandPtl->FrameMove();
			m_pHandPtl->Render(0x550000ff);
		}

		if (m_bRunMode && m_pRunder)
		{
			//m_pRunder->NPCFrameMove();

			_ASSERTE(NULL != m_pRunder);
			KSF::FrameMoveSceneRunner(*m_pRunder, *this);

			m_pRunder->RenderHierarchy();
		}

		if (m_pPvs)
			m_pPvs->Render(0x550000ff);

		for_each(m_listRenderEntity.begin(), m_listRenderEntity.end(), mem_fun_ref(&KG3DSceneEntity::Render));
		//////////////////////////////////////////////////////////////////////////
		if(m_lpLightMapBaker)
			m_lpLightMapBaker->Render();

		matProj = m_SceneWndManager->GetCurOutputWnd()->GetCamera().GetProjectionMatrix();
		matView = m_SceneWndManager->GetCurOutputWnd()->GetCamera().GetViewMatrix();

		if (!m_bRunMode)
			RenderSelectedEntityMark(this->GetEditState(), m_SceneWndManager->GetCurOutputWnd()->m_Viewport, matProj, matView, TRUE);

		DrawGroundGrid();
		DrawInfo();

		if (g_cEngineManager.GetFocusScene() == this)
		{
			g_cGraphicsTool.DrawFocusRect(
				m_SceneWndManager->GetCurOutputWnd()->m_Viewport, 
				4,
				0xFFFFFF00
				);
		}


		GetEnvironment().Render();
	}

    RenderWindowEnd(pWnd);

    if (m_pPvs)
        m_pPvs->ClearFrustums();

    return S_OK;
}