Imgui updates now controlled from main.cc instead of render module

master
Martin Felis 2017-02-05 14:37:58 +01:00
parent 19f3ddb901
commit e0e57a2b4f
7 changed files with 75 additions and 73 deletions

View File

@ -20,3 +20,6 @@ extern WriteSerializer* gWriteSerializer;
struct ReadSerializer;
extern ReadSerializer* gReadSerializer;
struct GuiInputState;
extern GuiInputState* gGuiInputState;

View File

@ -5,6 +5,24 @@
#include <sys/stat.h>
#include <time.h>
struct GuiInputState {
int32_t mousedX;
int32_t mousedY;
int32_t mouseX;
int32_t mouseY;
uint8_t mouseButton;
int32_t mouseScroll;
char key;
GuiInputState() :
mouseX(0),
mouseY(0),
mouseButton(0),
mouseScroll(0),
key(0) {
}
};
inline void gGetFileModTime (const char* filename, int *sec, int *nsec) {
struct stat attr;

View File

@ -25,8 +25,12 @@ GLFWwindow* gWindow = nullptr;
RuntimeModuleManager* gModuleManager = nullptr;
WriteSerializer* gWriteSerializer = nullptr;
ReadSerializer* gReadSerializer = nullptr;
GuiInputState* gGuiInputState = nullptr;
double gTimeAtStart = 0;
double mouse_scroll_x = 0.;
double mouse_scroll_y = 0.;
using namespace std;
namespace bgfx {
@ -63,6 +67,36 @@ static void key_callback(GLFWwindow* window, int key, int scancode, int action,
glfwSetWindowShouldClose(window, GLFW_TRUE);
}
void mouse_scroll_callback(GLFWwindow* window, double xoffset, double yoffset) {
mouse_scroll_x += xoffset;
mouse_scroll_y += yoffset;
}
void handle_mouse () {
if (!glfwGetWindowAttrib(gWindow, GLFW_FOCUSED)) {
return;
}
if (glfwGetMouseButton(gWindow, 1)) {
glfwSetInputMode(gWindow, GLFW_CURSOR, GLFW_CURSOR_DISABLED);
} else {
glfwSetInputMode(gWindow, GLFW_CURSOR, GLFW_CURSOR_NORMAL);
}
double mouse_x, mouse_y;
glfwGetCursorPos(gWindow, &mouse_x, &mouse_y);
gGuiInputState->mousedX = mouse_x - gGuiInputState->mouseX;
gGuiInputState->mousedY = mouse_y - gGuiInputState->mouseY;
gGuiInputState->mouseX = mouse_x;
gGuiInputState->mouseY = mouse_y;
gGuiInputState->mouseScroll = mouse_scroll_y;
gGuiInputState->mouseButton =
glfwGetMouseButton(gWindow, 0)
+ (glfwGetMouseButton(gWindow, 1) << 1)
+ (glfwGetMouseButton(gWindow, 2) << 2);
}
int main(void)
{
gTimeAtStart = gGetCurrentTime();
@ -85,6 +119,9 @@ int main(void)
int width, height;
glfwGetWindowSize(gWindow, &width, &height);
glfwSetKeyCallback(gWindow, key_callback);
glfwSetScrollCallback (gWindow, mouse_scroll_callback);
std::cout << "OpenGL Version: " << glGetString(GL_VERSION) << endl;
std::cout << "GLSL Version : " << glGetString(GL_SHADING_LANGUAGE_VERSION) << endl;
@ -103,6 +140,8 @@ int main(void)
// imgui initialization.
imguiCreate();
GuiInputState gui_input_state;
gGuiInputState = &gui_input_state;
// Timer
Timer timer;
@ -124,10 +163,19 @@ int main(void)
// Load modules
module_manager.LoadModules();
glfwSetKeyCallback(gWindow, key_callback);
int64_t time_offset = bx::getHPCounter();
while(!glfwWindowShouldClose(gWindow)) {
// Start the imgui frame such that widgets can be submitted
handle_mouse();
glfwGetWindowSize(gWindow, &width, &height);
imguiBeginFrame (gGuiInputState->mouseX,
gGuiInputState->mouseY,
gGuiInputState->mouseButton,
gGuiInputState->mouseScroll,
width,
height);
static int64_t last = bx::getHPCounter();
int64_t pre_module_check = bx::getHPCounter();
@ -162,6 +210,9 @@ int main(void)
glfwPollEvents();
// submit the imgui widgets
imguiEndFrame();
usleep(16000);
}

View File

@ -185,8 +185,6 @@ static void module_reload(struct module_state *state, void* read_serializer) {
}
static void module_unload(struct module_state *state, void* write_serializer) {
glfwSetScrollCallback (gWindow, nullptr);
// serialize the state of the entity
if (write_serializer != nullptr) {
module_serialize(state, static_cast<WriteSerializer*>(write_serializer));

View File

@ -1205,14 +1205,6 @@ void Renderer::initialize(int width, int height) {
mLightProbes[LightProbe::Kyoto ].load("kyoto");
mCurrentLightProbe = LightProbe::Bolonga;
// Start the imgui frame such that widgets can be submitted
imguiBeginFrame (inputState.mouseX,
inputState.mouseY,
inputState.mouseButton,
inputState.mouseScroll,
width,
height);
initialized = true;
resize (width, height);
bgfx::frame();
@ -1330,9 +1322,6 @@ void Renderer::paintGL() {
int num_chars = width / 8;
bgfx::dbgTextPrintf(num_chars - 18, 0, 0x0f, "Frame: % 7.3f[ms]", double(frameTime)*toMs);
// submit the imgui widgets
imguiEndFrame();
// This dummy draw call is here to make sure that view 0 is cleared
// if no other draw calls are submitted to view 0.
bgfx::touch(0);
@ -1681,14 +1670,6 @@ void Renderer::paintGL() {
// process submitted rendering primitives.
bgfx::frame();
// Start the next imgui frame
imguiBeginFrame (inputState.mouseX,
inputState.mouseY,
inputState.mouseButton,
inputState.mouseScroll,
width,
height);
ImGui::SetNextWindowSize (ImVec2(400.f, 300.0f), ImGuiSetCond_Once);
ImGui::SetNextWindowPos (ImVec2(10.f, 300.0f), ImGuiSetCond_Once);

View File

@ -13,24 +13,6 @@
struct Entity;
struct InputState {
int32_t mousedX;
int32_t mousedY;
int32_t mouseX;
int32_t mouseY;
uint8_t mouseButton;
int32_t mouseScroll;
char key;
InputState() :
mouseX(0),
mouseY(0),
mouseButton(0),
mouseScroll(0),
key(0) {
}
};
struct Camera {
Vector3f eye;
Vector3f poi;
@ -372,9 +354,6 @@ struct Renderer {
uint16_t activeCameraIndex;
// needed to forward inputs to IMGUI
InputState inputState;
Renderer() :
initialized(false),
drawDebug(false),

View File

@ -20,8 +20,6 @@
using namespace std;
double mouse_scroll_x = 0.;
double mouse_scroll_y = 0.;
bool fps_camera = true;
// Boilerplate for the module reload stuff
@ -38,11 +36,6 @@ struct module_state {
CharacterEntity* character = nullptr;
};
void mouse_scroll_callback(GLFWwindow* window, double xoffset, double yoffset) {
mouse_scroll_x += xoffset;
mouse_scroll_y += yoffset;
}
void handle_mouse (struct module_state *state) {
if (!glfwGetWindowAttrib(gWindow, GLFW_FOCUSED)) {
return;
@ -54,19 +47,6 @@ void handle_mouse (struct module_state *state) {
glfwSetInputMode(gWindow, GLFW_CURSOR, GLFW_CURSOR_NORMAL);
}
double mouse_x, mouse_y;
glfwGetCursorPos(gWindow, &mouse_x, &mouse_y);
gRenderer->inputState.mousedX = mouse_x - gRenderer->inputState.mouseX;
gRenderer->inputState.mousedY = mouse_y - gRenderer->inputState.mouseY;
gRenderer->inputState.mouseX = mouse_x;
gRenderer->inputState.mouseY = mouse_y;
gRenderer->inputState.mouseScroll = mouse_scroll_y;
gRenderer->inputState.mouseButton =
glfwGetMouseButton(gWindow, 0)
+ (glfwGetMouseButton(gWindow, 1) << 1)
+ (glfwGetMouseButton(gWindow, 2) << 2);
Camera *active_camera = &gRenderer->cameras[gRenderer->activeCameraIndex];
assert (active_camera != nullptr);
Matrix44f camera_view_matrix = SimpleMath::Map<Matrix44f>(active_camera->mtxView, 4, 4);
@ -82,10 +62,10 @@ void handle_mouse (struct module_state *state) {
Vector3f right = camera_rot_inv.block<1,3>(0,0).transpose();
right = view_dir.cross (Vector3f (0.f, 1.f, 0.f));
Matrix33f rot_matrix_y = SimpleMath::GL::RotateMat33(
gRenderer->inputState.mousedY * 0.4f,
gGuiInputState->mousedY * 0.4f,
right[0], right[1], right[2]);
Matrix33f rot_matrix_x = SimpleMath::GL::RotateMat33(
gRenderer->inputState.mousedX * 0.4f,
gGuiInputState->mousedX * 0.4f,
0.f, 1.f, 0.f);
poi = eye + rot_matrix_x * rot_matrix_y * view_dir;
@ -224,22 +204,14 @@ static void module_finalize(struct module_state *state) {
static void module_reload(struct module_state *state, void* read_serializer) {
std::cout << "Module reload called. State: " << state << std::endl;
// reset mouse scrolling state
mouse_scroll_x = 0;
mouse_scroll_y = 0;
cout << "Creating render entity ..." << endl;
// load the state of the entity
if (read_serializer != nullptr) {
module_serialize(state, static_cast<ReadSerializer*>(read_serializer));
}
glfwSetScrollCallback (gWindow, mouse_scroll_callback);
}
static void module_unload(struct module_state *state, void* write_serializer) {
glfwSetScrollCallback (gWindow, nullptr);
// serialize the state of the entity
if (write_serializer != nullptr) {
module_serialize(state, static_cast<WriteSerializer*>(write_serializer));