Move the message display thing out of Render.cpp

git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@2335 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
hrydgard
2009-02-21 12:53:10 +00:00
parent 731dec6889
commit fe0be64bd3
9 changed files with 392 additions and 333 deletions

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="Windows-1252"?> <?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject <VisualStudioProject
ProjectType="Visual C++" ProjectType="Visual C++"
Version="9.00" Version="9,00"
Name="Plugin_VideoOGL" Name="Plugin_VideoOGL"
ProjectGUID="{CFDCEE0E-FA45-4F72-9FCC-0B88F5A75160}" ProjectGUID="{CFDCEE0E-FA45-4F72-9FCC-0B88F5A75160}"
RootNamespace="Plugin_VideoOGL" RootNamespace="Plugin_VideoOGL"
@ -758,6 +758,14 @@
<Filter <Filter
Name="Render" Name="Render"
> >
<File
RelativePath=".\Src\OnScreenDisplay.cpp"
>
</File>
<File
RelativePath=".\Src\OnScreenDisplay.h"
>
</File>
<File <File
RelativePath=".\Src\PixelShaderCache.cpp" RelativePath=".\Src\PixelShaderCache.cpp"
> >

View File

@ -32,7 +32,7 @@
#include "../Config.h" #include "../Config.h"
#include "main.h" #include "main.h"
#include "Win32.h" #include "Win32.h"
#include "Render.h" // for AddMessage #include "OnScreenDisplay.h" // for AddMessage
#include "StringUtil.h" // Common: For StringFromFormat #include "StringUtil.h" // Common: For StringFromFormat
////////////////////////////////// //////////////////////////////////
@ -70,12 +70,13 @@ BOOL APIENTRY DllMain(HINSTANCE hinstDLL, // DLL module handle
int argc = 0; int argc = 0;
char **argv = NULL; char **argv = NULL;
wxEntryStart(argc, argv); wxEntryStart(argc, argv);
if ( !wxTheApp || !wxTheApp->CallOnInit() ) if (!wxTheApp || !wxTheApp->CallOnInit())
return FALSE; return FALSE;
} }
break; break;
case DLL_PROCESS_DETACH: case DLL_PROCESS_DETACH:
// This causes a "stop hang", if the gfx config dialog has been opened.
wxEntryCleanup(); // Use wxUninitialize() if you don't want GUI wxEntryCleanup(); // Use wxUninitialize() if you don't want GUI
break; break;
default: default:
@ -96,42 +97,42 @@ extern bool gShowDebugger;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
namespace EmuWindow namespace EmuWindow
{ {
HWND m_hWnd = NULL; // The new window that is created here
HWND m_hParent = NULL;
HWND m_hMain = NULL; // The main CPanel
HINSTANCE m_hInstance = NULL; HWND m_hWnd = NULL; // The new window that is created here
WNDCLASSEX wndClass; HWND m_hParent = NULL;
const TCHAR m_szClassName[] = "DolphinEmuWnd"; HWND m_hMain = NULL; // The main CPanel
int g_winstyle;
// ------------------------------------------ HINSTANCE m_hInstance = NULL;
/* Invisible cursor option. In the lack of a predefined IDC_BLANK we make WNDCLASSEX wndClass;
const TCHAR m_szClassName[] = "DolphinEmuWnd";
int g_winstyle;
// ------------------------------------------
/* Invisible cursor option. In the lack of a predefined IDC_BLANK we make
an empty transparent cursor */ an empty transparent cursor */
// ------------------ // ------------------
HCURSOR hCursor = NULL, hCursorBlank = NULL; HCURSOR hCursor = NULL, hCursorBlank = NULL;
void CreateCursors(HINSTANCE hInstance) void CreateCursors(HINSTANCE hInstance)
{ {
BYTE ANDmaskCursor[] = { 0xff }; BYTE ANDmaskCursor[] = { 0xff };
BYTE XORmaskCursor[] = { 0x00 }; BYTE XORmaskCursor[] = { 0x00 };
hCursorBlank = CreateCursor(hInstance, 0,0, 1,1, ANDmaskCursor,XORmaskCursor); hCursorBlank = CreateCursor(hInstance, 0,0, 1,1, ANDmaskCursor,XORmaskCursor);
hCursor = LoadCursor(NULL, IDC_ARROW); hCursor = LoadCursor(NULL, IDC_ARROW);
} }
HWND GetWnd()
HWND GetWnd() {
{
return m_hWnd; return m_hWnd;
} }
HWND GetParentWnd() HWND GetParentWnd()
{ {
return m_hParent; return m_hParent;
} }
LRESULT CALLBACK WndProc( HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam ) LRESULT CALLBACK WndProc( HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam )
{ {
HDC hdc; HDC hdc;
PAINTSTRUCT ps; PAINTSTRUCT ps;
switch( iMsg ) switch( iMsg )
@ -178,7 +179,7 @@ namespace EmuWindow
if (g_Config.bEFBCopyDisableHotKey) if (g_Config.bEFBCopyDisableHotKey)
{ {
g_Config.bEFBCopyDisable = !g_Config.bEFBCopyDisable; g_Config.bEFBCopyDisable = !g_Config.bEFBCopyDisable;
Renderer::AddMessage(StringFromFormat("Copy EFB was turned %s", OSD::AddMessage(StringFromFormat("Copy EFB was turned %s",
g_Config.bEFBCopyDisable ? "off" : "on").c_str(), 5000); g_Config.bEFBCopyDisable ? "off" : "on").c_str(), 5000);
} }
break; break;
@ -250,12 +251,12 @@ namespace EmuWindow
} }
return DefWindowProc(hWnd, iMsg, wParam, lParam); return DefWindowProc(hWnd, iMsg, wParam, lParam);
} }
// This is called from Create() // This is called from Create()
HWND OpenWindow(HWND parent, HINSTANCE hInstance, int width, int height, const TCHAR *title) HWND OpenWindow(HWND parent, HINSTANCE hInstance, int width, int height, const TCHAR *title)
{ {
wndClass.cbSize = sizeof( wndClass ); wndClass.cbSize = sizeof( wndClass );
wndClass.style = CS_HREDRAW | CS_VREDRAW; wndClass.style = CS_HREDRAW | CS_VREDRAW;
wndClass.lpfnWndProc = WndProc; wndClass.lpfnWndProc = WndProc;
@ -318,10 +319,10 @@ namespace EmuWindow
} }
return m_hWnd; return m_hWnd;
} }
void Show() void Show()
{ {
ShowWindow(m_hWnd, SW_SHOW); ShowWindow(m_hWnd, SW_SHOW);
BringWindowToTop(m_hWnd); BringWindowToTop(m_hWnd);
UpdateWindow(m_hWnd); UpdateWindow(m_hWnd);
@ -335,24 +336,24 @@ namespace EmuWindow
ini.Get("ShowOnStart", "VideoWindow", &bVideoWindow, false); ini.Get("ShowOnStart", "VideoWindow", &bVideoWindow, false);
if(bVideoWindow) DoDllDebugger(); if(bVideoWindow) DoDllDebugger();
*/ */
} }
HWND Create(HWND hParent, HINSTANCE hInstance, const TCHAR *title) HWND Create(HWND hParent, HINSTANCE hInstance, const TCHAR *title)
{ {
return OpenWindow(hParent, hInstance, 640, 480, title); return OpenWindow(hParent, hInstance, 640, 480, title);
} }
void Close() void Close()
{ {
DestroyWindow(m_hWnd); DestroyWindow(m_hWnd);
UnregisterClass(m_szClassName, m_hInstance); UnregisterClass(m_szClassName, m_hInstance);
} }
// ------------------------------------------ // ------------------------------------------
// Set the size of the child or main window // Set the size of the child or main window
// ------------------ // ------------------
void SetSize(int width, int height) void SetSize(int width, int height)
{ {
RECT rc = {0, 0, width, height}; RECT rc = {0, 0, width, height};
AdjustWindowRect(&rc, WS_OVERLAPPEDWINDOW, false); AdjustWindowRect(&rc, WS_OVERLAPPEDWINDOW, false);
@ -365,7 +366,7 @@ namespace EmuWindow
rc.top = (1024 - h)/2; rc.top = (1024 - h)/2;
rc.bottom = rc.top + h; rc.bottom = rc.top + h;
::MoveWindow(m_hWnd, rc.left,rc.top,rc.right-rc.left,rc.bottom-rc.top, TRUE); ::MoveWindow(m_hWnd, rc.left,rc.top,rc.right-rc.left,rc.bottom-rc.top, TRUE);
} }
} // EmuWindow } // EmuWindow
//////////////////////////////////// ////////////////////////////////////

View File

@ -0,0 +1,80 @@
// Copyright (C) 2003-2008 Dolphin Project.
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, version 2.0.
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License 2.0 for more details.
// A copy of the GPL 2.0 should have been included with the program.
// If not, see http://www.gnu.org/licenses/
// Official SVN repository and contact information can be found at
// http://code.google.com/p/dolphin-emu/
#include <list>
#include "Common.h"
#include "GLUtil.h"
#include "OnScreenDisplay.h"
#include "Render.h"
namespace OSD
{
struct MESSAGE
{
MESSAGE() {}
MESSAGE(const char* p, u32 dw) { strcpy(str, p); dwTimeStamp = dw; }
char str[255];
u32 dwTimeStamp;
};
static std::list<MESSAGE> s_listMsgs;
void AddMessage(const char* pstr, u32 ms)
{
s_listMsgs.push_back(MESSAGE(pstr, timeGetTime() + ms));
}
void DrawMessages()
{
GLboolean wasEnabled = glIsEnabled(GL_BLEND);
if (!wasEnabled)
glEnable(GL_BLEND);
if (s_listMsgs.size() > 0) {
int left = 25, top = 15;
std::list<MESSAGE>::iterator it = s_listMsgs.begin();
while (it != s_listMsgs.end())
{
int time_left = (int)(it->dwTimeStamp - timeGetTime());
int alpha = 255;
if (time_left < 1024)
{
alpha = time_left >> 2;
if (time_left < 0) alpha = 0;
}
alpha <<= 24;
Renderer::RenderText(it->str, left+1, top+1, 0x000000|alpha);
Renderer::RenderText(it->str, left, top, 0xffff30|alpha);
top += 15;
if (time_left <= 0)
it = s_listMsgs.erase(it);
else
++it;
}
}
if (!wasEnabled) glDisable(GL_BLEND);
}
} // namespace

View File

@ -0,0 +1,30 @@
// Copyright (C) 2003-2008 Dolphin Project.
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, version 2.0.
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License 2.0 for more details.
// A copy of the GPL 2.0 should have been included with the program.
// If not, see http://www.gnu.org/licenses/
// Official SVN repository and contact information can be found at
// http://code.google.com/p/dolphin-emu/
#ifndef _OSD_H
#define _OSD_H
namespace OSD
{
// On-screen message display
void AddMessage(const char* str, u32 ms);
void DrawMessages(); // draw the current messages on the screen. Only call once per frame.
} // namespace
#endif

View File

@ -17,7 +17,6 @@
#include "Globals.h" #include "Globals.h"
#include <list>
#include <vector> #include <vector>
#include <cmath> #include <cmath>
@ -45,6 +44,7 @@
#include "VertexLoaderManager.h" #include "VertexLoaderManager.h"
#include "VertexLoader.h" #include "VertexLoader.h"
#include "XFB.h" #include "XFB.h"
#include "OnScreenDisplay.h"
#include "Timer.h" #include "Timer.h"
#include "main.h" // Local #include "main.h" // Local
@ -57,20 +57,12 @@
#else #else
#endif #endif
struct MESSAGE
{
MESSAGE() {}
MESSAGE(const char* p, u32 dw) { strcpy(str, p); dwTimeStamp = dw; }
char str[255];
u32 dwTimeStamp;
};
CGcontext g_cgcontext; CGcontext g_cgcontext;
CGprofile g_cgvProf; CGprofile g_cgvProf;
CGprofile g_cgfProf; CGprofile g_cgfProf;
static RasterFont* s_pfont = NULL; RasterFont* s_pfont = NULL;
static std::list<MESSAGE> s_listMsgs;
static bool s_bFullscreen = false; static bool s_bFullscreen = false;
static bool s_bOutputCgErrors = true; static bool s_bOutputCgErrors = true;
@ -416,58 +408,6 @@ bool Renderer::InitializeGL()
return err == GL_NO_ERROR; return err == GL_NO_ERROR;
} }
void Renderer::AddMessage(const char* pstr, u32 ms)
{
s_listMsgs.push_back(MESSAGE(pstr, timeGetTime() + ms));
}
void Renderer::ProcessMessages()
{
GLboolean wasEnabled = glIsEnabled(GL_BLEND);
if (!wasEnabled) glEnable(GL_BLEND);
if (s_listMsgs.size() > 0) {
int left = 25, top = 15;
std::list<MESSAGE>::iterator it = s_listMsgs.begin();
while (it != s_listMsgs.end())
{
int time_left = (int)(it->dwTimeStamp - timeGetTime());
int alpha = 255;
if (time_left < 1024)
{
alpha = time_left >> 2;
if (time_left < 0) alpha = 0;
}
alpha <<= 24;
RenderText(it->str, left+1, top+1, 0x000000|alpha);
RenderText(it->str, left, top, 0xffff30|alpha);
top += 15;
if (time_left <= 0)
it = s_listMsgs.erase(it);
else ++it;
}
}
if (!wasEnabled) glDisable(GL_BLEND);
}
void Renderer::RenderText(const char* pstr, int left, int top, u32 color)
{
int nBackbufferWidth = (int)OpenGL_GetWidth();
int nBackbufferHeight = (int)OpenGL_GetHeight();
glColor4f(
((color>>16) & 0xff)/255.0f,
((color>> 8) & 0xff)/255.0f,
((color>> 0) & 0xff)/255.0f,
((color>>24) & 0xFF)/255.0f
);
s_pfont->printMultilineText(pstr, left * 2.0f / (float)nBackbufferWidth - 1, 1 - top * 2.0f / (float)nBackbufferHeight,0,nBackbufferWidth,nBackbufferHeight);
}
////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////
// Return the rendering window width and height // Return the rendering window width and height
@ -989,7 +929,7 @@ void Renderer::SwapBuffers()
Renderer::RenderText(debugtext_buffer, 21, 21, 0xDD000000); Renderer::RenderText(debugtext_buffer, 21, 21, 0xDD000000);
Renderer::RenderText(debugtext_buffer, 20, 20, 0xFF00FFFF); Renderer::RenderText(debugtext_buffer, 20, 20, 0xFF00FFFF);
Renderer::ProcessMessages(); OSD::DrawMessages();
#if defined(DVPROFILE) #if defined(DVPROFILE)
if (g_bWriteProfile) { if (g_bWriteProfile) {
@ -1035,6 +975,18 @@ void Renderer::SwapBuffers()
} }
} }
void Renderer::RenderText(const char* pstr, int left, int top, u32 color)
{
int nBackbufferWidth = (int)OpenGL_GetWidth();
int nBackbufferHeight = (int)OpenGL_GetHeight();
glColor4f(((color>>16) & 0xff)/255.0f, ((color>> 8) & 0xff)/255.0f,
((color>> 0) & 0xff)/255.0f, ((color>>24) & 0xFF)/255.0f);
s_pfont->printMultilineText(pstr,
left * 2.0f / (float)nBackbufferWidth - 1,
1 - top * 2.0f / (float)nBackbufferHeight,
0, nBackbufferWidth, nBackbufferHeight);
}
bool Renderer::SaveRenderTarget(const char* filename, int jpeg) bool Renderer::SaveRenderTarget(const char* filename, int jpeg)
{ {
bool bflip = true; bool bflip = true;
@ -1083,13 +1035,6 @@ void HandleGLError()
if (!error) if (!error)
return; return;
// What is this for?
// int w, h;
// GLint fmt;
// glGetRenderbufferParameterivEXT(GL_COLOR_ATTACHMENT0_EXT, GL_RENDERBUFFER_INTERNAL_FORMAT_EXT, &fmt);
// glGetRenderbufferParameterivEXT(GL_COLOR_ATTACHMENT0_EXT, GL_RENDERBUFFER_WIDTH_EXT, (GLint *)&w);
// glGetRenderbufferParameterivEXT(GL_COLOR_ATTACHMENT0_EXT, GL_RENDERBUFFER_HEIGHT_EXT, (GLint *)&h);
switch(error) switch(error)
{ {
case GL_FRAMEBUFFER_COMPLETE_EXT: case GL_FRAMEBUFFER_COMPLETE_EXT:
@ -1133,8 +1078,6 @@ void HandleCgError(CGcontext ctx, CGerror err, void* appdata)
if (listing != NULL) { if (listing != NULL) {
ERROR_LOG(" last listing: %s\n", listing); ERROR_LOG(" last listing: %s\n", listing);
} }
// glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &loc);
// printf("pos: %d\n", loc);
} }
} }
@ -1186,7 +1129,7 @@ void UpdateViewport()
I don't allow this option together with UseXFB is that they are supplements and the XFB function I don't allow this option together with UseXFB is that they are supplements and the XFB function
should be able to produce the same result */ should be able to produce the same result */
//if(g_Config.bStretchToFit && !g_Config.bUseXFB) //if(g_Config.bStretchToFit && !g_Config.bUseXFB)
if(false) if (false)
{ {
XOffset = (640 - GLScissorW); XOffset = (640 - GLScissorW);
YOffset = (480 - GLScissorH); YOffset = (480 - GLScissorH);
@ -1299,7 +1242,6 @@ void UpdateViewport()
glDepthRange(GLNear, GLFar); glDepthRange(GLNear, GLFar);
// ------------------------------------- // -------------------------------------
// Logging // Logging
/* /*
RECT RcTop, RcParent, RcChild; RECT RcTop, RcParent, RcChild;

View File

@ -96,12 +96,6 @@ public:
// initialize opengl standard values (like viewport) // initialize opengl standard values (like viewport)
static bool InitializeGL(); static bool InitializeGL();
static void AddMessage(const char* str, u32 ms);
static void ProcessMessages(); // draw the current messages on the screen
static void RenderText(const char* pstr, int left, int top, u32 color);
static int GetTargetWidth();
static int GetTargetHeight();
static void SetCgErrorOutput(bool bOutput); static void SetCgErrorOutput(bool bOutput);
static void ResetGLState(); static void ResetGLState();
@ -109,9 +103,6 @@ public:
static bool IsUsingATIDrawBuffers(); static bool IsUsingATIDrawBuffers();
static bool HaveStencilBuffer(); static bool HaveStencilBuffer();
static void SetZBufferRender(); // sets rendering of the zbuffer using MRTs
static GLuint GetZBufferTarget();
static void SetColorMask(); static void SetColorMask();
static void SetBlendMode(bool forceUpdate); static void SetBlendMode(bool forceUpdate);
static bool SetScissorRect(); static bool SetScissorRect();
@ -119,19 +110,27 @@ public:
static void SetRenderMode(RenderMode mode); static void SetRenderMode(RenderMode mode);
static RenderMode GetRenderMode(); static RenderMode GetRenderMode();
// Render target management
static int GetTargetWidth();
static int GetTargetHeight();
static void SetFramebuffer(GLuint fb);
static void SetZBufferRender(); // sets rendering of the zbuffer using MRTs
static void SetRenderTarget(GLuint targ); // if targ is 0, sets to original render target static void SetRenderTarget(GLuint targ); // if targ is 0, sets to original render target
static void SetDepthTarget(GLuint targ); static void SetDepthTarget(GLuint targ);
static void SetFramebuffer(GLuint fb);
static GLuint GetRenderTarget(); static GLuint GetRenderTarget();
static GLuint GetZBufferTarget();
// Random utilities
static void RenderText(const char* pstr, int left, int top, u32 color);
static bool SaveRenderTarget(const char* filename, int jpeg);
// Finish up the current frame, print some stats // Finish up the current frame, print some stats
static void Swap(const TRectangle& rc); static void Swap(const TRectangle& rc);
static void SwapBuffers(); static void SwapBuffers();
static bool SaveRenderTarget(const char* filename, int jpeg);
}; };
#endif #endif

View File

@ -25,6 +25,7 @@ files = [
'XFB.cpp', 'XFB.cpp',
'XFStructs.cpp', 'XFStructs.cpp',
'TextureConversionShader.cpp', 'TextureConversionShader.cpp',
'OnScreenDisplay.cpp',
] ]
compileFlags = [ compileFlags = [
'-fPIC', '-fPIC',

View File

@ -49,6 +49,7 @@
#include "XFB.h" #include "XFB.h"
#include "XFBConvert.h" #include "XFBConvert.h"
#include "TextureConverter.h" #include "TextureConverter.h"
#include "OnScreenDisplay.h"
#include "VideoState.h" #include "VideoState.h"
/////////////////////////////////////////////// ///////////////////////////////////////////////
@ -223,7 +224,7 @@ void Initialize(void *init)
// Now the window handle is written // Now the window handle is written
_pVideoInitialize->pWindowHandle = g_VideoInitialize.pWindowHandle; _pVideoInitialize->pWindowHandle = g_VideoInitialize.pWindowHandle;
Renderer::AddMessage("Dolphin OpenGL Video Plugin" ,5000); OSD::AddMessage("Dolphin OpenGL Video Plugin" ,5000);
} }
void DoState(unsigned char **ptr, int mode) { void DoState(unsigned char **ptr, int mode) {
@ -329,7 +330,7 @@ unsigned int Video_Screenshot(TCHAR* _szFilename)
{ {
char msg[255]; char msg[255];
sprintf(msg, "saved %s\n", _szFilename); sprintf(msg, "saved %s\n", _szFilename);
Renderer::AddMessage(msg, 500); OSD::AddMessage(msg, 500);
return true; return true;
} }
return false; return false;
@ -359,5 +360,5 @@ void Video_UpdateXFB(u8* _pXFB, u32 _dwWidth, u32 _dwHeight, s32 _dwYOffset, boo
void Video_AddMessage(const char* pstr, u32 milliseconds) void Video_AddMessage(const char* pstr, u32 milliseconds)
{ {
Renderer::AddMessage(pstr, milliseconds); OSD::AddMessage(pstr, milliseconds);
} }

View File

@ -132,7 +132,7 @@ BOOL APIENTRY DllMain(HINSTANCE hinstDLL, // DLL module handle
int argc = 0; int argc = 0;
char **argv = NULL; char **argv = NULL;
wxEntryStart(argc, argv); wxEntryStart(argc, argv);
if ( !wxTheApp || !wxTheApp->CallOnInit() ) if (!wxTheApp || !wxTheApp->CallOnInit())
return FALSE; return FALSE;
} }
break; break;
@ -211,7 +211,7 @@ extern "C" void Initialize(void *init)
// Update the GUI if the configuration window is already open // Update the GUI if the configuration window is already open
#if defined(HAVE_WX) && HAVE_WX #if defined(HAVE_WX) && HAVE_WX
if(g_FrameOpen) if (g_FrameOpen)
{ {
// Save the settings // Save the settings
g_Config.Save(); g_Config.Save();
@ -256,7 +256,7 @@ extern "C" void Shutdown(void)
} }
#if HAVE_WIIUSE #if HAVE_WIIUSE
if(g_RealWiiMoteInitialized) WiiMoteReal::Shutdown(); if (g_RealWiiMoteInitialized) WiiMoteReal::Shutdown();
#endif #endif
WiiMoteEmu::Shutdown(); WiiMoteEmu::Shutdown();
@ -1058,6 +1058,3 @@ void __Logv(int log, int v, const char *_fmt, ...)
g_WiimoteInitialize.pLog(Msg, v); g_WiimoteInitialize.pLog(Msg, v);
} }