Skip to content

Commit

Permalink
Added Input class and Layer::OnUpdate with timestep
Browse files Browse the repository at this point in the history
- Input class supports querying keyboard and mouse states
  • Loading branch information
TheCherno committed Aug 23, 2022
1 parent cc26ee1 commit 20f940b
Show file tree
Hide file tree
Showing 7 changed files with 279 additions and 0 deletions.
2 changes: 2 additions & 0 deletions Walnut/premake5.lua
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ project "Walnut"

includedirs
{
"src",

"../vendor/imgui",
"../vendor/glfw/include",
"../vendor/stb_image",
Expand Down
25 changes: 25 additions & 0 deletions Walnut/src/Walnut/Application.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
#define GLFW_INCLUDE_VULKAN
#include <GLFW/glfw3.h>
#include <vulkan/vulkan.h>
#include <glm/glm.hpp>

#include <iostream>

Expand Down Expand Up @@ -54,6 +55,8 @@ static std::vector<std::vector<std::function<void()>>> s_ResourceFreeQueue;
// and is always guaranteed to increase (eg. 0, 1, 2, 0, 1, 2)
static uint32_t s_CurrentFrameIndex = 0;

static Walnut::Application* s_Instance = nullptr;

void check_vk_result(VkResult err)
{
if (err == 0)
Expand Down Expand Up @@ -384,12 +387,21 @@ namespace Walnut {
Application::Application(const ApplicationSpecification& specification)
: m_Specification(specification)
{
s_Instance = this;

Init();
}

Application::~Application()
{
Shutdown();

s_Instance = nullptr;
}

Application& Application::Get()
{
return *s_Instance;
}

void Application::Init()
Expand Down Expand Up @@ -557,6 +569,9 @@ namespace Walnut {
// Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags.
glfwPollEvents();

for (auto& layer : m_LayerStack)
layer->OnUpdate(m_TimeStep);

// Resize swap chain?
if (g_SwapChainRebuild)
{
Expand Down Expand Up @@ -659,6 +674,11 @@ namespace Walnut {
// Present Main Platform Window
if (!main_is_minimized)
FramePresent(wd);

float time = GetTime();
m_FrameTime = time - m_LastFrameTime;
m_TimeStep = glm::min<float>(m_FrameTime, 0.0333f);
m_LastFrameTime = time;
}

}
Expand All @@ -668,6 +688,11 @@ namespace Walnut {
m_Running = false;
}

float Application::GetTime()
{
return (float)glfwGetTime();
}

VkInstance Application::GetInstance()
{
return g_Instance;
Expand Down
9 changes: 9 additions & 0 deletions Walnut/src/Walnut/Application.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@ namespace Walnut {
Application(const ApplicationSpecification& applicationSpecification = ApplicationSpecification());
~Application();

static Application& Get();

void Run();
void SetMenubarCallback(const std::function<void()>& menubarCallback) { m_MenubarCallback = menubarCallback; }

Expand All @@ -43,6 +45,9 @@ namespace Walnut {

void Close();

float GetTime();
GLFWwindow* GetWindowHandle() const { return m_WindowHandle; }

static VkInstance GetInstance();
static VkPhysicalDevice GetPhysicalDevice();
static VkDevice GetDevice();
Expand All @@ -59,6 +64,10 @@ namespace Walnut {
GLFWwindow* m_WindowHandle = nullptr;
bool m_Running = false;

float m_TimeStep = 0.0f;
float m_FrameTime = 0.0f;
float m_LastFrameTime = 0.0f;

std::vector<std::shared_ptr<Layer>> m_LayerStack;
std::function<void()> m_MenubarCallback;
};
Expand Down
38 changes: 38 additions & 0 deletions Walnut/src/Walnut/Input/Input.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
#include "Input.h"

#include "Walnut/Application.h"

#include <GLFW/glfw3.h>

namespace Walnut {

bool Input::IsKeyDown(KeyCode keycode)
{
GLFWwindow* windowHandle = Application::Get().GetWindowHandle();
int state = glfwGetKey(windowHandle, (int)keycode);
return state == GLFW_PRESS || state == GLFW_REPEAT;
}

bool Input::IsMouseButtonDown(MouseButton button)
{
GLFWwindow* windowHandle = Application::Get().GetWindowHandle();
int state = glfwGetMouseButton(windowHandle, (int)button);
return state == GLFW_PRESS;
}

glm::vec2 Input::GetMousePosition()
{
GLFWwindow* windowHandle = Application::Get().GetWindowHandle();

double x, y;
glfwGetCursorPos(windowHandle, &x, &y);
return { (float)x, (float)y };
}

void Input::SetCursorMode(CursorMode mode)
{
GLFWwindow* windowHandle = Application::Get().GetWindowHandle();
glfwSetInputMode(windowHandle, GLFW_CURSOR, GLFW_CURSOR_NORMAL + (int)mode);
}

}
20 changes: 20 additions & 0 deletions Walnut/src/Walnut/Input/Input.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
#pragma once

#include "KeyCodes.h"

#include <glm/glm.hpp>

namespace Walnut {

class Input
{
public:
static bool IsKeyDown(KeyCode keycode);
static bool IsMouseButtonDown(MouseButton button);

static glm::vec2 GetMousePosition();

static void SetCursorMode(CursorMode mode);
};

}
184 changes: 184 additions & 0 deletions Walnut/src/Walnut/Input/KeyCodes.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,184 @@
#pragma once

#include <stdint.h>
#include <iostream>

namespace Walnut {

typedef enum class KeyCode : uint16_t
{
// From glfw3.h
Space = 32,
Apostrophe = 39, /* ' */
Comma = 44, /* , */
Minus = 45, /* - */
Period = 46, /* . */
Slash = 47, /* / */

D0 = 48, /* 0 */
D1 = 49, /* 1 */
D2 = 50, /* 2 */
D3 = 51, /* 3 */
D4 = 52, /* 4 */
D5 = 53, /* 5 */
D6 = 54, /* 6 */
D7 = 55, /* 7 */
D8 = 56, /* 8 */
D9 = 57, /* 9 */

Semicolon = 59, /* ; */
Equal = 61, /* = */

A = 65,
B = 66,
C = 67,
D = 68,
E = 69,
F = 70,
G = 71,
H = 72,
I = 73,
J = 74,
K = 75,
L = 76,
M = 77,
N = 78,
O = 79,
P = 80,
Q = 81,
R = 82,
S = 83,
T = 84,
U = 85,
V = 86,
W = 87,
X = 88,
Y = 89,
Z = 90,

LeftBracket = 91, /* [ */
Backslash = 92, /* \ */
RightBracket = 93, /* ] */
GraveAccent = 96, /* ` */

World1 = 161, /* non-US #1 */
World2 = 162, /* non-US #2 */

/* Function keys */
Escape = 256,
Enter = 257,
Tab = 258,
Backspace = 259,
Insert = 260,
Delete = 261,
Right = 262,
Left = 263,
Down = 264,
Up = 265,
PageUp = 266,
PageDown = 267,
Home = 268,
End = 269,
CapsLock = 280,
ScrollLock = 281,
NumLock = 282,
PrintScreen = 283,
Pause = 284,
F1 = 290,
F2 = 291,
F3 = 292,
F4 = 293,
F5 = 294,
F6 = 295,
F7 = 296,
F8 = 297,
F9 = 298,
F10 = 299,
F11 = 300,
F12 = 301,
F13 = 302,
F14 = 303,
F15 = 304,
F16 = 305,
F17 = 306,
F18 = 307,
F19 = 308,
F20 = 309,
F21 = 310,
F22 = 311,
F23 = 312,
F24 = 313,
F25 = 314,

/* Keypad */
KP0 = 320,
KP1 = 321,
KP2 = 322,
KP3 = 323,
KP4 = 324,
KP5 = 325,
KP6 = 326,
KP7 = 327,
KP8 = 328,
KP9 = 329,
KPDecimal = 330,
KPDivide = 331,
KPMultiply = 332,
KPSubtract = 333,
KPAdd = 334,
KPEnter = 335,
KPEqual = 336,

LeftShift = 340,
LeftControl = 341,
LeftAlt = 342,
LeftSuper = 343,
RightShift = 344,
RightControl = 345,
RightAlt = 346,
RightSuper = 347,
Menu = 348
} Key;

enum class KeyState
{
None = -1,
Pressed,
Held,
Released
};

enum class CursorMode
{
Normal = 0,
Hidden = 1,
Locked = 2
};

typedef enum class MouseButton : uint16_t
{
Button0 = 0,
Button1 = 1,
Button2 = 2,
Button3 = 3,
Button4 = 4,
Button5 = 5,
Left = Button0,
Right = Button1,
Middle = Button2
} Button;


inline std::ostream& operator<<(std::ostream& os, KeyCode keyCode)
{
os << static_cast<int32_t>(keyCode);
return os;
}

inline std::ostream& operator<<(std::ostream& os, MouseButton button)
{
os << static_cast<int32_t>(button);
return os;
}
}

1 change: 1 addition & 0 deletions Walnut/src/Walnut/Layer.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ namespace Walnut {
virtual void OnAttach() {}
virtual void OnDetach() {}

virtual void OnUpdate(float ts) {}
virtual void OnUIRender() {}
};

Expand Down

0 comments on commit 20f940b

Please sign in to comment.