use mvp
Switch from MVC (Model-View-Controller) pattern to a modified MVP (Model-View-Presenter) pattern, to toss out the inconvenient Controller
This commit is contained in:
parent
7bec2853b1
commit
9d271cc5ed
@ -26,7 +26,6 @@
|
||||
|
||||
#include <testbed/framework/model.h>
|
||||
#include <testbed/framework/view.h>
|
||||
#include <testbed/framework/controller.h>
|
||||
|
||||
//
|
||||
GLFWwindow* g_window;
|
||||
@ -34,21 +33,20 @@ GLFWwindow* g_window;
|
||||
//
|
||||
Model* g_model;
|
||||
View* g_view;
|
||||
Controller* g_controller;
|
||||
|
||||
static void WindowSize(GLFWwindow* ww, int w, int h)
|
||||
{
|
||||
g_controller->Event_SetWindowSize(u32(w), u32(h));
|
||||
g_view->Event_SetWindowSize(w, h);
|
||||
}
|
||||
|
||||
static void CursorMove(GLFWwindow* w, double x, double y)
|
||||
{
|
||||
g_controller->Event_Move_Cursor(float32(x), float32(y));
|
||||
g_view->Event_Move_Cursor(float(x), float(y));
|
||||
}
|
||||
|
||||
static void WheelScroll(GLFWwindow* w, double dx, double dy)
|
||||
{
|
||||
g_controller->Event_Scroll(float32(dx), float32(dy));
|
||||
g_view->Event_Scroll(float(dx), float(dy));
|
||||
}
|
||||
|
||||
static void MouseButton(GLFWwindow* w, int button, int action, int mods)
|
||||
@ -57,12 +55,12 @@ static void MouseButton(GLFWwindow* w, int button, int action, int mods)
|
||||
{
|
||||
case GLFW_PRESS:
|
||||
{
|
||||
g_controller->Event_Press_Mouse(button);
|
||||
g_view->Event_Press_Mouse(button);
|
||||
break;
|
||||
}
|
||||
case GLFW_RELEASE:
|
||||
{
|
||||
g_controller->Event_Release_Mouse(button);
|
||||
g_view->Event_Release_Mouse(button);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
@ -78,13 +76,12 @@ static void KeyButton(GLFWwindow* w, int button, int scancode, int action, int m
|
||||
{
|
||||
case GLFW_PRESS:
|
||||
{
|
||||
g_controller->Event_Press_Key(button);
|
||||
|
||||
g_view->Event_Press_Key(button);
|
||||
break;
|
||||
}
|
||||
case GLFW_RELEASE:
|
||||
{
|
||||
g_controller->Event_Release_Key(button);
|
||||
g_view->Event_Release_Key(button);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
@ -98,7 +95,7 @@ static void Run()
|
||||
{
|
||||
int w, h;
|
||||
glfwGetWindowSize(g_window, &w, &h);
|
||||
g_controller->Event_SetWindowSize(u32(w), u32(h));
|
||||
g_view->Event_SetWindowSize(u32(w), u32(h));
|
||||
|
||||
while (glfwWindowShouldClose(g_window) == 0)
|
||||
{
|
||||
@ -187,15 +184,11 @@ int main(int argc, char** args)
|
||||
//
|
||||
g_model = new Model();
|
||||
g_view = new View(g_window, g_model);
|
||||
g_controller = new Controller(g_model, g_view);
|
||||
|
||||
// Run
|
||||
Run();
|
||||
|
||||
//
|
||||
delete g_controller;
|
||||
g_controller = nullptr;
|
||||
|
||||
delete g_view;
|
||||
g_view = nullptr;
|
||||
|
||||
|
@ -16,13 +16,10 @@
|
||||
* 3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
#include <testbed/framework/controller.h>
|
||||
#include <testbed/framework/presenter.h>
|
||||
#include <testbed/framework/model.h>
|
||||
#include <testbed/framework/view.h>
|
||||
|
||||
// !
|
||||
#include <glfw/glfw3.h>
|
||||
|
||||
// !
|
||||
static inline b3Vec2 GetCursorPosition()
|
||||
{
|
||||
@ -34,35 +31,25 @@ static inline b3Vec2 GetCursorPosition()
|
||||
return b3Vec2(float32(x), float32(y));
|
||||
}
|
||||
|
||||
Controller::Controller(Model* model, View* view)
|
||||
Presenter::Presenter(Model* model, View* view)
|
||||
{
|
||||
m_model = model;
|
||||
m_view = view;
|
||||
|
||||
m_leftDown = false;
|
||||
m_rightDown = false;
|
||||
m_shiftDown = false;
|
||||
m_ps0.SetZero();
|
||||
}
|
||||
|
||||
Controller::~Controller()
|
||||
Presenter::~Presenter()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void Controller::Event_SetWindowSize(u32 w, u32 h)
|
||||
void Presenter::Event_SetWindowSize(float w, float h)
|
||||
{
|
||||
m_model->Command_ResizeCamera(float32(w), float32(h));
|
||||
m_model->Command_ResizeCamera(w, h);
|
||||
}
|
||||
|
||||
void Controller::Event_Press_Key(int button)
|
||||
void Presenter::Event_Press_Key(int button)
|
||||
{
|
||||
if (button == GLFW_KEY_LEFT_SHIFT)
|
||||
{
|
||||
m_shiftDown = true;
|
||||
}
|
||||
|
||||
if (m_shiftDown)
|
||||
if (m_view->m_shiftDown)
|
||||
{
|
||||
if (button == GLFW_KEY_DOWN)
|
||||
{
|
||||
@ -80,82 +67,58 @@ void Controller::Event_Press_Key(int button)
|
||||
}
|
||||
}
|
||||
|
||||
void Controller::Event_Release_Key(int button)
|
||||
void Presenter::Event_Release_Key(int button)
|
||||
{
|
||||
if (button == GLFW_KEY_LEFT_SHIFT)
|
||||
{
|
||||
m_shiftDown = false;
|
||||
}
|
||||
|
||||
if (m_shiftDown)
|
||||
{
|
||||
|
||||
}
|
||||
else
|
||||
if (!m_view->m_shiftDown)
|
||||
{
|
||||
m_model->Command_Release_Key(button);
|
||||
}
|
||||
}
|
||||
|
||||
void Controller::Event_Press_Mouse(int button)
|
||||
void Presenter::Event_Press_Mouse(int button)
|
||||
{
|
||||
if (button == GLFW_MOUSE_BUTTON_LEFT)
|
||||
{
|
||||
m_leftDown = true;
|
||||
|
||||
if (!m_shiftDown)
|
||||
if (!m_view->m_shiftDown)
|
||||
{
|
||||
m_model->Command_Press_Mouse_Left(GetCursorPosition());
|
||||
}
|
||||
}
|
||||
|
||||
if (button == GLFW_MOUSE_BUTTON_RIGHT)
|
||||
{
|
||||
m_rightDown = true;
|
||||
}
|
||||
}
|
||||
|
||||
void Controller::Event_Release_Mouse(int button)
|
||||
void Presenter::Event_Release_Mouse(int button)
|
||||
{
|
||||
if (button == GLFW_MOUSE_BUTTON_LEFT)
|
||||
{
|
||||
m_leftDown = false;
|
||||
|
||||
if (!m_shiftDown)
|
||||
if (!m_view->m_shiftDown)
|
||||
{
|
||||
m_model->Command_Release_Mouse_Left(GetCursorPosition());
|
||||
}
|
||||
}
|
||||
|
||||
if (button == GLFW_MOUSE_BUTTON_RIGHT)
|
||||
{
|
||||
m_rightDown = false;
|
||||
}
|
||||
}
|
||||
|
||||
void Controller::Event_Move_Cursor(float32 x, float32 y)
|
||||
void Presenter::Event_Move_Cursor(float x, float y)
|
||||
{
|
||||
b3Vec2 ps;
|
||||
ps.Set(float32(x), float32(y));
|
||||
ps.Set(x, y);
|
||||
|
||||
b3Vec2 dp = ps - m_ps0;
|
||||
m_ps0 = ps;
|
||||
b3Vec2 dp = ps - m_view->m_ps0;
|
||||
|
||||
float32 ndx = b3Clamp(dp.x, -1.0f, 1.0f);
|
||||
float32 ndy = b3Clamp(dp.y, -1.0f, 1.0f);
|
||||
|
||||
if (m_shiftDown)
|
||||
if (m_view->m_shiftDown)
|
||||
{
|
||||
if (m_leftDown)
|
||||
if (m_view->m_leftDown)
|
||||
{
|
||||
float32 ax = -0.005f * B3_PI * ndx;
|
||||
float32 ay = -0.005f * B3_PI * ndy;
|
||||
|
||||
|
||||
m_model->Command_RotateCameraY(ax);
|
||||
m_model->Command_RotateCameraX(ay);
|
||||
}
|
||||
|
||||
if (m_rightDown)
|
||||
if (m_view->m_rightDown)
|
||||
{
|
||||
float32 tx = 0.2f * ndx;
|
||||
float32 ty = -0.2f * ndy;
|
||||
@ -170,11 +133,11 @@ void Controller::Event_Move_Cursor(float32 x, float32 y)
|
||||
}
|
||||
}
|
||||
|
||||
void Controller::Event_Scroll(float32 dx, float32 dy)
|
||||
void Presenter::Event_Scroll(float dx, float dy)
|
||||
{
|
||||
if (m_shiftDown)
|
||||
if (m_view->m_shiftDown)
|
||||
{
|
||||
float32 ny = b3Clamp(dy, -1.0f, 1.0f);
|
||||
m_model->Command_ZoomCamera(1.0f * ny);
|
||||
}
|
||||
}
|
||||
}
|
@ -16,44 +16,34 @@
|
||||
* 3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
#ifndef CONTROLLER_H
|
||||
#define CONTROLLER_H
|
||||
#ifndef PRESENTER_H
|
||||
#define PRESENTER_H
|
||||
|
||||
#include <bounce/common/math/vec2.h>
|
||||
|
||||
class Model;
|
||||
class View;
|
||||
|
||||
class Controller
|
||||
class Presenter
|
||||
{
|
||||
public:
|
||||
Controller(Model* model, View* view);
|
||||
Presenter(Model* model, View* view);
|
||||
|
||||
~Controller();
|
||||
~Presenter();
|
||||
|
||||
void Event_SetWindowSize(u32 w, u32 h);
|
||||
|
||||
void Event_SetWindowSize(float w, float h);
|
||||
void Event_Press_Key(int button);
|
||||
void Event_Release_Key(int button);
|
||||
|
||||
void Event_Press_Mouse(int button);
|
||||
void Event_Release_Mouse(int button);
|
||||
|
||||
void Event_Move_Cursor(float32 x, float32 y);
|
||||
void Event_Scroll(float32 dx, float32 dy);
|
||||
void Event_Move_Cursor(float x, float y);
|
||||
void Event_Scroll(float dx, float dy);
|
||||
private:
|
||||
friend class Model;
|
||||
friend class View;
|
||||
|
||||
Model* m_model;
|
||||
View* m_view;
|
||||
|
||||
bool m_leftDown;
|
||||
bool m_rightDown;
|
||||
bool m_shiftDown;
|
||||
b3Vec2 m_ps0;
|
||||
|
||||
// Ray3 m_ray0;
|
||||
};
|
||||
|
||||
#endif
|
@ -26,6 +26,8 @@
|
||||
#else
|
||||
#endif
|
||||
|
||||
#include <glfw/glfw3.h>
|
||||
|
||||
static bool GetTestName(void* userData, int idx, const char** name)
|
||||
{
|
||||
assert(u32(idx) < g_testCount);
|
||||
@ -109,7 +111,7 @@ static inline void ImGui_GLFW_GL_RenderDrawData(ImDrawData* draw_data)
|
||||
|
||||
}
|
||||
|
||||
View::View(GLFWwindow* window, Model* model)
|
||||
View::View(GLFWwindow* window, Model* model) : m_presenter(model, this)
|
||||
{
|
||||
m_window = window;
|
||||
m_model = model;
|
||||
@ -125,6 +127,11 @@ View::View(GLFWwindow* window, Model* model)
|
||||
ImGui_GLFW_GL_Init(m_window, false);
|
||||
|
||||
ImGui::StyleColorsDark();
|
||||
|
||||
m_leftDown = false;
|
||||
m_rightDown = false;
|
||||
m_shiftDown = false;
|
||||
m_ps0.SetZero();
|
||||
}
|
||||
|
||||
View::~View()
|
||||
@ -135,6 +142,75 @@ View::~View()
|
||||
ImGui::DestroyContext();
|
||||
}
|
||||
|
||||
void View::Event_SetWindowSize(int w, int h)
|
||||
{
|
||||
m_presenter.Event_SetWindowSize(float32(w), float32(h));
|
||||
}
|
||||
|
||||
void View::Event_Press_Key(int button)
|
||||
{
|
||||
if (button == GLFW_KEY_LEFT_SHIFT)
|
||||
{
|
||||
m_shiftDown = true;
|
||||
}
|
||||
|
||||
m_presenter.Event_Press_Key(button);
|
||||
}
|
||||
|
||||
void View::Event_Release_Key(int button)
|
||||
{
|
||||
if (button == GLFW_KEY_LEFT_SHIFT)
|
||||
{
|
||||
m_shiftDown = false;
|
||||
}
|
||||
|
||||
m_presenter.Event_Release_Key(button);
|
||||
}
|
||||
|
||||
void View::Event_Press_Mouse(int button)
|
||||
{
|
||||
if (button == GLFW_MOUSE_BUTTON_LEFT)
|
||||
{
|
||||
m_leftDown = true;
|
||||
}
|
||||
|
||||
if (button == GLFW_MOUSE_BUTTON_RIGHT)
|
||||
{
|
||||
m_rightDown = true;
|
||||
}
|
||||
|
||||
m_presenter.Event_Press_Mouse(button);
|
||||
}
|
||||
|
||||
void View::Event_Release_Mouse(int button)
|
||||
{
|
||||
if (button == GLFW_MOUSE_BUTTON_LEFT)
|
||||
{
|
||||
m_leftDown = false;
|
||||
}
|
||||
|
||||
if (button == GLFW_MOUSE_BUTTON_RIGHT)
|
||||
{
|
||||
m_rightDown = false;
|
||||
}
|
||||
|
||||
m_presenter.Event_Release_Mouse(button);
|
||||
}
|
||||
|
||||
void View::Event_Move_Cursor(float x, float y)
|
||||
{
|
||||
b3Vec2 ps(x, y);
|
||||
|
||||
m_presenter.Event_Move_Cursor(ps.x, ps.y);
|
||||
|
||||
m_ps0 = ps;
|
||||
}
|
||||
|
||||
void View::Event_Scroll(float dx, float dy)
|
||||
{
|
||||
m_presenter.Event_Scroll(dx, dy);
|
||||
}
|
||||
|
||||
void View::Command_PreDraw()
|
||||
{
|
||||
ImGui_GLFW_GL_NewFrame();
|
||||
|
@ -19,25 +19,43 @@
|
||||
#ifndef VIEW_H
|
||||
#define VIEW_H
|
||||
|
||||
#include <bounce/common/math/vec2.h>
|
||||
#include <testbed/framework/presenter.h>
|
||||
|
||||
struct GLFWwindow;
|
||||
|
||||
class Model;
|
||||
|
||||
class View
|
||||
{
|
||||
{
|
||||
public:
|
||||
View(GLFWwindow* window, Model* model);
|
||||
|
||||
~View();
|
||||
|
||||
void Event_SetWindowSize(int w, int h);
|
||||
void Event_Press_Key(int button);
|
||||
void Event_Release_Key(int button);
|
||||
void Event_Press_Mouse(int button);
|
||||
void Event_Release_Mouse(int button);
|
||||
void Event_Move_Cursor(float x, float y);
|
||||
void Event_Scroll(float dx, float dy);
|
||||
|
||||
void Command_PreDraw();
|
||||
|
||||
void Command_Draw();
|
||||
|
||||
void Command_PostDraw();
|
||||
private:
|
||||
GLFWwindow * m_window;
|
||||
friend class Presenter;
|
||||
|
||||
Presenter m_presenter;
|
||||
Model* m_model;
|
||||
|
||||
GLFWwindow* m_window;
|
||||
bool m_leftDown;
|
||||
bool m_rightDown;
|
||||
bool m_shiftDown;
|
||||
b3Vec2 m_ps0;
|
||||
// Ray3 m_ray0;
|
||||
};
|
||||
|
||||
#endif
|
@ -269,7 +269,7 @@ solution (solution_name)
|
||||
|
||||
examples_inc_dir .. "/testbed/framework/model.h",
|
||||
examples_inc_dir .. "/testbed/framework/view.h",
|
||||
examples_inc_dir .. "/testbed/framework/controller.h",
|
||||
examples_inc_dir .. "/testbed/framework/presenter.h",
|
||||
|
||||
examples_src_dir .. "/testbed/framework/test.h",
|
||||
|
||||
@ -282,7 +282,7 @@ solution (solution_name)
|
||||
|
||||
examples_inc_dir .. "/testbed/framework/model.cpp",
|
||||
examples_inc_dir .. "/testbed/framework/view.cpp",
|
||||
examples_inc_dir .. "/testbed/framework/controller.cpp",
|
||||
examples_inc_dir .. "/testbed/framework/presenter.cpp",
|
||||
|
||||
examples_src_dir .. "/testbed/framework/test.cpp",
|
||||
examples_src_dir .. "/testbed/framework/test_entries.cpp",
|
||||
|
Loading…
x
Reference in New Issue
Block a user