www.pudn.com > zfxcengine-0.1.0.zip > ceRenderApp.cpp


/* $Id: ceRenderApp.cpp,v 1.24 2005/09/01 19:47:30 florianxx Exp $ */ 
//////////////////////////////////////////////////////////////////////////////// 
//  Module:    Render                                                         
//! \file      ceRenderApp.cpp 
//! \brief     Stellt eine Klasse zur Verfgung, die alles initialisiert, was man zum Rendern braucht 
//! \author    Enrico Z. 
//                                                                             
//                                                   
// Diese Datei steht unter der LGPL-Lizenz, welche   
// im Hauptordner(ZFXC-Engine) unter LICENSE         
// nachlesbar ist.                                   
//////////////////////////////////////////////////////////////////////////////// 
#include  
#include "Render/ceRenderApp.h" 
#include "Core/ceMemManager.h" 
#include "Core/ceDynlib.h" 
 
using namespace std; 
 
namespace ZFXCE { 
	namespace Render { 
		//////////////////////////////////////////////////////////////////////////////// 
		ceRenderApp::ceRenderApp(int argc, char* argv[]): m_pRenderSystem(NULL), 
			m_pRenderDevice(NULL), m_pWindow(NULL), m_pTextureManager(NULL),  
			m_pRenderObjectFactory(NULL), m_pRenderQueue(NULL), m_bClearColor(TRUE), 
			m_bClearDepth(TRUE), m_bClearStencil(FALSE), m_pInputSystem(NULL) 
		{ 
			m_ClearColor = ceColorRGBA(0.7f, 0.7f, 0.7f, 1.0f); 
		} 
		//////////////////////////////////////////////////////////////////////////////// 
		ceRenderApp::ceRenderApp(): m_pRenderSystem(NULL), m_pRenderDevice(NULL), m_pWindow(NULL), 
			m_pTextureManager(NULL), m_pRenderObjectFactory(NULL), m_pRenderQueue(NULL), 
			m_bClearColor(TRUE), m_bClearDepth(TRUE), m_bClearStencil(FALSE), m_pInputSystem(NULL) 
		{ 
			m_ClearColor = ceColorRGBA(0.7f, 0.7f, 0.7f, 1.0f); 
		} 
		//////////////////////////////////////////////////////////////////////////////// 
		ceRenderApp::~ceRenderApp() 
		{ 
			ceRenderApp::Release(); 
		} 
		//////////////////////////////////////////////////////////////////////////////// 
		bool ceRenderApp::Init() 
		{ 
			PUSH_FUNCTION; 
 
			//config Datei auslesen und standardwerte fr Fenster eintragen 
			// VFS und so initialisieren 
			ceMainApp::Init(); 
			m_pVFS = ceMainApp::GetFileManager(); 
			m_pArchiveManager = m_pVFS->GetArchivManager(); 
			m_pArchiveManager->RegisterDataDir("./"); 
			m_pArchiveManager->RegisterFileExtension("zip", ARCHIVE_ZIP); 
			m_pArchiveManager->RegisterFileExtension("pk3", ARCHIVE_ZIP); 
			m_pArchiveManager->RegisterFileExtension("pk4", ARCHIVE_ZIP); 
			m_pArchiveManager->SearchForArchives(); 
 
			// Inputsystem erstellen 
			ZFXCE::DynLib::RegisterDynLinkedLib(DynLib::CE_INPUT_SDL); 
			ZFXCE::DynLib::GetFromDLL(DynLib::CE_INPUT_SDL, (ceIDefaultSystem**) &m_pInputSystem); 
 
			if(m_strAPI == "OpenGL") 
			{ 
				ZFXCE::DynLib::RegisterDynLinkedLib(DynLib::CE_RENDER_OGL); 
				ZFXCE::DynLib::GetFromDLL(DynLib::CE_RENDER_OGL, (ceIDefaultSystem**) &m_pRenderSystem); 
			} 
#ifdef WIN32 
			else if(m_strAPI == "D3D9") 
			{ 
				// es gibt nur unter Windows einen D3D9 Renderer 
				ZFXCE::DynLib::RegisterDynLinkedLib(DynLib::CE_RENDER_D3D9); 
				ZFXCE::DynLib::GetFromDLL(DynLib::CE_RENDER_D3D9, (ceIDefaultSystem**) &m_pRenderSystem); 
			} 
#endif 
			else 
				CE_EXCEPTION("Unbekannte Render-API: "+m_strAPI, CELS_HARDERROR); 
 
			m_pInputDevice = m_pInputSystem->GetDevice(); 
 
			if(!m_pRenderSystem) 
				CE_EXCEPTION(std::string(__FUNCTION__)+": Got no Rendersystem!", CELS_HARDERROR); 
 
			// RenderSystem erstellen 
			m_pRenderDevice = m_pRenderSystem->CreateDevice(); 
 
			if (NULL == m_pRenderDevice) 
			{ 
				std::cerr << "Invalides RenderDevice!" << std::endl; 
				return FALSE; 
			} 
			 
			// Nur ein Fenster erstellen, falls nötig 
			if(NULL == m_pWindow) 
			{ 
				m_pWindow = m_pRenderDevice->CreateNewWindow(&m_WinProp, m_WinProp.var); 
				 
				if (NULL == m_pWindow) 
				{ 
					cerr << "Invalides Fenster!" << endl; 
					return FALSE; 
				}	 
			} 
			else 
			{ 
				m_pRenderDevice->AddWindow(m_pWindow); 
				m_pRenderDevice->SetupAPI(m_WinProp.m_ScreenMode.m_uiWidth, m_WinProp.m_ScreenMode.m_uiHeight); 
			} 
	 
			m_pRenderDevice->Create(); 
			 
			m_pRenderDevice->SetClearColor(m_ClearColor); 
 
			m_pTextureManager = m_pRenderDevice->GetTextureManager(); 
			if (NULL == m_pTextureManager) 
			{ 
				CE_EXCEPTION("ceRenderApp::Init(): Invalider Texturmanager!\n", CELS_ERROR); 
				return FALSE; 
			} 
 
			m_pTextureManager->Init(m_pVFS); 
 
			m_pRenderObjectFactory = m_pRenderDevice->GetRenderObjectFactory(); 
			m_pRenderQueue = m_pRenderDevice->GetRenderQueue(); 
			 
			/* Events updaten */ 
			m_pInputDevice->Update(); 
 
			// Timer initialisieren 
			m_Timer.Init(); 
 
			return TRUE; 
		} 
		//////////////////////////////////////////////////////////////////////////////// 
		bool ceRenderApp::Release() 
		{ 
			m_pTextureManager->RemoveAllTextures(); 
 
			m_pInputDevice->Release(); 
 
			ZFXCE::DynLib::DestroySystem("SDL Input", (ceIDefaultSystem**) &m_pInputSystem); 
			ZFXCE::DynLib::DestroySystem("OpenGL Renderer", (ceIDefaultSystem**) &m_pRenderSystem); 
 
			ceMainApp::Release(); 
 
			return TRUE; 
		} 
		//////////////////////////////////////////////////////////////////////////////// 
		void ceRenderApp::PreFrame() 
		{ 
			m_pRenderDevice->ClearBuffers(m_bClearColor, m_bClearDepth, m_bClearStencil); 
 
			m_pRenderDevice->BeginFrame(); 
 
			/* Der User setzt jetzt die Kamera und fuegt Jobs hinzu */ 
		}	 
		//////////////////////////////////////////////////////////////////////////////// 
		void ceRenderApp::PostFrame() 
		{ 
			/* Und wir rendern alles */ 
			m_pRenderQueue->RenderAll(); 
 
			// Dazu erst den alten Titel sichern 
			static std::string strOldTitle = m_pWindow->GetTitle(); 
			 
			// FPS berechnen und in den Fenstertitel setzen 
			static UINT uiFPS = 1; 
			static UINT uiOldFPS=0; 
			m_Timer.GetFPS(&uiFPS); 
 
			if(uiOldFPS != uiFPS) 
			{ 
				static char strFPS[20]; 
				sprintf(strFPS, " - %d FPS", uiFPS ); 
				// we should only do this in windowed mode 
				if(m_WinProp.m_ScreenMode.m_bFullscreen == FALSE) 
					m_pWindow->SetTitle(strOldTitle + strFPS); 
				uiOldFPS = uiFPS; 
			} 
 
			// Render the whole data 
			m_pRenderDevice->EndFrame(); 
		} 
		//////////////////////////////////////////////////////////////////////////////// 
		void ceRenderApp::Execute() 
		{ 
			/* Events abarbeiten */ 
			if(!m_pInputDevice->Update()) 
				exit(0); 
 
			/* nun das eigentliche Frame */ 
			PreFrame(); 
 
			/* user Funktion */ 
			Run(); 
 
			/* Frame beenden */ 
			PostFrame(); 
 
			/* Und Buffer tauschen */ 
			m_pWindow->Update(); 
		} 
	}	// namespace Render 
}		// namespace ZFXCE