WIP crafter.math
This commit is contained in:
parent
98b775e33e
commit
84099f07ed
11 changed files with 139 additions and 310 deletions
|
|
@ -1,26 +1,15 @@
|
||||||
module;
|
module;
|
||||||
|
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#define GLM_FORCE_RADIANS
|
|
||||||
#define GLM_FORCE_DEPTH_ZERO_TO_ONE
|
|
||||||
#define GLM_ENABLE_EXPERIMENTAL
|
|
||||||
#include <glm/glm.hpp>
|
|
||||||
#include <glm/gtc/matrix_transform.hpp>
|
|
||||||
#include <glm/gtc/matrix_inverse.hpp>
|
|
||||||
#include <glm/gtc/type_ptr.hpp>
|
|
||||||
#include "VulkanBuffer.h"
|
#include "VulkanBuffer.h"
|
||||||
#include "camera.hpp"
|
|
||||||
#include <vulkan/vulkan.h>
|
#include <vulkan/vulkan.h>
|
||||||
|
|
||||||
module Crafter.Graphics;
|
module Crafter.Graphics;
|
||||||
|
import Crafter.Math;
|
||||||
using namespace Crafter;
|
using namespace Crafter;
|
||||||
|
|
||||||
Camera::Camera() {
|
Camera::Camera(float fov, float aspectRatio, float near, float far) {
|
||||||
old::Camera camera;
|
projection = Matrix<float, 4, 4, 1>::Projection(fov, aspectRatio, near, far);
|
||||||
camera.type = old::Camera::CameraType::firstperson;
|
view = Matrix<float, 4, 4, 1>::Idenity();
|
||||||
camera.setPerspective(90.0f, 16 / 9, 0.1f, 512.0f);
|
|
||||||
camera.setRotation(glm::vec3(180.0f, 150, 0));
|
|
||||||
camera.setTranslation(glm::vec3(-100.0f, -130.0f, -100.0f));
|
|
||||||
|
|
||||||
projectionView = camera.matrices.perspective*camera.matrices.view;
|
projectionView = camera.matrices.perspective*camera.matrices.view;
|
||||||
}
|
}
|
||||||
|
|
@ -1,26 +1,18 @@
|
||||||
module;
|
module;
|
||||||
|
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#define GLM_FORCE_RADIANS
|
|
||||||
#define GLM_FORCE_DEPTH_ZERO_TO_ONE
|
|
||||||
#define GLM_ENABLE_EXPERIMENTAL
|
|
||||||
#include <glm/glm.hpp>
|
|
||||||
#include <glm/gtc/matrix_transform.hpp>
|
|
||||||
#include <glm/gtc/matrix_inverse.hpp>
|
|
||||||
#include <glm/gtc/type_ptr.hpp>
|
|
||||||
#include "VulkanBuffer.h"
|
|
||||||
#include "camera.hpp"
|
|
||||||
|
|
||||||
export module Crafter.Graphics:Camera;
|
export module Crafter.Graphics:Camera;
|
||||||
import :VulkanBuffer;
|
import :VulkanBuffer;
|
||||||
import Crafter.Component;
|
import Crafter.Component;
|
||||||
|
import Crafter.Math;
|
||||||
|
|
||||||
namespace Crafter {
|
namespace Crafter {
|
||||||
export class Camera : public Component {
|
export class Camera : public Component {
|
||||||
public:
|
public:
|
||||||
glm::mat4 projection;
|
Matrix<float, 4, 4, 1> projection;
|
||||||
glm::mat4 view;
|
Matrix<float, 4, 4, 1> view;
|
||||||
glm::mat4 projectionView;
|
Matrix<float, 4, 4, 1> projectionView;
|
||||||
Camera();
|
Camera(float fov, float aspectRatio, float near, float far);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,13 +4,7 @@ module;
|
||||||
#include <vulkan/vulkan.h>
|
#include <vulkan/vulkan.h>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#define GLM_FORCE_RADIANS
|
#include <cmath>
|
||||||
#define GLM_FORCE_DEPTH_ZERO_TO_ONE
|
|
||||||
#define GLM_ENABLE_EXPERIMENTAL
|
|
||||||
#include <glm/glm.hpp>
|
|
||||||
#include <glm/gtc/matrix_transform.hpp>
|
|
||||||
#include <glm/gtc/matrix_inverse.hpp>
|
|
||||||
#include <glm/gtc/type_ptr.hpp>
|
|
||||||
|
|
||||||
export module Crafter.Graphics:MeshShader;
|
export module Crafter.Graphics:MeshShader;
|
||||||
import Crafter.Component;
|
import Crafter.Component;
|
||||||
|
|
@ -23,10 +17,10 @@ namespace Crafter {
|
||||||
export template <typename VertexType>
|
export template <typename VertexType>
|
||||||
class MeshShader {
|
class MeshShader {
|
||||||
public:
|
public:
|
||||||
glm::mat4 transform;
|
//glm::mat4 transform;
|
||||||
ComponentRefOwning<Mesh<VertexType>> mesh;
|
ComponentRefOwning<Mesh<VertexType>> mesh;
|
||||||
ComponentRefOwning<Camera> camera;
|
ComponentRefOwning<Camera> camera;
|
||||||
Buffer<glm::mat4> mvp;
|
Buffer<float> mvp;
|
||||||
std::uint32_t threadCount;
|
std::uint32_t threadCount;
|
||||||
MeshShader(Mesh<VertexType>* mesh, Camera* camera) : threadCount(std::ceil(static_cast<double>(mesh->indexCount)/64/3)), mvp(VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT), mesh(mesh), camera(camera) {
|
MeshShader(Mesh<VertexType>* mesh, Camera* camera) : threadCount(std::ceil(static_cast<double>(mesh->indexCount)/64/3)), mvp(VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT), mesh(mesh), camera(camera) {
|
||||||
|
|
||||||
|
|
@ -37,7 +31,7 @@ namespace Crafter {
|
||||||
set.Write(0, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 2, &mesh.component->indicies.descriptor);
|
set.Write(0, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 2, &mesh.component->indicies.descriptor);
|
||||||
}
|
}
|
||||||
void Update() {
|
void Update() {
|
||||||
mvp.value[0] = camera.component->projectionView*transform;
|
//mvp.value[0] = camera.component->projectionView*transform;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,7 @@ namespace Crafter {
|
||||||
float z;
|
float z;
|
||||||
float w;
|
float w;
|
||||||
};
|
};
|
||||||
export struct Vertex_xf32_yf32_zf32_wf32_uf32_vf32 {
|
export struct __attribute__((packed)) VertexUV {
|
||||||
float x;
|
float x;
|
||||||
float y;
|
float y;
|
||||||
float z;
|
float z;
|
||||||
|
|
|
||||||
|
|
@ -4,15 +4,7 @@ module;
|
||||||
#include <vulkan/vulkan.h>
|
#include <vulkan/vulkan.h>
|
||||||
#include <array>
|
#include <array>
|
||||||
#include "VulkanInitializers.hpp"
|
#include "VulkanInitializers.hpp"
|
||||||
#define GLM_FORCE_RADIANS
|
|
||||||
#define GLM_FORCE_DEPTH_ZERO_TO_ONE
|
|
||||||
#define GLM_ENABLE_EXPERIMENTAL
|
|
||||||
#include <glm/glm.hpp>
|
|
||||||
#include <glm/gtc/matrix_transform.hpp>
|
|
||||||
#include <glm/gtc/matrix_inverse.hpp>
|
|
||||||
#include <glm/gtc/type_ptr.hpp>
|
|
||||||
#include "VulkanBuffer.h"
|
#include "VulkanBuffer.h"
|
||||||
#include "camera.hpp"
|
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
|
|
||||||
export module Crafter.Graphics:VulkanPipeline;
|
export module Crafter.Graphics:VulkanPipeline;
|
||||||
|
|
@ -157,7 +149,7 @@ namespace Crafter {
|
||||||
|
|
||||||
// Pipeline
|
// Pipeline
|
||||||
VkPipelineInputAssemblyStateCreateInfo inputAssemblyState = vks::initializers::pipelineInputAssemblyStateCreateInfo(VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, 0, VK_FALSE);
|
VkPipelineInputAssemblyStateCreateInfo inputAssemblyState = vks::initializers::pipelineInputAssemblyStateCreateInfo(VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, 0, VK_FALSE);
|
||||||
VkPipelineRasterizationStateCreateInfo rasterizationState = vks::initializers::pipelineRasterizationStateCreateInfo(VK_POLYGON_MODE_FILL, VK_CULL_MODE_NONE, VK_FRONT_FACE_CLOCKWISE, 0);
|
VkPipelineRasterizationStateCreateInfo rasterizationState = vks::initializers::pipelineRasterizationStateCreateInfo(VK_POLYGON_MODE_FILL, VK_CULL_MODE_BACK_BIT, VK_FRONT_FACE_CLOCKWISE, 0);
|
||||||
VkPipelineColorBlendAttachmentState blendAttachmentState = vks::initializers::pipelineColorBlendAttachmentState(0xf, VK_FALSE);
|
VkPipelineColorBlendAttachmentState blendAttachmentState = vks::initializers::pipelineColorBlendAttachmentState(0xf, VK_FALSE);
|
||||||
VkPipelineColorBlendStateCreateInfo colorBlendState = vks::initializers::pipelineColorBlendStateCreateInfo(1, &blendAttachmentState);
|
VkPipelineColorBlendStateCreateInfo colorBlendState = vks::initializers::pipelineColorBlendStateCreateInfo(1, &blendAttachmentState);
|
||||||
VkPipelineDepthStencilStateCreateInfo depthStencilState = vks::initializers::pipelineDepthStencilStateCreateInfo(VK_TRUE, VK_TRUE, VK_COMPARE_OP_LESS_OR_EQUAL);
|
VkPipelineDepthStencilStateCreateInfo depthStencilState = vks::initializers::pipelineDepthStencilStateCreateInfo(VK_TRUE, VK_TRUE, VK_COMPARE_OP_LESS_OR_EQUAL);
|
||||||
|
|
|
||||||
|
|
@ -28,6 +28,10 @@ export namespace Crafter {
|
||||||
MousePoint mouseDelta;
|
MousePoint mouseDelta;
|
||||||
bool mouseLeftHeld = false;
|
bool mouseLeftHeld = false;
|
||||||
bool mouseRightHeld = false;
|
bool mouseRightHeld = false;
|
||||||
|
bool heldkeys[255] = {};
|
||||||
|
Event<void> onKeyDown[255];
|
||||||
|
Event<void> onKeyHold[255];
|
||||||
|
Event<void> onKeyUp[255];
|
||||||
ComponentRefVectorOwning<UiElement> elements;
|
ComponentRefVectorOwning<UiElement> elements;
|
||||||
std::string name;
|
std::string name;
|
||||||
std::uint32_t width;
|
std::uint32_t width;
|
||||||
|
|
|
||||||
|
|
@ -33,6 +33,8 @@ module;
|
||||||
#include <wayland-client-protocol.h>
|
#include <wayland-client-protocol.h>
|
||||||
#include <linux/input-event-codes.h>
|
#include <linux/input-event-codes.h>
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
|
#include <xkbcommon/xkbcommon.h>
|
||||||
|
#include <cstdio>
|
||||||
|
|
||||||
|
|
||||||
module Crafter.Graphics;
|
module Crafter.Graphics;
|
||||||
|
|
@ -100,6 +102,91 @@ wl_pointer_listener WindowWayland::pointer_listener = {
|
||||||
.axis = WindowWayland::PointerListenerHandleAxis,
|
.axis = WindowWayland::PointerListenerHandleAxis,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
xkb_keymap* xkb_keymap;
|
||||||
|
xkb_context* xkb_context = xkb_context_new(XKB_CONTEXT_NO_FLAGS);
|
||||||
|
xkb_state* xkb_state;
|
||||||
|
|
||||||
|
|
||||||
|
void keyboard_keymap(void *data, wl_keyboard *keyboard, uint32_t format, int fd, uint32_t size) {
|
||||||
|
if (format != WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1) {
|
||||||
|
close(fd);
|
||||||
|
fprintf(stderr, "Unsupported keymap format\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *map = mmap(NULL, size, PROT_READ, MAP_SHARED, fd, 0);
|
||||||
|
if (map == MAP_FAILED) {
|
||||||
|
close(fd);
|
||||||
|
perror("mmap");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
xkb_context = xkb_context_new(XKB_CONTEXT_NO_FLAGS);
|
||||||
|
xkb_keymap = xkb_keymap_new_from_string(xkb_context, (const char *)map, XKB_KEYMAP_FORMAT_TEXT_V1,XKB_KEYMAP_COMPILE_NO_FLAGS);
|
||||||
|
munmap(map, size);
|
||||||
|
close(fd);
|
||||||
|
|
||||||
|
xkb_state = xkb_state_new(xkb_keymap);
|
||||||
|
}
|
||||||
|
|
||||||
|
void keyboard_enter(void *data, wl_keyboard *keyboard, uint32_t serial, wl_surface *surface, wl_array *keys) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void keyboard_leave(void *data, wl_keyboard *keyboard, uint32_t serial, wl_surface *surface) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void keyboard_key(void *data, wl_keyboard *keyboard, uint32_t serial, uint32_t time, uint32_t key, uint32_t state) {
|
||||||
|
if (!xkb_state) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
WindowWayland* window = reinterpret_cast<WindowWayland*>(data);
|
||||||
|
|
||||||
|
xkb_keycode_t keycode = key + 8;
|
||||||
|
xkb_keysym_t keysym = xkb_state_key_get_one_sym(xkb_state, keycode);
|
||||||
|
|
||||||
|
char utf8[8] = {0};
|
||||||
|
int len = xkb_keysym_to_utf8(keysym, utf8, sizeof(utf8));
|
||||||
|
if (len != 0) {
|
||||||
|
char keypress = utf8[0];
|
||||||
|
if(state == WL_KEYBOARD_KEY_STATE_PRESSED) {
|
||||||
|
if(window->heldkeys[keypress]) {
|
||||||
|
window->onKeyHold[keypress].Invoke();
|
||||||
|
} else{
|
||||||
|
window->onKeyDown[keypress].Invoke();
|
||||||
|
}
|
||||||
|
} else{
|
||||||
|
window->onKeyUp[keypress].Invoke();
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// // fallback for keys like Return, Escape, etc.
|
||||||
|
// char name[64];
|
||||||
|
// if (xkb_keysym_get_name(keysym, name, sizeof(name)) > 0) {
|
||||||
|
// printf("Key %s pressed (non-printable or multi-char)\n", name);
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void keyboard_modifiers(void *data, wl_keyboard *keyboard, uint32_t serial, uint32_t mods_depressed, uint32_t mods_latched, uint32_t mods_locked, uint32_t group) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void keyboard_repeat_info(void *data, wl_keyboard *keyboard, int32_t rate, int32_t delay) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
wl_keyboard_listener WindowWayland::keyboard_listener = {
|
||||||
|
.keymap = keyboard_keymap,
|
||||||
|
.enter = keyboard_enter,
|
||||||
|
.leave = keyboard_leave,
|
||||||
|
.key = keyboard_key,
|
||||||
|
.modifiers = keyboard_modifiers,
|
||||||
|
.repeat_info = keyboard_repeat_info,
|
||||||
|
};
|
||||||
|
|
||||||
void WindowWayland::seat_handle_capabilities(void* data, wl_seat* seat, uint32_t capabilities) {
|
void WindowWayland::seat_handle_capabilities(void* data, wl_seat* seat, uint32_t capabilities) {
|
||||||
WindowWayland* window = reinterpret_cast<WindowWayland*>(data);
|
WindowWayland* window = reinterpret_cast<WindowWayland*>(data);
|
||||||
window->seat = seat;
|
window->seat = seat;
|
||||||
|
|
@ -107,6 +194,10 @@ void WindowWayland::seat_handle_capabilities(void* data, wl_seat* seat, uint32_t
|
||||||
wl_pointer* pointer = wl_seat_get_pointer(seat);
|
wl_pointer* pointer = wl_seat_get_pointer(seat);
|
||||||
wl_pointer_add_listener(pointer, &pointer_listener, window);
|
wl_pointer_add_listener(pointer, &pointer_listener, window);
|
||||||
}
|
}
|
||||||
|
if (capabilities & WL_SEAT_CAPABILITY_KEYBOARD) {
|
||||||
|
wl_keyboard* keyboard = wl_seat_get_keyboard(seat);
|
||||||
|
wl_keyboard_add_listener(keyboard, &keyboard_listener, NULL);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
wl_seat_listener WindowWayland::seat_listener = {
|
wl_seat_listener WindowWayland::seat_listener = {
|
||||||
|
|
|
||||||
|
|
@ -32,6 +32,7 @@ export namespace Crafter {
|
||||||
wl_display* display = NULL;
|
wl_display* display = NULL;
|
||||||
inline static wl_compositor* compositor = NULL;
|
inline static wl_compositor* compositor = NULL;
|
||||||
static wl_pointer_listener pointer_listener;
|
static wl_pointer_listener pointer_listener;
|
||||||
|
static wl_keyboard_listener keyboard_listener;
|
||||||
static wl_seat_listener seat_listener;
|
static wl_seat_listener seat_listener;
|
||||||
static wl_registry_listener registry_listener;
|
static wl_registry_listener registry_listener;
|
||||||
static xdg_surface_listener xdg_surface_listener;
|
static xdg_surface_listener xdg_surface_listener;
|
||||||
|
|
|
||||||
256
camera.hpp
256
camera.hpp
|
|
@ -1,256 +0,0 @@
|
||||||
/*
|
|
||||||
* Basic camera class providing a look-at and first-person camera
|
|
||||||
*
|
|
||||||
* Copyright (C) 2016-2024 by Sascha Willems - www.saschawillems.de
|
|
||||||
*
|
|
||||||
* This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT)
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define GLM_FORCE_RADIANS
|
|
||||||
#define GLM_FORCE_DEPTH_ZERO_TO_ONE
|
|
||||||
#include <glm/glm.hpp>
|
|
||||||
#include <glm/gtc/quaternion.hpp>
|
|
||||||
#include <glm/gtc/matrix_transform.hpp>
|
|
||||||
|
|
||||||
namespace old {
|
|
||||||
class Camera
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
float fov;
|
|
||||||
float znear, zfar;
|
|
||||||
|
|
||||||
void updateViewMatrix()
|
|
||||||
{
|
|
||||||
glm::mat4 currentMatrix = matrices.view;
|
|
||||||
|
|
||||||
glm::mat4 rotM = glm::mat4(1.0f);
|
|
||||||
glm::mat4 transM;
|
|
||||||
|
|
||||||
rotM = glm::rotate(rotM, glm::radians(rotation.x * (flipY ? -1.0f : 1.0f)), glm::vec3(1.0f, 0.0f, 0.0f));
|
|
||||||
rotM = glm::rotate(rotM, glm::radians(rotation.y), glm::vec3(0.0f, 1.0f, 0.0f));
|
|
||||||
rotM = glm::rotate(rotM, glm::radians(rotation.z), glm::vec3(0.0f, 0.0f, 1.0f));
|
|
||||||
|
|
||||||
glm::vec3 translation = position;
|
|
||||||
if (flipY) {
|
|
||||||
translation.y *= -1.0f;
|
|
||||||
}
|
|
||||||
transM = glm::translate(glm::mat4(1.0f), translation);
|
|
||||||
|
|
||||||
if (type == CameraType::firstperson)
|
|
||||||
{
|
|
||||||
matrices.view = rotM * transM;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
matrices.view = transM * rotM;
|
|
||||||
}
|
|
||||||
|
|
||||||
viewPos = glm::vec4(position, 0.0f) * glm::vec4(-1.0f, 1.0f, -1.0f, 1.0f);
|
|
||||||
|
|
||||||
if (matrices.view != currentMatrix) {
|
|
||||||
updated = true;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
public:
|
|
||||||
enum CameraType { lookat, firstperson };
|
|
||||||
CameraType type = CameraType::lookat;
|
|
||||||
|
|
||||||
glm::vec3 rotation = glm::vec3();
|
|
||||||
glm::vec3 position = glm::vec3();
|
|
||||||
glm::vec4 viewPos = glm::vec4();
|
|
||||||
|
|
||||||
float rotationSpeed = 1.0f;
|
|
||||||
float movementSpeed = 1.0f;
|
|
||||||
|
|
||||||
bool updated = true;
|
|
||||||
bool flipY = false;
|
|
||||||
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
glm::mat4 perspective;
|
|
||||||
glm::mat4 view;
|
|
||||||
} matrices;
|
|
||||||
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
bool left = false;
|
|
||||||
bool right = false;
|
|
||||||
bool up = false;
|
|
||||||
bool down = false;
|
|
||||||
} keys;
|
|
||||||
|
|
||||||
bool moving() const
|
|
||||||
{
|
|
||||||
return keys.left || keys.right || keys.up || keys.down;
|
|
||||||
}
|
|
||||||
|
|
||||||
float getNearClip() const {
|
|
||||||
return znear;
|
|
||||||
}
|
|
||||||
|
|
||||||
float getFarClip() const {
|
|
||||||
return zfar;
|
|
||||||
}
|
|
||||||
|
|
||||||
void setPerspective(float fov, float aspect, float znear, float zfar)
|
|
||||||
{
|
|
||||||
glm::mat4 currentMatrix = matrices.perspective;
|
|
||||||
this->fov = fov;
|
|
||||||
this->znear = znear;
|
|
||||||
this->zfar = zfar;
|
|
||||||
matrices.perspective = glm::perspective(glm::radians(fov), aspect, znear, zfar);
|
|
||||||
if (flipY) {
|
|
||||||
matrices.perspective[1][1] *= -1.0f;
|
|
||||||
}
|
|
||||||
if (matrices.view != currentMatrix) {
|
|
||||||
updated = true;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
void updateAspectRatio(float aspect)
|
|
||||||
{
|
|
||||||
glm::mat4 currentMatrix = matrices.perspective;
|
|
||||||
matrices.perspective = glm::perspective(glm::radians(fov), aspect, znear, zfar);
|
|
||||||
if (flipY) {
|
|
||||||
matrices.perspective[1][1] *= -1.0f;
|
|
||||||
}
|
|
||||||
if (matrices.view != currentMatrix) {
|
|
||||||
updated = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void setPosition(glm::vec3 position)
|
|
||||||
{
|
|
||||||
this->position = position;
|
|
||||||
updateViewMatrix();
|
|
||||||
}
|
|
||||||
|
|
||||||
void setRotation(glm::vec3 rotation)
|
|
||||||
{
|
|
||||||
this->rotation = rotation;
|
|
||||||
updateViewMatrix();
|
|
||||||
}
|
|
||||||
|
|
||||||
void rotate(glm::vec3 delta)
|
|
||||||
{
|
|
||||||
this->rotation += delta;
|
|
||||||
updateViewMatrix();
|
|
||||||
}
|
|
||||||
|
|
||||||
void setTranslation(glm::vec3 translation)
|
|
||||||
{
|
|
||||||
this->position = translation;
|
|
||||||
updateViewMatrix();
|
|
||||||
};
|
|
||||||
|
|
||||||
void translate(glm::vec3 delta)
|
|
||||||
{
|
|
||||||
this->position += delta;
|
|
||||||
updateViewMatrix();
|
|
||||||
}
|
|
||||||
|
|
||||||
void setRotationSpeed(float rotationSpeed)
|
|
||||||
{
|
|
||||||
this->rotationSpeed = rotationSpeed;
|
|
||||||
}
|
|
||||||
|
|
||||||
void setMovementSpeed(float movementSpeed)
|
|
||||||
{
|
|
||||||
this->movementSpeed = movementSpeed;
|
|
||||||
}
|
|
||||||
|
|
||||||
void update(float deltaTime)
|
|
||||||
{
|
|
||||||
updated = false;
|
|
||||||
if (type == CameraType::firstperson)
|
|
||||||
{
|
|
||||||
if (moving())
|
|
||||||
{
|
|
||||||
glm::vec3 camFront;
|
|
||||||
camFront.x = -cos(glm::radians(rotation.x)) * sin(glm::radians(rotation.y));
|
|
||||||
camFront.y = sin(glm::radians(rotation.x));
|
|
||||||
camFront.z = cos(glm::radians(rotation.x)) * cos(glm::radians(rotation.y));
|
|
||||||
camFront = glm::normalize(camFront);
|
|
||||||
|
|
||||||
float moveSpeed = deltaTime * movementSpeed;
|
|
||||||
|
|
||||||
if (keys.up)
|
|
||||||
position += camFront * moveSpeed;
|
|
||||||
if (keys.down)
|
|
||||||
position -= camFront * moveSpeed;
|
|
||||||
if (keys.left)
|
|
||||||
position -= glm::normalize(glm::cross(camFront, glm::vec3(0.0f, 1.0f, 0.0f))) * moveSpeed;
|
|
||||||
if (keys.right)
|
|
||||||
position += glm::normalize(glm::cross(camFront, glm::vec3(0.0f, 1.0f, 0.0f))) * moveSpeed;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
updateViewMatrix();
|
|
||||||
};
|
|
||||||
|
|
||||||
// Update camera passing separate axis data (gamepad)
|
|
||||||
// Returns true if view or position has been changed
|
|
||||||
bool updatePad(glm::vec2 axisLeft, glm::vec2 axisRight, float deltaTime)
|
|
||||||
{
|
|
||||||
bool retVal = false;
|
|
||||||
|
|
||||||
if (type == CameraType::firstperson)
|
|
||||||
{
|
|
||||||
// Use the common console thumbstick layout
|
|
||||||
// Left = view, right = move
|
|
||||||
|
|
||||||
const float deadZone = 0.0015f;
|
|
||||||
const float range = 1.0f - deadZone;
|
|
||||||
|
|
||||||
glm::vec3 camFront;
|
|
||||||
camFront.x = -cos(glm::radians(rotation.x)) * sin(glm::radians(rotation.y));
|
|
||||||
camFront.y = sin(glm::radians(rotation.x));
|
|
||||||
camFront.z = cos(glm::radians(rotation.x)) * cos(glm::radians(rotation.y));
|
|
||||||
camFront = glm::normalize(camFront);
|
|
||||||
|
|
||||||
float moveSpeed = deltaTime * movementSpeed * 2.0f;
|
|
||||||
float rotSpeed = deltaTime * rotationSpeed * 50.0f;
|
|
||||||
|
|
||||||
// Move
|
|
||||||
if (fabsf(axisLeft.y) > deadZone)
|
|
||||||
{
|
|
||||||
float pos = (fabsf(axisLeft.y) - deadZone) / range;
|
|
||||||
position -= camFront * pos * ((axisLeft.y < 0.0f) ? -1.0f : 1.0f) * moveSpeed;
|
|
||||||
retVal = true;
|
|
||||||
}
|
|
||||||
if (fabsf(axisLeft.x) > deadZone)
|
|
||||||
{
|
|
||||||
float pos = (fabsf(axisLeft.x) - deadZone) / range;
|
|
||||||
position += glm::normalize(glm::cross(camFront, glm::vec3(0.0f, 1.0f, 0.0f))) * pos * ((axisLeft.x < 0.0f) ? -1.0f : 1.0f) * moveSpeed;
|
|
||||||
retVal = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Rotate
|
|
||||||
if (fabsf(axisRight.x) > deadZone)
|
|
||||||
{
|
|
||||||
float pos = (fabsf(axisRight.x) - deadZone) / range;
|
|
||||||
rotation.y += pos * ((axisRight.x < 0.0f) ? -1.0f : 1.0f) * rotSpeed;
|
|
||||||
retVal = true;
|
|
||||||
}
|
|
||||||
if (fabsf(axisRight.y) > deadZone)
|
|
||||||
{
|
|
||||||
float pos = (fabsf(axisRight.y) - deadZone) / range;
|
|
||||||
rotation.x -= pos * ((axisRight.y < 0.0f) ? -1.0f : 1.0f) * rotSpeed;
|
|
||||||
retVal = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// todo: move code from example base class for look-at
|
|
||||||
}
|
|
||||||
|
|
||||||
if (retVal)
|
|
||||||
{
|
|
||||||
updateViewMatrix();
|
|
||||||
}
|
|
||||||
|
|
||||||
return retVal;
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
8
main.cpp
8
main.cpp
|
|
@ -27,20 +27,20 @@ int main() {
|
||||||
WindowWaylandVulkan window("Crafter.Graphics", 1280, 720);
|
WindowWaylandVulkan window("Crafter.Graphics", 1280, 720);
|
||||||
|
|
||||||
Asset asset;
|
Asset asset;
|
||||||
asset.LoadFull("gulch.cras");
|
asset.LoadFull("cannon.cras");
|
||||||
|
|
||||||
Camera camera;
|
Camera camera;
|
||||||
Mesh<Vertex_xf32_yf32_zf32_wf32_uf32_vf32>* mesh = Mesh<Vertex_xf32_yf32_zf32_wf32_uf32_vf32>::FromAssetUV(asset.entries[0].data.data());
|
Mesh<VertexUV>* mesh = Mesh<VertexUV>::FromAssetUV(asset.entries[0].data.data());
|
||||||
DescriptorSet descriptors;
|
DescriptorSet descriptors;
|
||||||
Pipeline::GetDescriptorSet(descriptors);
|
Pipeline::GetDescriptorSet(descriptors);
|
||||||
|
|
||||||
MeshShader<Vertex_xf32_yf32_zf32_wf32_uf32_vf32> meshShader(mesh, &camera);
|
MeshShader<VertexUV> meshShader(mesh, &camera);
|
||||||
meshShader.WriteDescriptors(descriptors);
|
meshShader.WriteDescriptors(descriptors);
|
||||||
meshShader.transform = glm::mat4(1.0f);
|
meshShader.transform = glm::mat4(1.0f);
|
||||||
meshShader.Update();
|
meshShader.Update();
|
||||||
|
|
||||||
Asset asset2;
|
Asset asset2;
|
||||||
asset2.LoadFull("gulchtex.cras");
|
asset2.LoadFull("texture.cras");
|
||||||
|
|
||||||
VkCommandBuffer cmd = window.StartInit();
|
VkCommandBuffer cmd = window.StartInit();
|
||||||
VulkanTexture<Pixel_RU8_GU8_BU8_AU8>* txt = VulkanTexture<Pixel_RU8_GU8_BU8_AU8>::FromAsset(asset2.entries[0].data.data(), cmd);
|
VulkanTexture<Pixel_RU8_GU8_BU8_AU8>* txt = VulkanTexture<Pixel_RU8_GU8_BU8_AU8>::FromAsset(asset2.entries[0].data.data(), cmd);
|
||||||
|
|
|
||||||
26
project.json
26
project.json
|
|
@ -10,7 +10,7 @@
|
||||||
"build_dir": "build",
|
"build_dir": "build",
|
||||||
"output_dir": "bin",
|
"output_dir": "bin",
|
||||||
"type":"library",
|
"type":"library",
|
||||||
"libs": ["wayland-client", "vulkan"],
|
"libs": ["wayland-client", "vulkan", "xkbcommon"],
|
||||||
"flags": ["-Wno-uninitialized"],
|
"flags": ["-Wno-uninitialized"],
|
||||||
"shaders": [
|
"shaders": [
|
||||||
{
|
{
|
||||||
|
|
@ -39,7 +39,25 @@
|
||||||
"name": "debug",
|
"name": "debug",
|
||||||
"extends": ["base"],
|
"extends": ["base"],
|
||||||
"optimization_level": "0",
|
"optimization_level": "0",
|
||||||
"debug": true
|
"debug": true,
|
||||||
|
"dependencies": [
|
||||||
|
{
|
||||||
|
"path":"/home/jorijn/repos/Crafter/Crafter.Event/project.json",
|
||||||
|
"configuration":"debug"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path":"/home/jorijn/repos/Crafter/Crafter.Asset/project.json",
|
||||||
|
"configuration":"lib-debug"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path":"/home/jorijn/repos/Crafter/Crafter.Component/project.json",
|
||||||
|
"configuration":"debug"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path":"/home/jorijn/repos/Crafter/Crafter.Math/project.json",
|
||||||
|
"configuration":"debug-lib"
|
||||||
|
}
|
||||||
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "test",
|
"name": "test",
|
||||||
|
|
@ -58,6 +76,10 @@
|
||||||
{
|
{
|
||||||
"path":"/home/jorijn/repos/Crafter/Crafter.Component/project.json",
|
"path":"/home/jorijn/repos/Crafter/Crafter.Component/project.json",
|
||||||
"configuration":"debug"
|
"configuration":"debug"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path":"/home/jorijn/repos/Crafter/Crafter.Math/project.json",
|
||||||
|
"configuration":"debug-lib"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue