215 lines
4.4 KiB
C++
215 lines
4.4 KiB
C++
/*
|
|
* Copyright (c) 2016-2019 Irlan Robson https://irlanrobson.github.io
|
|
*
|
|
* This software is provided 'as-is', without any express or implied
|
|
* warranty. In no event will the authors be held liable for any damages
|
|
* arising from the use of this software.
|
|
* Permission is granted to anyone to use this software for any purpose,
|
|
* including commercial applications, and to alter it and redistribute it
|
|
* freely, subject to the following restrictions:
|
|
* 1. The origin of this software must not be misrepresented; you must not
|
|
* claim that you wrote the original software. If you use this software
|
|
* in a product, an acknowledgment in the product documentation would be
|
|
* appreciated but is not required.
|
|
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
* misrepresented as being the original software.
|
|
* 3. This notice may not be removed or altered from any source distribution.
|
|
*/
|
|
|
|
#if defined (U_OPENGL_2)
|
|
#include <glad_2/glad.h>
|
|
#elif defined (U_OPENGL_4)
|
|
#include <glad_4/glad.h>
|
|
#else
|
|
// error
|
|
#endif
|
|
|
|
#include <glfw/glfw3.h>
|
|
|
|
#include <testbed/framework/model.h>
|
|
#include <testbed/framework/view.h>
|
|
#include <testbed/framework/view_model.h>
|
|
|
|
//
|
|
GLFWwindow* g_window;
|
|
|
|
//
|
|
static Model* g_model;
|
|
static View* g_view;
|
|
static ViewModel* g_viewModel;
|
|
|
|
static void WindowSize(GLFWwindow* ww, int w, int h)
|
|
{
|
|
g_view->Event_SetWindowSize(w, h);
|
|
}
|
|
|
|
static void CursorMove(GLFWwindow* w, double x, double y)
|
|
{
|
|
g_view->Event_Move_Cursor(float(x), float(y));
|
|
}
|
|
|
|
static void WheelScroll(GLFWwindow* w, double dx, double dy)
|
|
{
|
|
g_view->Event_Scroll(float(dx), float(dy));
|
|
}
|
|
|
|
static void MouseButton(GLFWwindow* w, int button, int action, int mods)
|
|
{
|
|
switch (action)
|
|
{
|
|
case GLFW_PRESS:
|
|
{
|
|
g_view->Event_Press_Mouse(button);
|
|
break;
|
|
}
|
|
case GLFW_RELEASE:
|
|
{
|
|
g_view->Event_Release_Mouse(button);
|
|
break;
|
|
}
|
|
default:
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
static void KeyButton(GLFWwindow* w, int button, int scancode, int action, int mods)
|
|
{
|
|
switch (action)
|
|
{
|
|
case GLFW_PRESS:
|
|
{
|
|
g_view->Event_Press_Key(button);
|
|
break;
|
|
}
|
|
case GLFW_RELEASE:
|
|
{
|
|
g_view->Event_Release_Key(button);
|
|
break;
|
|
}
|
|
default:
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
static void Run()
|
|
{
|
|
int w, h;
|
|
glfwGetWindowSize(g_window, &w, &h);
|
|
g_view->Event_SetWindowSize(u32(w), u32(h));
|
|
|
|
while (glfwWindowShouldClose(g_window) == 0)
|
|
{
|
|
g_profiler->Begin();
|
|
|
|
g_profiler->PushEvent("Frame");
|
|
|
|
g_view->BeginInterface();
|
|
|
|
if (g_model->IsPaused())
|
|
{
|
|
g_draw->DrawString(b3Color_white, "*PAUSED*");
|
|
}
|
|
else
|
|
{
|
|
g_draw->DrawString(b3Color_white, "*PLAYING*");
|
|
}
|
|
|
|
if (g_settings->drawProfile)
|
|
{
|
|
const b3Array<ProfilerRecord>& records = g_profilerRecorder->GetRecords();
|
|
for (u32 i = 0; i < records.Count(); ++i)
|
|
{
|
|
const ProfilerRecord& r = records[i];
|
|
|
|
if (r.elapsed > 0.0)
|
|
{
|
|
g_draw->DrawString(b3Color_white, "%s %.4f (%.4f) [ms]", r.name, r.elapsed, r.maxElapsed);
|
|
}
|
|
}
|
|
}
|
|
|
|
g_view->Interface();
|
|
|
|
g_model->Update();
|
|
|
|
g_view->EndInterface();
|
|
|
|
g_profiler->PopEvent();
|
|
|
|
g_profiler->End(g_profilerListener);
|
|
|
|
glfwSwapBuffers(g_window);
|
|
glfwPollEvents();
|
|
}
|
|
}
|
|
|
|
int main(int argc, char** args)
|
|
{
|
|
#if defined(_WIN32)
|
|
// Report memory leaks
|
|
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF | _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG));
|
|
//_CrtSetBreakAlloc(0);
|
|
#endif
|
|
|
|
if (glfwInit() == 0)
|
|
{
|
|
fprintf(stderr, "Failed to initialize GLFW\n");
|
|
return -1;
|
|
}
|
|
|
|
// Create window
|
|
g_window = glfwCreateWindow(1024, 768, "Bounce Testbed", NULL, NULL);
|
|
if (g_window == NULL)
|
|
{
|
|
fprintf(stderr, "Failed to create GLFW window\n");
|
|
glfwTerminate();
|
|
return -1;
|
|
}
|
|
|
|
glfwSetWindowSizeCallback(g_window, WindowSize);
|
|
glfwSetCursorPosCallback(g_window, CursorMove);
|
|
glfwSetScrollCallback(g_window, WheelScroll);
|
|
glfwSetMouseButtonCallback(g_window, MouseButton);
|
|
glfwSetKeyCallback(g_window, KeyButton);
|
|
glfwSwapInterval(1);
|
|
|
|
glfwMakeContextCurrent(g_window);
|
|
|
|
if (gladLoadGL() == 0)
|
|
{
|
|
fprintf(stderr, "Failed to load OpenGL extensions\n");
|
|
fprintf(stderr, "Error: %d\n", glad_glGetError());
|
|
glfwTerminate();
|
|
return -1;
|
|
}
|
|
|
|
printf("OpenGL %s, GLSL %s\n", glGetString(GL_VERSION), glGetString(GL_SHADING_LANGUAGE_VERSION));
|
|
|
|
//
|
|
g_model = new Model();
|
|
g_view = new View(g_window);
|
|
g_viewModel = new ViewModel(g_model, g_view);
|
|
|
|
// Run
|
|
Run();
|
|
|
|
//
|
|
delete g_viewModel;
|
|
g_viewModel = nullptr;
|
|
|
|
delete g_view;
|
|
g_view = nullptr;
|
|
|
|
delete g_model;
|
|
g_model = nullptr;
|
|
|
|
//
|
|
glfwTerminate();
|
|
g_window = nullptr;
|
|
|
|
return 0;
|
|
} |