#include "./console.h" #include "./DInput8Mgr.h" #include "./D3D9GraphicLayer.h" #include "../Scene/D3DXFont.h" #include "../Scene/SceneStateMgr.h" #include "../Scene/MainSceneMgr.h" #include "../Scene/MaterialShaderMgr.h" #include "../Scene/D3DXFont.h" #include "./Timer.h" #include "../Interface/CaldronMainInterface.h" namespace Caldron { namespace Scene { void CConsoleMaterialShder::Apply() { CSceneStateMgr::_SetD3DRenderState(D3DRS_CULLMODE,D3DCULL_NONE); CSceneStateMgr::_SetD3DRenderState(D3DRS_ALPHABLENDENABLE ,FALSE); CSceneStateMgr::_SetD3DRenderState(D3DRS_TEXTUREFACTOR,0x00000000); CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_COLOROP ,D3DTOP_SELECTARG1); CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_COLORARG1 ,D3DTA_TFACTOR); CSceneStateMgr::_SetD3DTextureStageState(1, D3DTSS_COLOROP ,D3DTOP_DISABLE ); CSceneStateMgr::_SetD3DTextureStageState(1, D3DTSS_ALPHAOP ,D3DTOP_DISABLE ); } } namespace Base { CConsole::CConsole(void) : m_iEnable(-1),m_fAniTime(0.5f),m_iUseLines(0),m_iWindowLines(20),m_iCurrentPos(0),m_iCursorX(0),m_iCursorY(0), m_dwScreenWidth(0),m_dwScreenHeight(0),m_iMaterialShaderIndex(-1),m_iCurrentPage(1),m_fUnitUv(0.1f),m_fTargetUv(30.0f),m_fCurrentUv(0.0f), m_fCurrentHeight(0.0f),m_fUnitAniHeight(0.0f),m_fTargetHeight(0.0f) { memset(m_strInputLine,0,sizeof(char) * 1024); memset(m_pBuffer,0,sizeof(char *) * CONSOLE_MAXLINE); m_iMaterialShaderIndex = -1; m_dwConsoleDecl = D3DFVF_XYZRHW;// | D3DFVF_TEX1 | D3DFVF_TEXCOORDSIZE1(2); } CConsole::~CConsole(void) { for(int i = 0; i < m_iUseLines; i++ ) { SafeDeleteA(m_pBuffer[i]); m_pBuffer[i] = NULL; } } void CConsole::Init() { Scene::CConsoleMaterialShder *pShader = new Scene::CConsoleMaterialShder; m_iMaterialShaderIndex = (Scene::CMainSceneMgr::_GetMaterialShaderMgr())->PushMaterialShader(pShader); for(int i =0 ;i < 4;i++ ) { m_pVertex[i].m_vecPos.w = 0.1f; m_pVertex[i].m_vecPos.z = 0.1f; } } void CConsole::Display() { if(m_iEnable != CONSOLEVIEW_HIDEANI) { CDInput8Mgr::Lock(CONSOLE_INPUTLOCK_KEY); memset(m_strInputLine,0,sizeof(char) * 1024); m_iEnable = CONSOLEVIEW_DISPLAYANI; m_iWindowLines = 20; m_iCurrentPos = 0; m_iCursorX = 10; m_iCursorY = (int)(m_fTargetHeight - 15); } } void CConsole::Hide() { if(m_iEnable != CONSOLEVIEW_DISPLAYANI) { m_iEnable = CONSOLEVIEW_HIDEANI; m_iWindowLines = 20; m_iCurrentPos = 0; } } void CConsole::ProcessKey() { if(m_iEnable == CONSOLEVIEW_DISPLAY) { if(CDInput8Mgr::PushOnceKey(DIK_GRAVE,CONSOLE_INPUTLOCK_KEY)) { Scene::CMainSceneMgr::ChangeConsole(); } if(CDInput8Mgr::PushOnceKey(DIK_RETURN ,CONSOLE_INPUTLOCK_KEY)) { CommandExec(); m_iCurrentPos = 0; memset(m_strInputLine,0,sizeof(char) * 1024); } // key ÀÔ·Âó¸® CDInput8Mgr::KeyStrok(m_strInputLine,m_iCurrentPos); if(m_iCurrentPos >= 1024) m_iCurrentPos = 1023; if(m_iCurrentPos < 0) m_iCurrentPos = 0; } } void CConsole::Update(float fSkipFrame) { CD3D9GraphicLayer::_GetWindowSize(m_dwScreenWidth,m_dwScreenHeight); m_fTargetHeight = (float)m_dwScreenHeight * 0.6f; m_fUnitAniHeight = (float)m_fTargetHeight / m_fAniTime; if(m_iEnable == CONSOLEVIEW_HIDE) return ; switch(m_iEnable) { case CONSOLEVIEW_HIDEANI: if(m_fCurrentHeight > 0) { m_fCurrentHeight -= (float)m_fUnitAniHeight * fSkipFrame; } break; case CONSOLEVIEW_DISPLAYANI: if(m_fCurrentHeight < m_fTargetHeight) { m_fCurrentHeight += (float)m_fUnitAniHeight * fSkipFrame; } break; case CONSOLEVIEW_DISPLAY: break; default: break; } if(m_fCurrentHeight <= 0) { m_fCurrentHeight = 0; m_iEnable = CONSOLEVIEW_HIDE; CDInput8Mgr::Unlock(); } else if(m_fCurrentHeight >= m_fTargetHeight) { m_fCurrentHeight = m_fTargetHeight; m_iEnable = CONSOLEVIEW_DISPLAY; } m_fCurrentUv += m_fUnitUv * fSkipFrame; if(m_fCurrentUv >= m_fTargetUv) { m_fUnitUv *= -1.0f; } else if(m_fCurrentUv <= 0.0f) { m_fUnitUv *= -1.0f; } ProcessKey(); } void CConsole::Render(LPDIRECT3DDEVICE9 lpDevice) { if(m_iEnable == CONSOLEVIEW_HIDE) return ; Scene::CMainSceneMgr::_GetMaterialShaderMgr()->GetNodes(m_iMaterialShaderIndex)->Apply(); m_pVertex[3].m_vecPos.x = (float)m_dwScreenWidth; m_pVertex[3].m_vecPos.y = m_fCurrentHeight; m_pVertex[0].m_vecPos.x = 0.0f; m_pVertex[0].m_vecPos.y = m_fCurrentHeight; m_pVertex[1].m_vecPos.x = 0.0f; m_pVertex[1].m_vecPos.y = 0.0f; m_pVertex[2].m_vecPos.x = (float)m_dwScreenWidth; m_pVertex[2].m_vecPos.y = 0.0f; lpDevice->SetFVF(m_dwConsoleDecl); lpDevice->DrawPrimitiveUP(D3DPT_TRIANGLEFAN ,2,&m_pVertex,sizeof(CConsoleVertex)); if(m_iEnable == CONSOLEVIEW_DISPLAY) { RenderText(5,m_iCursorY,">"); if(m_iCurrentPos < 1023) m_strInputLine[m_iCurrentPos] = '_'; RenderText((long)m_iCursorX,(long)m_iCursorY,m_strInputLine); int iCount = (m_iUseLines > m_iWindowLines) ? m_iWindowLines : m_iUseLines; for(int iLine = 0; iLine < iCount; iLine++) { RenderText((long)m_iCursorX,(long)iLine * 13 + 2,m_pBuffer[iLine]); } } } void CConsole::RenderText(long iX,long iY,const char *strText) { Scene::CMainSceneMgr::_GetFont()->PrintFont(iX,iY,strText); } void CConsole::AddText(const char *fmt,...) { static char str[1024]; int iLength; va_list va; va_start( va, fmt ); vsprintf( str, fmt, va ); va_end( va ); if(m_iUseLines == CONSOLE_MAXLINE) SafeDeleteA(m_pBuffer[--m_iUseLines]); memmove(&m_pBuffer[1],&m_pBuffer[0],sizeof(char *)*m_iUseLines); iLength = (int)strlen(str) + 1; m_pBuffer[0] = new char[iLength]; memcpy(m_pBuffer[0],str,iLength); m_iUseLines++; } void CConsole::CommandExec() { m_strInputLine[m_iCurrentPos] = 0; AddText(m_strInputLine); if(strstr(m_strInputLine,"BYE")) // Console Close Scene::CMainSceneMgr::ChangeConsole(); else if(strstr(m_strInputLine,"FOV")) // Fov { float fFov = 45.0f; float fMinDistance = 0.1f; float fMaxDistance = 10000.0f; bool bRight = true; char *tok = strtok(m_strInputLine," "); if((tok = strtok(NULL," ")) != NULL) { fFov = (float)atof(tok); if((tok = strtok(NULL," ")) != NULL) { fMinDistance = (float)atof(tok); if((tok = strtok(NULL," ")) != NULL) { fMaxDistance = (float)atof(tok); } else { bRight = false; } } else { bRight = false; } } else { bRight = false; } if(bRight == true) Scene::CSceneStateMgr::_SetD3DPerspectiveLHMatrix(Scene::D3DMATRIX_PROJECT,fFov,(float)m_dwScreenWidth / (float)m_dwScreenHeight,fMinDistance,fMaxDistance); else AddText("FOV arg wrong. ex> FOV 45.0 0.1 1000.0"); } else if(strstr(m_strInputLine,"WIREFRAME VIEW")) // Fill Mode setting Scene::CMainSceneMgr::_ChangeGlobalMode(Scene::GLOBAL_FILLMODE,D3DFILL_WIREFRAME); else if(strstr(m_strInputLine,"SOLID VIEW")) Scene::CMainSceneMgr::_ChangeGlobalMode(Scene::GLOBAL_FILLMODE,D3DFILL_SOLID); else if(strstr(m_strInputLine,"FPS ON")) // Fps View Scene::CMainSceneMgr::_ChangeGlobalMode(Scene::GLOBAL_FPSSTATE,1); else if(strstr(m_strInputLine,"FPS OFF")) Scene::CMainSceneMgr::_ChangeGlobalMode(Scene::GLOBAL_FPSSTATE,0); else if(strstr(m_strInputLine,"CAMERA INFO ON")) // Camera Info Scene::CMainSceneMgr::_ChangeGlobalMode(Scene::GLOBAL_CAMERAINFO,1); else if(strstr(m_strInputLine,"CAMERA INFO OFF")) Scene::CMainSceneMgr::_ChangeGlobalMode(Scene::GLOBAL_CAMERAINFO,0); else if(strstr(m_strInputLine,"LOG CONSOLE")) // Log Device Setting CLogMgr::_SetOutDevice(Caldron::LOG_CONSOLEOUT); else if(strstr(m_strInputLine,"LOG FILE")) CLogMgr::_SetOutDevice(Caldron::LOG_FILEOUT); else if(strstr(m_strInputLine,"LOG MESSAGEBOX")) CLogMgr::_SetOutDevice(Caldron::LOG_MESSAGEBOXOUT); else if(strstr(m_strInputLine,"HELP")) // Help HelpMessage(); else if(strstr(m_strInputLine,"FPS HOLD")) // Fps Hold { char *tok = strtok(m_strInputLine," "); int iHold = 0; if((tok = strtok(NULL," ")) != NULL) { if((tok = strtok(NULL," ")) != NULL) { iHold = atoi(tok); Caldron::Base::CTimer::_GetInstance().SetFPS(iHold); } } } else if(strstr(m_strInputLine,"QUIT")) { Interface::CCaldronMsgObj *pNode = new Interface::CCaldronMsgObj(Interface::MESSAGE_APP_QUIT,0); Interface::CCaldronMainInterface::PushCaldronMsg(pNode); } } void CConsole::HelpMessage() { AddText(" BYE : Console Close"); AddText(" FOV FovValue MinValue MaxValue : Fov Setting ( ex > FOV 45.0 0.1 1000.0)"); AddText(" WIREFRAME VIEW : WireFrame View"); AddText(" SOLID VIEW : Solid View"); AddText(" FPS ON : FPS Draw"); AddText(" FPS OFF : FPS Not Draw"); AddText(" CAMERA INFO ON : Camera Info On"); AddText(" CAMERA INFO OFF : Camera Info Off"); AddText(" LOG CONSOLE : Log to Console"); AddText(" LOG FILE : Log to File"); AddText(" LOG MESSAGEBOX : Log to MessageBox"); AddText(" FPS HOLD holdFps : FPS HOLD ( ex > FPS HOLD 100 )"); AddText(" QUIT : APP Quit"); } }}