fix bugs
This commit is contained in:
parent
1af108df90
commit
c82fd84a0d
|
|
@ -25,10 +25,14 @@ namespace kiwano
|
|||
namespace memory
|
||||
{
|
||||
|
||||
MemoryAllocator* current_allocator_ = GetGlobalAllocator();
|
||||
MemoryAllocator* current_allocator_ = nullptr;
|
||||
|
||||
MemoryAllocator* GetAllocator()
|
||||
{
|
||||
if (!current_allocator_)
|
||||
{
|
||||
current_allocator_ = GetGlobalAllocator();
|
||||
}
|
||||
return current_allocator_;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -18,6 +18,7 @@
|
|||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
// THE SOFTWARE.
|
||||
|
||||
#include <kiwano/utils/Logger.h>
|
||||
#include <kiwano/platform/Runner.h>
|
||||
#include <kiwano/platform/Application.h>
|
||||
|
||||
|
|
@ -86,6 +87,8 @@ bool Runner::MainLoop(Duration dt)
|
|||
|
||||
Application& app = Application::GetInstance();
|
||||
|
||||
KGE_LOG(dt.Milliseconds());
|
||||
|
||||
// Update modules before poll events
|
||||
app.Update(dt);
|
||||
|
||||
|
|
|
|||
|
|
@ -77,11 +77,10 @@ public:
|
|||
* @param height 高度
|
||||
* @param icon 图标资源ID
|
||||
* @param resizable 窗口大小可拉伸
|
||||
* @param fullscreen 全屏模式
|
||||
* @throw kiwano::SystemError 窗口创建失败时抛出
|
||||
*/
|
||||
static WindowPtr Create(const String& title, uint32_t width, uint32_t height, uint32_t icon = 0,
|
||||
bool resizable = false, bool fullscreen = false);
|
||||
bool resizable = false);
|
||||
|
||||
/**
|
||||
* \~chinese
|
||||
|
|
@ -117,6 +116,12 @@ public:
|
|||
*/
|
||||
WindowHandle GetHandle() const;
|
||||
|
||||
/**
|
||||
* \~chinese
|
||||
* @brief 获取支持的屏幕分辨率列表
|
||||
*/
|
||||
virtual Vector<Resolution> GetResolutions() = 0;
|
||||
|
||||
/**
|
||||
* \~chinese
|
||||
* @brief 设置标题
|
||||
|
|
@ -133,11 +138,12 @@ public:
|
|||
|
||||
/**
|
||||
* \~chinese
|
||||
* @brief 重设窗口大小
|
||||
* @param width 窗口宽度
|
||||
* @param height 窗口高度
|
||||
* @brief 设置窗口分辨率
|
||||
* @param width 分辨率宽度
|
||||
* @param height 分辨率高度
|
||||
* @param fullscreen 是否全屏
|
||||
*/
|
||||
virtual void Resize(uint32_t width, uint32_t height) = 0;
|
||||
virtual void SetResolution(uint32_t width, uint32_t height, bool fullscreen) = 0;
|
||||
|
||||
/**
|
||||
* \~chinese
|
||||
|
|
@ -162,21 +168,6 @@ public:
|
|||
*/
|
||||
virtual void SetCursor(CursorType cursor) = 0;
|
||||
|
||||
/**
|
||||
* \~chinese
|
||||
* @brief 设置分辨率
|
||||
* @param width 分辨率宽度
|
||||
* @param height 分辨率高度
|
||||
* @param fullscreen 是否全屏
|
||||
*/
|
||||
virtual void SetResolution(uint32_t width, uint32_t height, bool fullscreen) = 0;
|
||||
|
||||
/**
|
||||
* \~chinese
|
||||
* @brief 获取支持的屏幕分辨率列表
|
||||
*/
|
||||
virtual Vector<Resolution> GetResolutions() = 0;
|
||||
|
||||
/**
|
||||
* \~chinese
|
||||
* @brief 轮询窗口事件
|
||||
|
|
|
|||
|
|
@ -47,14 +47,12 @@ public:
|
|||
|
||||
virtual ~WindowWin32Impl();
|
||||
|
||||
void Init(const String& title, uint32_t width, uint32_t height, uint32_t icon, bool resizable, bool fullscreen);
|
||||
void Init(const String& title, uint32_t width, uint32_t height, uint32_t icon, bool resizable);
|
||||
|
||||
void SetTitle(const String& title) override;
|
||||
|
||||
void SetIcon(uint32_t icon_resource) override;
|
||||
|
||||
void Resize(uint32_t width, uint32_t height) override;
|
||||
|
||||
void SetMinimumSize(uint32_t width, uint32_t height) override;
|
||||
|
||||
void SetMaximumSize(uint32_t width, uint32_t height) override;
|
||||
|
|
@ -86,13 +84,12 @@ private:
|
|||
std::array<KeyCode, 256> key_map_;
|
||||
};
|
||||
|
||||
WindowPtr Window::Create(const String& title, uint32_t width, uint32_t height, uint32_t icon, bool resizable,
|
||||
bool fullscreen)
|
||||
WindowPtr Window::Create(const String& title, uint32_t width, uint32_t height, uint32_t icon, bool resizable)
|
||||
{
|
||||
WindowWin32ImplPtr ptr = memory::New<WindowWin32Impl>();
|
||||
if (ptr)
|
||||
{
|
||||
ptr->Init(title, width, height, icon, resizable, fullscreen);
|
||||
ptr->Init(title, width, height, icon, resizable);
|
||||
}
|
||||
return ptr;
|
||||
}
|
||||
|
|
@ -199,8 +196,7 @@ WindowWin32Impl::~WindowWin32Impl()
|
|||
}
|
||||
}
|
||||
|
||||
void WindowWin32Impl::Init(const String& title, uint32_t width, uint32_t height, uint32_t icon, bool resizable,
|
||||
bool fullscreen)
|
||||
void WindowWin32Impl::Init(const String& title, uint32_t width, uint32_t height, uint32_t icon, bool resizable)
|
||||
{
|
||||
HINSTANCE hinst = GetModuleHandle(nullptr);
|
||||
WNDCLASSEXA wcex = { 0 };
|
||||
|
|
@ -236,38 +232,22 @@ void WindowWin32Impl::Init(const String& title, uint32_t width, uint32_t height,
|
|||
// Save the device name
|
||||
device_name_ = monitor_info_ex.szDevice;
|
||||
|
||||
int left = -1, top = -1;
|
||||
|
||||
if (fullscreen)
|
||||
{
|
||||
top = monitor_info_ex.rcMonitor.top;
|
||||
left = monitor_info_ex.rcMonitor.left;
|
||||
|
||||
if (width > static_cast<uint32_t>(monitor_info_ex.rcWork.right - left))
|
||||
width = static_cast<uint32_t>(monitor_info_ex.rcWork.right - left);
|
||||
|
||||
if (height > static_cast<uint32_t>(monitor_info_ex.rcWork.bottom - top))
|
||||
height = static_cast<uint32_t>(monitor_info_ex.rcWork.bottom - top);
|
||||
}
|
||||
else
|
||||
{
|
||||
uint32_t screenw = monitor_info_ex.rcWork.right - monitor_info_ex.rcWork.left;
|
||||
uint32_t screenh = monitor_info_ex.rcWork.bottom - monitor_info_ex.rcWork.top;
|
||||
|
||||
uint32_t win_width, win_height;
|
||||
AdjustWindow(width, height, GetStyle(), &win_width, &win_height);
|
||||
|
||||
left = monitor_info_ex.rcWork.left + (screenw - win_width) / 2;
|
||||
top = monitor_info_ex.rcWork.top + (screenh - win_height) / 2;
|
||||
int left = monitor_info_ex.rcWork.left + (screenw - win_width) / 2;
|
||||
int top = monitor_info_ex.rcWork.top + (screenh - win_height) / 2;
|
||||
width = win_width;
|
||||
height = win_height;
|
||||
}
|
||||
|
||||
width_ = width;
|
||||
height_ = height;
|
||||
resizable_ = resizable;
|
||||
handle_ = ::CreateWindowExA(fullscreen ? WS_EX_TOPMOST : 0, "KiwanoAppWnd", title.c_str(), GetStyle(), left, top,
|
||||
width, height, nullptr, nullptr, hinst, nullptr);
|
||||
handle_ = ::CreateWindowExA(0, "KiwanoAppWnd", title.c_str(), GetStyle(), left, top, width, height, nullptr,
|
||||
nullptr, hinst, nullptr);
|
||||
|
||||
if (handle_ == nullptr)
|
||||
{
|
||||
|
|
@ -283,6 +263,21 @@ void WindowWin32Impl::Init(const String& title, uint32_t width, uint32_t height,
|
|||
|
||||
::ShowWindow(handle_, SW_SHOWNORMAL);
|
||||
::UpdateWindow(handle_);
|
||||
|
||||
// Initialize Direct3D resources
|
||||
auto d3d_res = graphics::directx::GetD3DDeviceResources();
|
||||
|
||||
HRESULT hr = d3d_res->Initialize(handle_);
|
||||
|
||||
// Initialize Direct2D resources
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
auto d2d_res = graphics::directx::GetD2DDeviceResources();
|
||||
|
||||
hr = d2d_res->Initialize(d3d_res->GetDXGIDevice(), d3d_res->GetDXGISwapChain());
|
||||
}
|
||||
|
||||
KGE_THROW_IF_FAILED(hr, "Create DirectX resources failed");
|
||||
}
|
||||
|
||||
void WindowWin32Impl::PumpEvents()
|
||||
|
|
@ -313,25 +308,6 @@ void WindowWin32Impl::SetIcon(uint32_t icon_resource)
|
|||
::SendMessage(handle_, WM_SETICON, ICON_SMALL, (LPARAM)icon);
|
||||
}
|
||||
|
||||
void WindowWin32Impl::Resize(uint32_t width, uint32_t height)
|
||||
{
|
||||
KGE_ASSERT(handle_);
|
||||
|
||||
RECT rc = { 0, 0, LONG(width), LONG(height) };
|
||||
::AdjustWindowRect(&rc, GetStyle(), false);
|
||||
|
||||
width = rc.right - rc.left;
|
||||
height = rc.bottom - rc.top;
|
||||
|
||||
MONITORINFOEXA info = GetMoniterInfoEx(handle_);
|
||||
uint32_t screenw = uint32_t(info.rcWork.right - info.rcWork.left);
|
||||
uint32_t screenh = uint32_t(info.rcWork.bottom - info.rcWork.top);
|
||||
int left = screenw > width ? ((screenw - width) / 2) : 0;
|
||||
int top = screenh > height ? ((screenh - height) / 2) : 0;
|
||||
|
||||
::SetWindowPos(handle_, 0, left, top, width, height, SWP_NOZORDER | SWP_NOACTIVATE);
|
||||
}
|
||||
|
||||
void WindowWin32Impl::SetMinimumSize(uint32_t width, uint32_t height)
|
||||
{
|
||||
min_width_ = width;
|
||||
|
|
|
|||
|
|
@ -58,34 +58,14 @@ void RendererImpl::MakeContextForWindow(WindowPtr window)
|
|||
HWND target_window = window->GetHandle();
|
||||
output_size_ = window->GetSize();
|
||||
|
||||
d2d_res_ = nullptr;
|
||||
d3d_res_ = nullptr;
|
||||
d2d_res_ = graphics::directx::GetD2DDeviceResources();
|
||||
d3d_res_ = graphics::directx::GetD3DDeviceResources();
|
||||
|
||||
HRESULT hr = target_window ? S_OK : E_FAIL;
|
||||
|
||||
// Direct3D device resources
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
auto d3d_res = graphics::directx::GetD3DDeviceResources();
|
||||
|
||||
// Initialize Direct3D resources
|
||||
hr = d3d_res->Initialize(target_window);
|
||||
|
||||
// Direct2D device resources
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
d3d_res_ = d3d_res;
|
||||
|
||||
auto d2d_res = graphics::directx::GetD2DDeviceResources();
|
||||
|
||||
// Initialize Direct2D resources
|
||||
hr = d2d_res->Initialize(d3d_res_->GetDXGIDevice(), d3d_res_->GetDXGISwapChain());
|
||||
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
d2d_res_ = d2d_res;
|
||||
|
||||
// Initialize other device resources
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
RenderContextImplPtr ctx = memory::New<RenderContextImpl>();
|
||||
|
||||
hr = ctx->CreateDeviceResources(d2d_res_->GetFactory(), d2d_res_->GetDeviceContext());
|
||||
|
|
@ -118,15 +98,11 @@ void RendererImpl::MakeContextForWindow(WindowPtr window)
|
|||
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
hr = IResourceFontCollectionLoader::Create(&res_font_collection_loader_,
|
||||
res_font_file_loader_.Get());
|
||||
hr = IResourceFontCollectionLoader::Create(&res_font_collection_loader_, res_font_file_loader_.Get());
|
||||
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
hr = d2d_res_->GetDWriteFactory()->RegisterFontCollectionLoader(
|
||||
res_font_collection_loader_.Get());
|
||||
}
|
||||
}
|
||||
hr = d2d_res_->GetDWriteFactory()->RegisterFontCollectionLoader(res_font_collection_loader_.Get());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -78,6 +78,20 @@ bool Ticker::Tick(Duration dt)
|
|||
return false;
|
||||
}
|
||||
|
||||
void Ticker::Pause()
|
||||
{
|
||||
is_paused_ = true;
|
||||
if (timer_)
|
||||
timer_->Pause();
|
||||
}
|
||||
|
||||
void Ticker::Resume()
|
||||
{
|
||||
is_paused_ = false;
|
||||
if (timer_)
|
||||
timer_->Resume();
|
||||
}
|
||||
|
||||
Duration Ticker::GetDeltaTime()
|
||||
{
|
||||
return delta_time_;
|
||||
|
|
|
|||
|
|
@ -110,16 +110,6 @@ private:
|
|||
TimerPtr timer_;
|
||||
};
|
||||
|
||||
inline void Ticker::Pause()
|
||||
{
|
||||
is_paused_ = true;
|
||||
}
|
||||
|
||||
inline void Ticker::Resume()
|
||||
{
|
||||
is_paused_ = false;
|
||||
}
|
||||
|
||||
inline bool Ticker::IsPausing() const
|
||||
{
|
||||
return is_paused_;
|
||||
|
|
|
|||
Loading…
Reference in New Issue