416 lines
		
	
	
		
			9.7 KiB
		
	
	
	
		
			C++
		
	
	
	
		
		
			
		
	
	
			416 lines
		
	
	
		
			9.7 KiB
		
	
	
	
		
			C++
		
	
	
	
|  | #include "pch.h"
 | |||
|  | #include "imguiC.h"
 | |||
|  | #include "DNFTOOL.h"
 | |||
|  | 
 | |||
|  | #ifdef _WIN64
 | |||
|  | #define SELF_PTR LONG_PTR
 | |||
|  | #define WNDPROC_INDEX GWLP_WNDPROC
 | |||
|  | #else
 | |||
|  | #define SELF_PTR DWORD
 | |||
|  | #define WNDPROC_INDEX GWL_WNDPROC
 | |||
|  | 
 | |||
|  | #endif
 | |||
|  | typedef HRESULT(WINAPI* Reset_t)(LPDIRECT3DDEVICE9, D3DPRESENT_PARAMETERS*); // 16
 | |||
|  | typedef long(__stdcall* EndScene_t)(LPDIRECT3DDEVICE9);                      // 42
 | |||
|  | typedef LRESULT(__stdcall* WndProc_t)(const HWND, UINT, WPARAM, LPARAM); | |||
|  | 
 | |||
|  | D3DPRESENT_PARAMETERS   g_present; | |||
|  | IDirect3D9* g_Direct3D9 = NULL; | |||
|  | IDirect3DDevice9* g_pd3dDevice = NULL; | |||
|  | HWND g_hWnd = NULL; | |||
|  | 
 | |||
|  | Reset_t     oReset; | |||
|  | EndScene_t  oBeginScene; | |||
|  | EndScene_t  oEndScene; | |||
|  | WndProc_t   oWndProc; | |||
|  | 
 | |||
|  | DWORD* dDeviceVT = NULL; | |||
|  | 
 | |||
|  | 
 | |||
|  | extern LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); | |||
|  | 
 | |||
|  | static bool IMGUISW = false; | |||
|  | 
 | |||
|  | LRESULT __stdcall hkWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) | |||
|  | { | |||
|  |     if (ImGui_ImplWin32_WndProcHandler(hWnd, msg, wParam, lParam)) return true; | |||
|  |     switch (msg) { | |||
|  |     case WM_LBUTTONDOWN: case WM_LBUTTONDBLCLK:    case WM_RBUTTONDOWN: case WM_RBUTTONDBLCLK: | |||
|  |     case WM_MBUTTONDOWN: case WM_MBUTTONDBLCLK:    case WM_XBUTTONDOWN: case WM_XBUTTONDBLCLK: | |||
|  |         if (checkBoxFalgs_1) return true; | |||
|  |     } | |||
|  | 
 | |||
|  | 
 | |||
|  |     return CallWindowProc(oWndProc, hWnd, msg, wParam, lParam); | |||
|  | } | |||
|  | 
 | |||
|  | void MineImGuiInit(IDirect3DDevice9* pd3dDevice) | |||
|  | { | |||
|  |     // <20><><EFBFBD><EFBFBD>IMGUI <20>汾
 | |||
|  |     IMGUI_CHECKVERSION(); | |||
|  | 
 | |||
|  |     // <20><><EFBFBD><EFBFBD>IMGUI<55><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | |||
|  |     ImGui::CreateContext(); | |||
|  | 
 | |||
|  |     ImGuiIO& io = ImGui::GetIO(); | |||
|  |     // <20>ر<EFBFBD>imgui  <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>ʾ
 | |||
|  |     io.ConfigFlags = ImGuiConfigFlags_NoMouseCursorChange; | |||
|  |     io.WantSaveIniSettings = false; | |||
|  |     io.IniFilename = NULL; | |||
|  | 
 | |||
|  |     //ImGuiStyle& style = ImGui::GetStyle();
 | |||
|  |     ImGui::StyleColorsDark(); | |||
|  |     //ImGui::StyleColorsClassic();
 | |||
|  |     //ImGui::StyleColorsLight();
 | |||
|  |     //LoadMyStype();
 | |||
|  | 
 | |||
|  |     //SetLayeredWindowAttributes();
 | |||
|  |     // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>---Ϊ<><CEAA><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>
 | |||
|  |     ImFontConfig f_cfg; | |||
|  |     f_cfg.FontDataOwnedByAtlas = false; | |||
|  |     //const ImFont* font = io.Fonts->AddFontFromMemoryTTF((void*)baidu_font_data, baidu_font_size, 17.0f, &f_cfg, io.Fonts->GetGlyphRangesChineseSimplifiedCommon());
 | |||
|  |     const ImFont* font = io.Fonts->AddFontFromFileTTF("Fonts/simsun.ttc", 11.5f, &f_cfg, io.Fonts->GetGlyphRangesChineseSimplifiedCommon()); | |||
|  |      | |||
|  |     ImGui_ImplWin32_Init(g_hWnd); | |||
|  |     ImGui_ImplDX9_Init(pd3dDevice); | |||
|  | 
 | |||
|  | } | |||
|  | 
 | |||
|  | 
 | |||
|  | LPDIRECT3DTEXTURE9 g_texture; | |||
|  | void imguiC::LoadImg() | |||
|  | { | |||
|  | 
 | |||
|  |     //unsigned char* buffer = GetNPK();
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  |     /*
 | |||
|  |     for (int y = 0; y < 118; y++) | |||
|  |         memcpy((unsigned char*)lock_rect.pBits + lock_rect.Pitch * y, buffer + (203 * 4) * y, (203 * 4)); | |||
|  |         */ | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | } | |||
|  | 
 | |||
|  | 
 | |||
|  | namespace Gdiplus | |||
|  | { | |||
|  |     using std::min; | |||
|  |     using std::max; | |||
|  | }; | |||
|  | #include <atlimage.h>
 | |||
|  | 
 | |||
|  | bool TmainBeginSate = TRUE; | |||
|  | void DrawCustom(IDirect3DDevice9* pd3dDevice) | |||
|  | { | |||
|  |     // <20><><EFBFBD>濪ʼ<E6BFAA><CABC><EFBFBD><EFBFBD>
 | |||
|  |     ImGui_ImplDX9_NewFrame(); | |||
|  |     ImGui_ImplWin32_NewFrame(); | |||
|  | 
 | |||
|  |     ImGui::NewFrame(); | |||
|  | 
 | |||
|  |     // <20><><EFBFBD>ڴ<EFBFBD>С
 | |||
|  |     ImGui::SetNextWindowPos(ImVec2(0, 0), ImGuiCond_FirstUseEver); | |||
|  |     ImGui::SetNextWindowSize(ImVec2(800, 600), ImGuiCond_FirstUseEver); | |||
|  |     //ImGui::SetNextWindowBgAlpha(0);
 | |||
|  | 
 | |||
|  |     ImGui::Begin(u8"imgui_Test", &TmainBeginSate, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoBackground | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize); | |||
|  | 
 | |||
|  | 
 | |||
|  |     ImDrawList* draw_list = ImGui::GetForegroundDrawList(); | |||
|  | 
 | |||
|  | 
 | |||
|  |      | |||
|  | 
 | |||
|  |     CImage Img; | |||
|  |     DWORD adwBitmasks[3] = { 0x0000000f, 0x000000f0, 0x00000f00 }; | |||
|  |     Img.CreateEx(100, 100, 16, BI_BITFIELDS, adwBitmasks, 0); | |||
|  |     Img.Save(L"Test.png"); | |||
|  | 
 | |||
|  |     ImGui::Image(Img, ImVec2(400, 400)); | |||
|  |     draw_list->AddText(ImVec2(400, 400), 0xfaff0000,u8"<EFBFBD><EFBFBD><EFBFBD>Ắ"); | |||
|  |     /*
 | |||
|  |     pd3dDevice->CreateTexture(203, 118, 1, D3DUSAGE_DYNAMIC, D3DFMT_X8R8G8B8, D3DPOOL_DEFAULT, &g_texture, NULL); | |||
|  | 
 | |||
|  | 
 | |||
|  |     D3DLOCKED_RECT lock_rect; | |||
|  |     g_texture->LockRect(0, &lock_rect, NULL, 0); | |||
|  | 
 | |||
|  |     char* nPbit = (char*)lock_rect.pBits; | |||
|  |     int nPitch = lock_rect.Pitch; | |||
|  |     int stride = nPitch / (4 * 3);//<2F><><EFBFBD><EFBFBD>Ϊ3<CEAA>ȷݣ<C8B7>strideΪ<65><CEAA><EFBFBD><EFBFBD>
 | |||
|  | 
 | |||
|  |     DWORD* pwd = (DWORD*)nPbit; | |||
|  |     for (UINT row = 0; row < 240; row++) | |||
|  |     { | |||
|  |         for (int col = 0; col < stride; col++) | |||
|  |         { | |||
|  |             pwd[row * nPitch / 4 + col] = 0xFFFF0000; | |||
|  |             pwd[row * nPitch / 4 + col + stride] = 0xFF00FF00; | |||
|  |             pwd[row * nPitch / 4 + col + 2 * stride] = 0xFF0000FF; | |||
|  |         } | |||
|  |     } | |||
|  |     g_texture->UnlockRect(0); | |||
|  | 
 | |||
|  |     ImGui::Image(g_texture, ImGui::GetContentRegionAvail()); | |||
|  |  */ | |||
|  | 
 | |||
|  |     //ImGui::Checkbox(u8"<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>     ", &checkBoxFalgs_1); ImGui::SameLine();
 | |||
|  |     ////CString tmpste = (checkBoxFalgs_1) ? "ON" : "OFF";
 | |||
|  |     ////ImGui::Text(u8"[ %S ]", tmpste); 
 | |||
|  | 
 | |||
|  |     //if (ImGui::BeginTabBar("tab1", tab_bar_flags))
 | |||
|  |     //{
 | |||
|  |     //    loadTab1();
 | |||
|  |     //    loadTab2();
 | |||
|  |     //    loadTab3();
 | |||
|  |     //    loadTab4();
 | |||
|  |     //}
 | |||
|  | 
 | |||
|  |     //BYTE* PNGB = GetNPK();
 | |||
|  |     //ImGui::RenderText(ImVec2(203, 118), (char*)PNGB);
 | |||
|  |     /*
 | |||
|  |     std::vector<unsigned char> encoded; | |||
|  |     unsigned error_enc = lodepng::encode(encoded, PNGB, 203, 118, LodePNGColorType::LCT_RGBA, unsigned(8)); | |||
|  | 
 | |||
|  |     static ImTextureID bg_tex_id = 0; | |||
|  |     if (!bg_tex_id) | |||
|  |     { | |||
|  |         //<2F><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>opencv<63><76><EFBFBD><EFBFBD>ͼƬ<CDBC><C6AC>Ȼ<EFBFBD><C8BB>Ҳ<EFBFBD><D2B2><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>ͼƬ
 | |||
|  |         //loadTexture<72><65>һ<EFBFBD><D2BB><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD>ĺ<EFBFBD><C4BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼƬ<CDBC>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֪<EFBFBD><D6AA><EFBFBD><EFBFBD>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>аٶ<D0B0>
 | |||
|  |          | |||
|  | 
 | |||
|  |         bg_tex_id = &encoded; | |||
|  |     } | |||
|  | 
 | |||
|  |     ImGui::Image(bg_tex_id, ImGui::GetContentRegionAvail()); | |||
|  |     */ | |||
|  |      | |||
|  | 
 | |||
|  |     ImGui::EndTabBar(); | |||
|  |     ImGui::End(); | |||
|  |     ImGui::EndFrame(); | |||
|  |     ImGui::Render(); | |||
|  |     ImGui_ImplDX9_RenderDrawData(ImGui::GetDrawData()); | |||
|  | 
 | |||
|  | } | |||
|  | 
 | |||
|  | HRESULT __stdcall hkEndScene(IDirect3DDevice9* pd3dDevice) | |||
|  | { | |||
|  |     /*
 | |||
|  |     static int num = 0; | |||
|  |     std::cout << "D3d:" << num << std::endl; | |||
|  |     ++num; | |||
|  |     */ | |||
|  |     g_pd3dDevice = pd3dDevice; | |||
|  |     Helpers::UnHookFunction((PVOID*)(&oEndScene), hkEndScene); | |||
|  | 
 | |||
|  |     // IMGUI<55><49>ʼ<EFBFBD><CABC>
 | |||
|  |     static bool firstCall = TRUE; | |||
|  |     if (firstCall) | |||
|  |     { | |||
|  |         firstCall = !firstCall; | |||
|  |         MineImGuiInit(pd3dDevice); | |||
|  |         oWndProc = (WNDPROC)SetWindowLongPtr(g_hWnd, WNDPROC_INDEX, (LONG_PTR)hkWndProc); | |||
|  |     } | |||
|  | 
 | |||
|  |     if (IMGUISW == true) | |||
|  |     { | |||
|  |         //DrawCustom(pd3dDevice);
 | |||
|  |         IMGUISW = false; | |||
|  |     } | |||
|  |     //DrawCustom();
 | |||
|  | 
 | |||
|  |     HRESULT result = pd3dDevice->EndScene(); | |||
|  |     Helpers::HookFunction((PVOID*)(&oEndScene), hkEndScene); | |||
|  |     return result; | |||
|  | } | |||
|  | 
 | |||
|  | HRESULT __stdcall hkReset(IDirect3DDevice9* pd3dDevice, D3DPRESENT_PARAMETERS* pPresentationParameters) | |||
|  | { | |||
|  |     std::cout << "Im Going" << std::endl; | |||
|  |     Helpers::UnHookFunction((PVOID*)(&oReset), &hkReset); | |||
|  |     ImGui_ImplDX9_InvalidateDeviceObjects(); | |||
|  |     HRESULT tmpReset = pd3dDevice->Reset(pPresentationParameters); | |||
|  |     ImGui_ImplDX9_CreateDeviceObjects(); | |||
|  |     Helpers::HookFunction((PVOID*)(&oReset), hkReset); | |||
|  |     return tmpReset; | |||
|  | } | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | IDirect3DDevice9* imguiC::GetD3dDev9() | |||
|  | { | |||
|  |     return g_pd3dDevice; | |||
|  | } | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | typedef struct tagWNDINFO | |||
|  | { | |||
|  |     DWORD dwProcessId; | |||
|  |     HWND hWnd; | |||
|  | } WNDINFO, * LPWNDINFO; | |||
|  | //ö<>ٴ<EFBFBD><D9B4>ڹ<EFBFBD><DAB9><EFBFBD>
 | |||
|  | static BOOL CALLBACK EnumProc(HWND hWnd, LPARAM lParam) | |||
|  | { | |||
|  |     DWORD dwProcessId; | |||
|  |     GetWindowThreadProcessId(hWnd, &dwProcessId); | |||
|  |     LPWNDINFO pInfo = (LPWNDINFO)lParam; | |||
|  | 
 | |||
|  |     if (dwProcessId == pInfo->dwProcessId) | |||
|  |     { | |||
|  |         pInfo->hWnd = hWnd; | |||
|  |         return FALSE; | |||
|  |     } | |||
|  |     return TRUE; | |||
|  | } | |||
|  | //<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ھ<EFBFBD><DABE><EFBFBD>
 | |||
|  | static HWND GetProcessMainWnd() | |||
|  | { | |||
|  |     DWORD dwProcessId = ::GetCurrentProcessId(); | |||
|  |     WNDINFO wi; | |||
|  |     wi.dwProcessId = dwProcessId; | |||
|  |     wi.hWnd = NULL; | |||
|  |     EnumWindows(EnumProc, (LPARAM)&wi); | |||
|  |     return wi.hWnd; | |||
|  | } | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | void imguiC::Init() | |||
|  | { | |||
|  |     IMGUISW = true; | |||
|  |     /*
 | |||
|  |     static bool Sw = false; | |||
|  |     if (!Sw) | |||
|  |     { | |||
|  |         // <20><><EFBFBD><EFBFBD>IMGUI <20>汾
 | |||
|  |         IMGUI_CHECKVERSION(); | |||
|  |         ImGui::CreateContext(); | |||
|  |         ImGuiIO& io = ImGui::GetIO(); (void)io; | |||
|  |         io.ConfigFlags = ImGuiConfigFlags_NoMouseCursorChange; | |||
|  |         io.WantSaveIniSettings = false; | |||
|  |         io.IniFilename = NULL; | |||
|  | 
 | |||
|  |         ImGui::StyleColorsDark(); | |||
|  | 
 | |||
|  |         ImFontConfig f_cfg; | |||
|  |         f_cfg.FontDataOwnedByAtlas = false; | |||
|  |         const ImFont* font = io.Fonts->AddFontFromMemoryTTF((void*)baidu_font_data, baidu_font_size, 17.0f, &f_cfg, io.Fonts->GetGlyphRangesChineseSimplifiedCommon()); | |||
|  | 
 | |||
|  |         ImGui_ImplWin32_Init(g_hWnd); | |||
|  |         ImGui_ImplDX9_Init(g_pd3dDevice); | |||
|  |         Sw = true; | |||
|  |     } | |||
|  | 
 | |||
|  | 
 | |||
|  |     //g_pd3dDevice->BeginScene();
 | |||
|  | 
 | |||
|  |     // <20><><EFBFBD>濪ʼ<E6BFAA><CABC><EFBFBD><EFBFBD>
 | |||
|  |     ImGui_ImplDX9_NewFrame(); | |||
|  |     ImGui_ImplWin32_NewFrame(); | |||
|  | 
 | |||
|  |     ImGui::NewFrame(); | |||
|  | 
 | |||
|  |     // <20><><EFBFBD>ڴ<EFBFBD>С
 | |||
|  |     ImGui::SetNextWindowPos(ImVec2(50, 50), ImGuiCond_FirstUseEver); | |||
|  |     ImGui::SetNextWindowSize(ImVec2(350, 450), ImGuiCond_FirstUseEver); | |||
|  | 
 | |||
|  |     ImGui::Begin(u8"Imgui_Test", &TmainBeginSate); | |||
|  | 
 | |||
|  |     ImGui::EndTabBar(); | |||
|  |     ImGui::End(); | |||
|  |     ImGui::EndFrame(); | |||
|  |     ImGui::Render(); | |||
|  |     ImGui_ImplDX9_RenderDrawData(ImGui::GetDrawData()); | |||
|  | 
 | |||
|  |     //g_pd3dDevice->EndScene();
 | |||
|  |     */ | |||
|  | } | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | void imguiC::Run() | |||
|  | { | |||
|  |     //while (true)
 | |||
|  |     //{
 | |||
|  |     //    if (DNFTOOL::GetHook(0x1A5FB4C, "0x14+0x28+") == 6)
 | |||
|  |     //    {
 | |||
|  |     //        std::cout << "<22><>ʼע<CABC><D7A2>" << std::endl;
 | |||
|  |     //        break;
 | |||
|  |     //    }
 | |||
|  |     //}
 | |||
|  | 
 | |||
|  |     // <20><>ȡĿ<C8A1><C4BF><EFBFBD><EFBFBD>Ϸ<EFBFBD><CFB7><EFBFBD>ھ<EFBFBD><DABE><EFBFBD>
 | |||
|  |     //g_hWnd = FindWindowA("DNF Taiwan", "DNF Taiwan");
 | |||
|  |     g_hWnd = GetProcessMainWnd(); | |||
|  |     //std::cout << g_hWnd << std::endl;
 | |||
|  |     // <20><><EFBFBD><EFBFBD>D39<33>豸<EFBFBD><E8B1B8><EFBFBD><EFBFBD>
 | |||
|  |     g_Direct3D9 = Direct3DCreate9(D3D_SDK_VERSION); | |||
|  | 
 | |||
|  |     // <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ṹ<EFBFBD><E1B9B9>
 | |||
|  |     memset(&g_present, 0, sizeof(g_present)); | |||
|  |     g_present.Windowed = TRUE; | |||
|  |     g_present.SwapEffect = D3DSWAPEFFECT_DISCARD; | |||
|  |     g_present.BackBufferFormat = D3DFMT_UNKNOWN; | |||
|  |     g_present.EnableAutoDepthStencil = TRUE; | |||
|  |     g_present.AutoDepthStencilFormat = D3DFMT_D16; | |||
|  | 
 | |||
|  | 
 | |||
|  |     // <20><><EFBFBD><EFBFBD>d3d9<64>豸<EFBFBD><E8B1B8>ʶ
 | |||
|  |     HRESULT result = g_Direct3D9->CreateDevice( | |||
|  |         D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, | |||
|  |         g_hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, | |||
|  |         &g_present, &g_pd3dDevice | |||
|  |     ); | |||
|  | 
 | |||
|  |     //// <20><>ʼhook<6F><6B>Ӧ<EFBFBD><D3A6>D3D9<44><39><EFBFBD><EFBFBD>
 | |||
|  |     dDeviceVT = (DWORD*)*(DWORD*)g_pd3dDevice; | |||
|  |     oReset = (Reset_t)dDeviceVT[16]; | |||
|  |     oBeginScene = (EndScene_t)dDeviceVT[41]; | |||
|  |     oEndScene = (EndScene_t)dDeviceVT[42]; | |||
|  | 
 | |||
|  |     Helpers::HookFunction((PVOID*)(&oReset), hkReset); | |||
|  |     //Helpers::HookFunction((PVOID*)(&oBeginScene), hkBeginScene);
 | |||
|  |     Helpers::HookFunction((PVOID*)(&oEndScene), hkEndScene); | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | } |