2022-05-10 10:06:48 +00:00
|
|
|
// Copyright (C) 2017 The Qt Company Ltd.
|
|
|
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
|
2017-03-24 13:54:24 +00:00
|
|
|
|
|
|
|
#ifndef RENDERER_H
|
|
|
|
#define RENDERER_H
|
|
|
|
|
|
|
|
#include "vulkanwindow.h"
|
|
|
|
#include "mesh.h"
|
|
|
|
#include "shader.h"
|
|
|
|
#include "camera.h"
|
|
|
|
#include <QFutureWatcher>
|
|
|
|
#include <QMutex>
|
|
|
|
|
|
|
|
class Renderer : public QVulkanWindowRenderer
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
Renderer(VulkanWindow *w, int initialCount);
|
|
|
|
|
|
|
|
void preInitResources() override;
|
|
|
|
void initResources() override;
|
|
|
|
void initSwapChainResources() override;
|
|
|
|
void releaseSwapChainResources() override;
|
|
|
|
void releaseResources() override;
|
|
|
|
|
|
|
|
void startNextFrame() override;
|
|
|
|
|
|
|
|
bool animating() const { return m_animating; }
|
|
|
|
void setAnimating(bool a) { m_animating = a; }
|
|
|
|
|
|
|
|
int instanceCount() const { return m_instCount; }
|
|
|
|
void addNew();
|
|
|
|
|
|
|
|
void yaw(float degrees);
|
|
|
|
void pitch(float degrees);
|
|
|
|
void walk(float amount);
|
|
|
|
void strafe(float amount);
|
|
|
|
|
|
|
|
void setUseLogo(bool b);
|
|
|
|
|
|
|
|
private:
|
|
|
|
void createPipelines();
|
|
|
|
void createItemPipeline();
|
|
|
|
void createFloorPipeline();
|
|
|
|
void ensureBuffers();
|
|
|
|
void ensureInstanceBuffer();
|
|
|
|
void getMatrices(QMatrix4x4 *mvp, QMatrix4x4 *model, QMatrix3x3 *modelNormal, QVector3D *eyePos);
|
|
|
|
void writeFragUni(quint8 *p, const QVector3D &eyePos);
|
|
|
|
void buildFrame();
|
|
|
|
void buildDrawCallsForItems();
|
|
|
|
void buildDrawCallsForFloor();
|
|
|
|
|
|
|
|
void markViewProjDirty() { m_vpDirty = m_window->concurrentFrameCount(); }
|
|
|
|
|
|
|
|
VulkanWindow *m_window;
|
|
|
|
QVulkanDeviceFunctions *m_devFuncs;
|
|
|
|
|
|
|
|
bool m_useLogo = false;
|
|
|
|
Mesh m_blockMesh;
|
|
|
|
Mesh m_logoMesh;
|
|
|
|
VkBuffer m_blockVertexBuf = VK_NULL_HANDLE;
|
|
|
|
VkBuffer m_logoVertexBuf = VK_NULL_HANDLE;
|
|
|
|
struct {
|
|
|
|
VkDeviceSize vertUniSize;
|
|
|
|
VkDeviceSize fragUniSize;
|
|
|
|
VkDeviceSize uniMemStartOffset;
|
|
|
|
Shader vs;
|
|
|
|
Shader fs;
|
|
|
|
VkDescriptorPool descPool = VK_NULL_HANDLE;
|
|
|
|
VkDescriptorSetLayout descSetLayout = VK_NULL_HANDLE;
|
|
|
|
VkDescriptorSet descSet;
|
|
|
|
VkPipelineLayout pipelineLayout = VK_NULL_HANDLE;
|
|
|
|
VkPipeline pipeline = VK_NULL_HANDLE;
|
|
|
|
} m_itemMaterial;
|
|
|
|
|
|
|
|
VkBuffer m_floorVertexBuf = VK_NULL_HANDLE;
|
|
|
|
struct {
|
|
|
|
Shader vs;
|
|
|
|
Shader fs;
|
|
|
|
VkPipelineLayout pipelineLayout = VK_NULL_HANDLE;
|
|
|
|
VkPipeline pipeline = VK_NULL_HANDLE;
|
|
|
|
} m_floorMaterial;
|
|
|
|
|
|
|
|
VkDeviceMemory m_bufMem = VK_NULL_HANDLE;
|
|
|
|
VkBuffer m_uniBuf = VK_NULL_HANDLE;
|
|
|
|
|
|
|
|
VkPipelineCache m_pipelineCache = VK_NULL_HANDLE;
|
|
|
|
QFuture<void> m_pipelinesFuture;
|
|
|
|
|
|
|
|
QVector3D m_lightPos;
|
|
|
|
Camera m_cam;
|
|
|
|
|
|
|
|
QMatrix4x4 m_proj;
|
|
|
|
int m_vpDirty = 0;
|
|
|
|
QMatrix4x4 m_floorModel;
|
|
|
|
|
|
|
|
bool m_animating;
|
|
|
|
float m_rotation = 0.0f;
|
|
|
|
|
|
|
|
int m_instCount;
|
|
|
|
int m_preparedInstCount = 0;
|
|
|
|
QByteArray m_instData;
|
|
|
|
VkBuffer m_instBuf = VK_NULL_HANDLE;
|
|
|
|
VkDeviceMemory m_instBufMem = VK_NULL_HANDLE;
|
|
|
|
|
|
|
|
QFutureWatcher<void> m_frameWatcher;
|
|
|
|
bool m_framePending;
|
|
|
|
|
|
|
|
QMutex m_guiMutex;
|
|
|
|
};
|
|
|
|
|
|
|
|
#endif
|