Adding callbacks and viewports
This commit is contained in:
@@ -2,6 +2,151 @@
|
||||
#include "MinimalEngine.h"
|
||||
namespace Seele
|
||||
{
|
||||
|
||||
enum class KeyCode
|
||||
{
|
||||
/* Printable keys */
|
||||
KEY_SPACE = 32,
|
||||
KEY_APOSTROPHE = 39 /* ' */,
|
||||
KEY_COMMA = 44 /* , */,
|
||||
KEY_MINUS = 45 /* - */,
|
||||
KEY_PERIOD = 46 /* . */,
|
||||
KEY_SLASH = 47 /* / */,
|
||||
KEY_0 = 48,
|
||||
KEY_1 = 49,
|
||||
KEY_2 = 50,
|
||||
KEY_3 = 51,
|
||||
KEY_4 = 52,
|
||||
KEY_5 = 53,
|
||||
KEY_6 = 54,
|
||||
KEY_7 = 55,
|
||||
KEY_8 = 56,
|
||||
KEY_9 = 57,
|
||||
KEY_SEMICOLON = 59 /* ; */,
|
||||
KEY_EQUAL = 61 /* = */,
|
||||
KEY_A = 65,
|
||||
KEY_B = 66,
|
||||
KEY_C = 67,
|
||||
KEY_D = 68,
|
||||
KEY_E = 69,
|
||||
KEY_F = 70,
|
||||
KEY_G = 71,
|
||||
KEY_H = 72,
|
||||
KEY_I = 73,
|
||||
KEY_J = 74,
|
||||
KEY_K = 75,
|
||||
KEY_L = 76,
|
||||
KEY_M = 77,
|
||||
KEY_N = 78,
|
||||
KEY_O = 79,
|
||||
KEY_P = 80,
|
||||
KEY_Q = 81,
|
||||
KEY_R = 82,
|
||||
KEY_S = 83,
|
||||
KEY_T = 84,
|
||||
KEY_U = 85,
|
||||
KEY_V = 86,
|
||||
KEY_W = 87,
|
||||
KEY_X = 88,
|
||||
KEY_Y = 89,
|
||||
KEY_Z = 90,
|
||||
KEY_LEFT_BRACKET = 91 /* [ */,
|
||||
KEY_BACKSLASH = 92 /* \ */,
|
||||
KEY_RIGHT_BRACKET = 93 /* ] */,
|
||||
KEY_GRAVE_ACCENT = 96 /* ` */,
|
||||
KEY_WORLD_1 = 161 /* non-US #1 */,
|
||||
KEY_WORLD_2 = 162 /* non-US #2 */,
|
||||
/* Function keys */
|
||||
KEY_ESCAPE = 256,
|
||||
KEY_ENTER = 257,
|
||||
KEY_TAB = 258,
|
||||
KEY_BACKSPACE = 259,
|
||||
KEY_INSERT = 260,
|
||||
KEY_DELETE = 261,
|
||||
KEY_RIGHT = 262,
|
||||
KEY_LEFT = 263,
|
||||
KEY_DOWN = 264,
|
||||
KEY_UP = 265,
|
||||
KEY_PAGE_UP = 266,
|
||||
KEY_PAGE_DOWN = 267,
|
||||
KEY_HOME = 268,
|
||||
KEY_END = 269,
|
||||
KEY_CAPS_LOCK = 280,
|
||||
KEY_SCROLL_LOCK = 281,
|
||||
KEY_NUM_LOCK = 282,
|
||||
KEY_PRINT_SCREEN = 283,
|
||||
KEY_PAUSE = 284,
|
||||
KEY_F1 = 290,
|
||||
KEY_F2 = 291,
|
||||
KEY_F3 = 292,
|
||||
KEY_F4 = 293,
|
||||
KEY_F5 = 294,
|
||||
KEY_F6 = 295,
|
||||
KEY_F7 = 296,
|
||||
KEY_F8 = 297,
|
||||
KEY_F9 = 298,
|
||||
KEY_F10 = 299,
|
||||
KEY_F11 = 300,
|
||||
KEY_F12 = 301,
|
||||
KEY_F13 = 302,
|
||||
KEY_F14 = 303,
|
||||
KEY_F15 = 304,
|
||||
KEY_F16 = 305,
|
||||
KEY_F17 = 306,
|
||||
KEY_F18 = 307,
|
||||
KEY_F19 = 308,
|
||||
KEY_F20 = 309,
|
||||
KEY_F21 = 310,
|
||||
KEY_F22 = 311,
|
||||
KEY_F23 = 312,
|
||||
KEY_F24 = 313,
|
||||
KEY_F25 = 314,
|
||||
KEY_KP_0 = 320,
|
||||
KEY_KP_1 = 321,
|
||||
KEY_KP_2 = 322,
|
||||
KEY_KP_3 = 323,
|
||||
KEY_KP_4 = 324,
|
||||
KEY_KP_5 = 325,
|
||||
KEY_KP_6 = 326,
|
||||
KEY_KP_7 = 327,
|
||||
KEY_KP_8 = 328,
|
||||
KEY_KP_9 = 329,
|
||||
KEY_KP_DECIMAL = 330,
|
||||
KEY_KP_DIVIDE = 331,
|
||||
KEY_KP_MULTIPLY = 332,
|
||||
KEY_KP_SUBTRACT = 333,
|
||||
KEY_KP_ADD = 334,
|
||||
KEY_KP_ENTER = 335,
|
||||
KEY_KP_EQUAL = 336,
|
||||
KEY_LEFT_SHIFT = 340,
|
||||
KEY_LEFT_CONTROL = 341,
|
||||
KEY_LEFT_ALT = 342,
|
||||
KEY_LEFT_SUPER = 343,
|
||||
KEY_RIGHT_SHIFT = 344,
|
||||
KEY_RIGHT_CONTROL = 345,
|
||||
KEY_RIGHT_ALT = 346,
|
||||
KEY_RIGHT_SUPER = 347,
|
||||
KEY_MENU = 348,
|
||||
};
|
||||
|
||||
enum class KeyAction
|
||||
{
|
||||
RELEASE = 0,
|
||||
PRESS = 1,
|
||||
REPEAT = 2
|
||||
};
|
||||
|
||||
enum class KeyModifier
|
||||
{
|
||||
MOD_SHIFT = 0x0001,
|
||||
MOD_CONTROL = 0x0002,
|
||||
MOD_ALT = 0x0004,
|
||||
MOD_SUPER = 0x0008,
|
||||
MOD_CAPS_LOCK = 0x0010,
|
||||
MOD_NUM_LOCK = 0x0020
|
||||
};
|
||||
typedef uint32 KeyModifierFlags;
|
||||
|
||||
namespace Gfx
|
||||
{
|
||||
static constexpr bool useAsyncCompute = true;
|
||||
@@ -30,6 +175,22 @@ enum class RenderPassType : uint8
|
||||
BasePass
|
||||
};
|
||||
|
||||
enum class QueueType
|
||||
{
|
||||
GRAPHICS = 1,
|
||||
COMPUTE = 2,
|
||||
TRANSFER = 3,
|
||||
DEDICATED_TRANSFER = 4
|
||||
};
|
||||
enum class VertexAttribute
|
||||
{
|
||||
POSITION,
|
||||
TEXCOORD,
|
||||
NORMAL,
|
||||
TANGENT,
|
||||
BITANGENT
|
||||
};
|
||||
|
||||
typedef uint32_t SeFlags;
|
||||
typedef uint32_t SeBool32;
|
||||
typedef uint64_t SeDeviceSize;
|
||||
@@ -1885,20 +2046,5 @@ typedef union SeClearValue {
|
||||
SeClearDepthStencilValue depthStencil;
|
||||
} SeClearValue;
|
||||
|
||||
enum class QueueType
|
||||
{
|
||||
GRAPHICS = 1,
|
||||
COMPUTE = 2,
|
||||
TRANSFER = 3,
|
||||
DEDICATED_TRANSFER = 4
|
||||
};
|
||||
enum class VertexAttribute
|
||||
{
|
||||
POSITION,
|
||||
TEXCOORD,
|
||||
NORMAL,
|
||||
TANGENT,
|
||||
BITANGENT
|
||||
};
|
||||
} // namespace Gfx
|
||||
} // namespace Seele
|
||||
@@ -5,6 +5,7 @@
|
||||
#include "GraphicsInitializer.h"
|
||||
#include "MeshBatch.h"
|
||||
#include <boost/crc.hpp>
|
||||
#include <functional>
|
||||
|
||||
|
||||
#ifndef ENABLE_VALIDATION
|
||||
@@ -499,6 +500,7 @@ public:
|
||||
virtual void endFrame() = 0;
|
||||
virtual void onWindowCloseEvent() = 0;
|
||||
virtual PTexture2D getBackBuffer() = 0;
|
||||
virtual void setKeyCallback(std::function<void(KeyCode, KeyAction, KeyModifier)> callback) = 0;
|
||||
SeFormat getSwapchainFormat() const
|
||||
{
|
||||
return pixelFormat;
|
||||
|
||||
@@ -3,6 +3,8 @@
|
||||
#include "Scene/Scene.h"
|
||||
#include "Window.h"
|
||||
#include "Scene/Actor/CameraActor.h"
|
||||
#include "Scene/Components/CameraComponent.h"
|
||||
#include <iostream>
|
||||
|
||||
using namespace Seele;
|
||||
|
||||
@@ -10,11 +12,17 @@ Seele::SceneView::SceneView(Gfx::PGraphics graphics, PWindow owner, const Viewpo
|
||||
: View(graphics, owner, createInfo)
|
||||
{
|
||||
scene = new Scene(graphics);
|
||||
PCameraActor camera = new CameraActor();
|
||||
scene->addActor(camera);
|
||||
renderer = new SceneRenderPath(scene, graphics, viewport, camera);
|
||||
activeCamera = new CameraActor();
|
||||
scene->addActor(activeCamera);
|
||||
renderer = new SceneRenderPath(scene, graphics, viewport, activeCamera);
|
||||
}
|
||||
|
||||
Seele::SceneView::~SceneView()
|
||||
{
|
||||
}
|
||||
|
||||
void SceneView::keyCallback(KeyCode code, KeyAction action, KeyModifier modifier)
|
||||
{
|
||||
std::cout << "Key callback " << (uint32)code << std::endl;
|
||||
activeCamera->getCameraComponent()->moveOrigin(1);
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
namespace Seele
|
||||
{
|
||||
DECLARE_REF(Scene);
|
||||
DECLARE_REF(CameraActor);
|
||||
class SceneView : public View
|
||||
{
|
||||
public:
|
||||
@@ -11,6 +12,8 @@ public:
|
||||
PScene getScene() const { return scene; }
|
||||
private:
|
||||
PScene scene;
|
||||
PCameraActor activeCamera;
|
||||
virtual void keyCallback(KeyCode code, KeyAction action, KeyModifier modifier) override;
|
||||
};
|
||||
DEFINE_REF(SceneView);
|
||||
} // namespace Seele
|
||||
@@ -30,3 +30,8 @@ void Seele::View::applyArea(URect area)
|
||||
{
|
||||
renderer->applyArea(area);
|
||||
}
|
||||
|
||||
void View::setFocused()
|
||||
{
|
||||
owner->setFocused(this);
|
||||
}
|
||||
|
||||
@@ -13,12 +13,16 @@ public:
|
||||
void render();
|
||||
void endFrame();
|
||||
void applyArea(URect area);
|
||||
void setFocused();
|
||||
|
||||
protected:
|
||||
Gfx::PGraphics graphics;
|
||||
Gfx::PViewport viewport;
|
||||
PWindow owner;
|
||||
PRenderPath renderer;
|
||||
|
||||
virtual void keyCallback(KeyCode code, KeyAction action, KeyModifier modifier) = 0;
|
||||
friend class Window;
|
||||
};
|
||||
|
||||
DEFINE_REF(View)
|
||||
|
||||
@@ -315,7 +315,9 @@ public:
|
||||
virtual void endFrame() override;
|
||||
virtual Gfx::PTexture2D getBackBuffer() override;
|
||||
virtual void onWindowCloseEvent() override;
|
||||
virtual void setKeyCallback(std::function<void(KeyCode, KeyAction, KeyModifier)> callback) override;
|
||||
|
||||
std::function<void(KeyCode, KeyAction, KeyModifier)> keyCallback;
|
||||
protected:
|
||||
void advanceBackBuffer();
|
||||
void recreateSwapchain(const WindowCreateInfo &createInfo);
|
||||
@@ -324,6 +326,7 @@ protected:
|
||||
void createSwapchain();
|
||||
void chooseSurfaceFormat(const Array<VkSurfaceFormatKHR> &available, Gfx::SeFormat preferred);
|
||||
void choosePresentMode(const Array<VkPresentModeKHR> &modes);
|
||||
|
||||
PTexture2D backBufferImages[Gfx::numFramesBuffered];
|
||||
PSemaphore renderFinished[Gfx::numFramesBuffered];
|
||||
PSemaphore imageAcquired[Gfx::numFramesBuffered];
|
||||
|
||||
@@ -768,9 +768,9 @@ VkPipelineShaderStageCreateInfo init::PipelineShaderStageCreateInfo(VkShaderStag
|
||||
#pragma warning(disable : 4100)
|
||||
VkBool32 Seele::Vulkan::debugCallback(VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objType, uint64_t obj, size_t location, int32_t code, const char *layerPrefix, const char *msg, void *userDataManager)
|
||||
{
|
||||
if(flags & VK_DEBUG_REPORT_ERROR_BIT_EXT)
|
||||
if(flags & VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT)
|
||||
{
|
||||
std::cerr << layerPrefix << ": " << msg << std::endl;
|
||||
//std::cerr << layerPrefix << ": " << msg << std::endl;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -285,7 +285,7 @@ PGraphicsPipeline PipelineCache::createPipeline(const GraphicsPipelineCreateInfo
|
||||
VK_CHECK(vkCreateGraphicsPipelines(graphics->getDevice(), cache, 1, &createInfo, nullptr, &pipelineHandle));
|
||||
auto endTime = std::chrono::high_resolution_clock::now();
|
||||
int64 delta = std::chrono::duration_cast<std::chrono::microseconds>(endTime - beginTime).count();
|
||||
std::cout << "Gfx creation time: " << delta << std::endl;
|
||||
//std::cout << "Gfx creation time: " << delta << std::endl;
|
||||
|
||||
PGraphicsPipeline result = new GraphicsPipeline(graphics, pipelineHandle, layout, gfxInfo);
|
||||
return result;
|
||||
|
||||
@@ -8,14 +8,22 @@
|
||||
using namespace Seele;
|
||||
using namespace Seele::Vulkan;
|
||||
|
||||
void glfwKeyCallback(GLFWwindow* handle, int key, int scancode, int action, int modifier)
|
||||
{
|
||||
Window* window = (Window*)glfwGetWindowUserPointer(handle);
|
||||
std::cout << "glfw callback: " << key << std::endl;
|
||||
window->keyCallback((KeyCode)key, (KeyAction)action, (KeyModifier)modifier);
|
||||
}
|
||||
|
||||
Window::Window(PGraphics graphics, const WindowCreateInfo &createInfo)
|
||||
: Gfx::Window(createInfo), graphics(graphics), instance(graphics->getInstance()), swapchain(VK_NULL_HANDLE), numSamples(createInfo.numSamples), pixelFormat(cast(createInfo.pixelFormat))
|
||||
{
|
||||
glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
|
||||
GLFWwindow *handle = glfwCreateWindow(createInfo.width, createInfo.height, createInfo.title, createInfo.bFullscreen ? glfwGetPrimaryMonitor() : nullptr, nullptr);
|
||||
windowHandle = handle;
|
||||
glfwSetWindowUserPointer(handle, this);
|
||||
|
||||
//TODO: callbacks
|
||||
glfwSetKeyCallback(handle, &glfwKeyCallback);
|
||||
|
||||
glfwCreateWindowSurface(instance, handle, nullptr, &surface);
|
||||
|
||||
@@ -69,6 +77,11 @@ Gfx::PTexture2D Window::getBackBuffer()
|
||||
return backBufferImages[currentImageIndex];
|
||||
}
|
||||
|
||||
void Window::setKeyCallback(std::function<void(KeyCode, KeyAction, KeyModifier)> callback)
|
||||
{
|
||||
keyCallback = callback;
|
||||
}
|
||||
|
||||
void Window::advanceBackBuffer()
|
||||
{
|
||||
VkResult res = VK_ERROR_OUT_OF_DATE_KHR;
|
||||
@@ -258,9 +271,13 @@ void Window::choosePresentMode(const Array<VkPresentModeKHR> &modes)
|
||||
Viewport::Viewport(PGraphics graphics, PWindow owner, const ViewportCreateInfo &viewportInfo)
|
||||
: Gfx::Viewport(owner, viewportInfo), graphics(graphics)
|
||||
{
|
||||
handle = init::Viewport(static_cast<float>(viewportInfo.sizeX), static_cast<float>(viewportInfo.sizeY), 0.f, 1.f);
|
||||
handle.width = static_cast<float>(viewportInfo.sizeX);
|
||||
handle.height = static_cast<float>(viewportInfo.sizeY);
|
||||
handle.x = static_cast<float>(viewportInfo.offsetX);
|
||||
handle.y = static_cast<float>(viewportInfo.offsetY);
|
||||
handle.y = static_cast<float>(viewportInfo.offsetY) + handle.height;
|
||||
handle.height = -handle.height;
|
||||
handle.minDepth = 0.f;
|
||||
handle.maxDepth = 1.f;
|
||||
}
|
||||
|
||||
Viewport::~Viewport()
|
||||
@@ -271,10 +288,15 @@ void Viewport::resize(uint32 newX, uint32 newY)
|
||||
{
|
||||
sizeX = newX;
|
||||
sizeY = newY;
|
||||
handle.width = static_cast<float>(sizeX);
|
||||
handle.y = static_cast<float>(sizeY + offsetX);
|
||||
handle.height = -static_cast<float>(sizeY);
|
||||
}
|
||||
|
||||
void Viewport::move(uint32 newOffsetX, uint32 newOffsetY)
|
||||
{
|
||||
offsetX = newOffsetX;
|
||||
offsetY = newOffsetY;
|
||||
handle.x = static_cast<float>(offsetX);
|
||||
handle.y = static_cast<float>(offsetY + sizeY);
|
||||
}
|
||||
@@ -1,4 +1,5 @@
|
||||
#include "Window.h"
|
||||
#include <functional>
|
||||
|
||||
Seele::Window::Window(Gfx::PWindow handle)
|
||||
: gfxHandle(handle)
|
||||
@@ -43,4 +44,11 @@ void Seele::Window::endFrame()
|
||||
Gfx::PWindow Seele::Window::getGfxHandle()
|
||||
{
|
||||
return gfxHandle;
|
||||
}
|
||||
}
|
||||
|
||||
void Window::setFocused(PView view)
|
||||
{
|
||||
focusedView = view;
|
||||
auto boundFunction = std::bind(&View::keyCallback, view.getHandle(), std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
|
||||
gfxHandle->setKeyCallback(boundFunction);
|
||||
}
|
||||
|
||||
@@ -15,9 +15,11 @@ public:
|
||||
void render();
|
||||
void endFrame();
|
||||
Gfx::PWindow getGfxHandle();
|
||||
void setFocused(PView view);
|
||||
|
||||
private:
|
||||
Array<PView> viewports;
|
||||
PView focusedView;
|
||||
Gfx::PWindow gfxHandle;
|
||||
};
|
||||
DEFINE_REF(Window);
|
||||
|
||||
Reference in New Issue
Block a user