/
client_engine.cpp
113 lines (93 loc) · 2.81 KB
/
client_engine.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
#include "client_engine.h"
#include "client_config.h"
#include "gl/primitive.h"
#include "lua/client_lua_api.h"
#include "window.h"
bool ClientEngine::init(sf::Window& window)
{
mp_window = &window;
// Init all the lua api stuff
m_luaCallbacks.initCallbacks(m_lua);
luaInitGuiWidgetApi(m_lua);
luaInitInputApi(m_lua, window, m_inputState);
luaInitClientControlApi(m_lua, m_controller);
luaInitGuiApi(m_lua, m_gui, &m_guiRenderer);
m_lua.runLuaFile("game/client/main.lua");
m_luaCallbacks.onClientStartup();
m_guiRenderTarget.create(GUI_WIDTH, GUI_HEIGHT);
m_worldRenderTarget.create(ClientConfig::get().windowHeight,
ClientConfig::get().windowWidth);
m_screenShader.create("minimal", "minimal");
m_screenBuffer = makeScreenQuadVertexArray();
return true;
}
void ClientEngine::runClient()
{
while (mp_window->isOpen()) {
pollWindowEvents();
m_game.handleInput(m_keyboard, m_inputState);
update();
render();
if (!m_controller.executeAction(m_game, m_luaCallbacks)) {
mp_window->close();
}
}
}
void ClientEngine::update()
{
static sf::Clock clock;
m_fpsCounter.update();
m_game.tick(clock.restart().asSeconds());
m_gui.update();
if (((int)m_fpsCounter.frameCount % 256) == 0) {
std::cout << m_fpsCounter.frameTime << '\n';
}
}
void ClientEngine::render()
{
glEnable(GL_DEPTH_TEST);
// World
m_worldRenderTarget.bind();
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
m_game.render();
// GUI
m_guiRenderTarget.bind();
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
m_gui.render(m_guiRenderer);
// Buffer to window
gl::unbindFramebuffers(ClientConfig::get().windowWidth,
ClientConfig::get().windowHeight);
glDisable(GL_DEPTH_TEST);
glClear(GL_COLOR_BUFFER_BIT);
auto drawable = m_screenBuffer.getDrawable();
drawable.bind();
m_screenShader.bind();
m_worldRenderTarget.bindTexture();
drawable.draw();
glEnable(GL_BLEND);
m_guiRenderTarget.bindTexture();
drawable.draw();
mp_window->display();
glDisable(GL_BLEND);
}
void ClientEngine::pollWindowEvents()
{
sf::Event event;
while (mp_window->pollEvent(event)) {
if (mp_window->hasFocus()) {
m_keyboard.update(event);
m_gui.handleEvent(event);
m_game.handleEvent(event);
}
switch (event.type) {
case sf::Event::MouseWheelScrolled:
m_luaCallbacks.onMouseWheelScroll(event.mouseWheelScroll);
break;
case sf::Event::KeyReleased:
m_luaCallbacks.onKeyboardKeyReleased(event.key.code);
break;
default:
break;
}
}
}