|
@@ -36,62 +36,6 @@ WorldPostShader Engine::worldPostShader;
|
|
|
|
|
|
OverlayShader Engine::overlayShader;
|
|
OverlayShader Engine::overlayShader;
|
|
|
|
|
|
-bool Engine::init(int width, int height, const char* name)
|
|
|
|
-{
|
|
|
|
- Engine::width = width;
|
|
|
|
- Engine::height = height;
|
|
|
|
- updateScale();
|
|
|
|
-
|
|
|
|
- if(!glfwInit())
|
|
|
|
- {
|
|
|
|
- cout << "could not initialize GLFW" << endl;
|
|
|
|
- return false;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- glfwDefaultWindowHints();
|
|
|
|
- glfwWindowHint(GLFW_VISIBLE, 0);
|
|
|
|
- glfwWindowHint(GLFW_RESIZABLE, 1);
|
|
|
|
-
|
|
|
|
- glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
|
|
|
|
- glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);
|
|
|
|
- glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
|
|
|
|
-
|
|
|
|
- window = glfwCreateWindow(width, height, name, nullptr, nullptr);
|
|
|
|
- if(!window)
|
|
|
|
- {
|
|
|
|
- cout << "could not create window" << endl;
|
|
|
|
- glfwTerminate();
|
|
|
|
- return false;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- glfwMakeContextCurrent(window);
|
|
|
|
- glfwSwapInterval(1);
|
|
|
|
-
|
|
|
|
- glfwShowWindow(window);
|
|
|
|
-
|
|
|
|
- GLenum err = glewInit();
|
|
|
|
- if(GLEW_OK != err)
|
|
|
|
- {
|
|
|
|
- cout << "could not initialize GLEW: " << glewGetErrorString(err) << endl;
|
|
|
|
- return false;
|
|
|
|
- }
|
|
|
|
- cout << "Status: Using GLEW " << glewGetString(GLEW_VERSION) << endl;
|
|
|
|
-
|
|
|
|
- if(!worldShader.init() || !ssaoShader.init() || !ssaoBlurShader.init() ||
|
|
|
|
- !worldPostShader.init() || !overlayShader.init() || !rectangle.init())
|
|
|
|
- {
|
|
|
|
- glfwDestroyWindow(window);
|
|
|
|
- glfwTerminate();
|
|
|
|
- return false;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- glfwSetKeyCallback(window, onKeyEvent);
|
|
|
|
- glfwSetMouseButtonCallback(window, onMouseClick);
|
|
|
|
- glfwSetFramebufferSizeCallback(window, onWindowResize);
|
|
|
|
- glfwSetCursorPosCallback(window, onMouseMove);
|
|
|
|
- return true;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
void Engine::sleep(uint64_t nanos)
|
|
void Engine::sleep(uint64_t nanos)
|
|
{
|
|
{
|
|
uint64_t end = glfwGetTimerValue() + nanos - 10000;
|
|
uint64_t end = glfwGetTimerValue() + nanos - 10000;
|
|
@@ -108,92 +52,6 @@ void Engine::sleep(uint64_t nanos)
|
|
while(end > glfwGetTimerValue());
|
|
while(end > glfwGetTimerValue());
|
|
}
|
|
}
|
|
|
|
|
|
-void Engine::start(IClient* client)
|
|
|
|
-{
|
|
|
|
- if(client != nullptr)
|
|
|
|
- {
|
|
|
|
- Engine::client = client;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- glEnable(GL_CULL_FACE);
|
|
|
|
- glDepthFunc(GL_LEQUAL);
|
|
|
|
-
|
|
|
|
- uint64_t newTime = glfwGetTimerValue();
|
|
|
|
- uint64_t oldTime = newTime;
|
|
|
|
- uint64_t lag = 0;
|
|
|
|
- uint64_t frameLag = 0;
|
|
|
|
- uint64_t lastFrame = 0;
|
|
|
|
-
|
|
|
|
- while(!glfwWindowShouldClose(window))
|
|
|
|
- {
|
|
|
|
- oldTime = newTime;
|
|
|
|
- newTime = glfwGetTimerValue();
|
|
|
|
- lag += newTime - oldTime;
|
|
|
|
- frameLag += newTime - oldTime;
|
|
|
|
-
|
|
|
|
- if(lag >= NANOS_PER_TICK || frameLag >= NANOS_PER_FRAME)
|
|
|
|
- {
|
|
|
|
- int ticksPerFrame = 0;
|
|
|
|
- while(lag >= NANOS_PER_TICK)
|
|
|
|
- {
|
|
|
|
- lag -= NANOS_PER_TICK;
|
|
|
|
-
|
|
|
|
- Engine::client->tick();
|
|
|
|
- ticksPerFrame++;
|
|
|
|
-
|
|
|
|
- resizeTicks -= (resizeTicks >= 0);
|
|
|
|
- if(resizeTicks == 0)
|
|
|
|
- {
|
|
|
|
- glViewport(0, 0, width, height);
|
|
|
|
- updateScale();
|
|
|
|
- worldShader.resize();
|
|
|
|
- ssaoShader.resize();
|
|
|
|
- ssaoBlurShader.resize();
|
|
|
|
- worldPostShader.resize();
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if(ticksPerFrame >= MAX_TICKS_PER_FRAME)
|
|
|
|
- {
|
|
|
|
- long skip = lag / NANOS_PER_TICK;
|
|
|
|
- lag -= skip * NANOS_PER_TICK;
|
|
|
|
- if(skip > 0)
|
|
|
|
- {
|
|
|
|
- cout << "skipped " << skip << " game ticks " << lag << endl;
|
|
|
|
- }
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if(frameLag >= NANOS_PER_FRAME)
|
|
|
|
- {
|
|
|
|
- frameLag -= NANOS_PER_FRAME;
|
|
|
|
-
|
|
|
|
-
|
|
|
|
- if(lastFrame + NANOS_PER_FRAME - 1000000 < glfwGetTimerValue())
|
|
|
|
- {
|
|
|
|
- lastFrame = glfwGetTimerValue();
|
|
|
|
- if(resizeTicks == -1)
|
|
|
|
- {
|
|
|
|
- onRenderTick((float) lag / NANOS_PER_TICK);
|
|
|
|
- glfwSwapBuffers(window);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- glfwPollEvents();
|
|
|
|
- }
|
|
|
|
- else
|
|
|
|
- {
|
|
|
|
-
|
|
|
|
- long waitingTime = min(NANOS_PER_FRAME - frameLag, NANOS_PER_TICK - lag);
|
|
|
|
- sleep(waitingTime);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- glfwDestroyWindow(window);
|
|
|
|
- glfwTerminate();
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
void Engine::stop()
|
|
void Engine::stop()
|
|
{
|
|
{
|
|
glfwSetWindowShouldClose(window, 1);
|
|
glfwSetWindowShouldClose(window, 1);
|