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(); }
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; }