-
Notifications
You must be signed in to change notification settings - Fork 0
/
Framework.cpp
164 lines (140 loc) · 3.5 KB
/
Framework.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
#include <memory>
#include <sstream>
#include "Graphics/Graphics.h"
#include "Input/Input.h"
#include "SceneTitle.h"
#include "SceneManager.h"
#include "Framework.h"
#include "EffectManager.h"
// 垂直同期間隔設定
static const int syncInterval = 1;
// 課題
bool taskEffekseerPlay = true;
// コンストラクタ
Framework::Framework(HWND hWnd)
: hWnd(hWnd)
, input(hWnd)
, graphics(hWnd)
{
// エフェクトマネージャー初期化
EffectManager::Instance().Initialize();
// シーン初期化
SceneManager::Instance().ChangeScene(new SceneTitle);
}
// デストラクタ
Framework::~Framework()
{
// シーン終了化
SceneManager::Instance().Clear();
// エフェクトマネージャー終了化
EffectManager::Instance().Finalize();
}
// 更新処理
void Framework::Update(float elapsedTime/*Elapsed seconds from last frame*/)
{
// 入力更新処理
input.Update();
// シーン更新処理
SceneManager::Instance().Update(elapsedTime);
}
// 描画処理
void Framework::Render(float elapsedTime/*Elapsed seconds from last frame*/)
{
// 別スレッド中にデバイスコンテキストが使われていた場合に
// 同時アクセスしないように排他制御する
std::lock_guard<std::mutex> lock(graphics.GetMutex());
ID3D11DeviceContext* dc = graphics.GetDeviceContext();
// IMGUIフレーム開始処理
graphics.GetImGuiRenderer()->NewFrame();
// シーン描画処理
SceneManager::Instance().Render();
// IMGUI描画
graphics.GetImGuiRenderer()->Render(dc);
// バックバッファに描画した画を画面に表示する。
graphics.GetSwapChain()->Present(syncInterval, 0);
}
// フレームレート計算
void Framework::CalculateFrameStats()
{
// Code computes the average frames per second, and also the
// average time it takes to render one frame. These stats
// are appended to the window caption bar.
static int frames = 0;
static float time_tlapsed = 0.0f;
frames++;
// Compute averages over one second period.
if ((timer.TimeStamp() - time_tlapsed) >= 1.0f)
{
float fps = static_cast<float>(frames); // fps = frameCnt / 1
float mspf = 1000.0f / fps;
std::ostringstream outs;
outs.precision(6);
outs << "FPS : " << fps << " / " << "Frame Time : " << mspf << " (ms)";
SetWindowTextA(hWnd, outs.str().c_str());
// Reset for next average.
frames = 0;
time_tlapsed += 1.0f;
}
}
// アプリケーションループ
int Framework::Run()
{
MSG msg = {};
while (WM_QUIT != msg.message)
{
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
timer.Tick();
CalculateFrameStats();
float elapsedTime = syncInterval == 0
? timer.TimeInterval()
: syncInterval / 60.0f
;
Update(elapsedTime);
Render(elapsedTime);
}
}
return static_cast<int>(msg.wParam);
}
// メッセージハンドラ
LRESULT CALLBACK Framework::HandleMessage(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
if (Graphics::Instance().GetImGuiRenderer()->HandleMessage(hWnd, msg, wParam, lParam))
return true;
switch (msg)
{
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc;
hdc = BeginPaint(hWnd, &ps);
EndPaint(hWnd, &ps);
break;
}
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_CREATE:
break;
case WM_KEYDOWN:
if (wParam == VK_ESCAPE) PostMessage(hWnd, WM_CLOSE, 0, 0);
break;
case WM_ENTERSIZEMOVE:
// WM_EXITSIZEMOVE is sent when the user grabs the resize bars.
timer.Stop();
break;
case WM_EXITSIZEMOVE:
// WM_EXITSIZEMOVE is sent when the user releases the resize bars.
// Here we reset everything based on the new window dimensions.
timer.Start();
break;
default:
return DefWindowProc(hWnd, msg, wParam, lParam);
}
return 0;
}