17#include "../WindowAbstract.h"
23#include "InputProvider.h"
25#include <nlohmann/json.hpp>
27using json = nlohmann::json;
30static const char* kTAG =
"renderPass";
32 ((void)__android_log_print(ANDROID_LOG_INFO, kTAG, __VA_ARGS__))
38 this->window = window;
40 this->appAndroid = appAndroid;
51 drawing(&context, renderPass.get(), window,
this),
54 this->window = window;
75 D(PRINT(
"====context======="));
78 D(PRINT(
"===continue window initialisation==="));
91 D(PRINT(
"Size of attachment = %d", attachmentSize));
95 return renderPass->getSupportedDepthFormats();
99 this->inputProvider = inputProvider;
100 auto input = inputProvider->enumerateStreamsParameters();
101 assert(input.size() >= 1);
103 correctionVectorRotation.resize(input.size());
104 correctionVectorTranslation.resize(input.size());
105 correctionPrincipalPt.resize(input.size());
106 correctionFocal.resize(input.size());
109 streamFrameInfos.resize(input.size());
110 cameraActivation.resize(input.size(),
true);
112 float maxD = input[0].farDepth;
113 float minD = input[0].nearDepth;
114 for (
const auto & in : input) {
115 maxD = in.farDepth > maxD ? in.farDepth : maxD;
116 minD = in.nearDepth > minD ? in.nearDepth : minD;
122 D(PRINT(
"=====renderpass======"));
123 renderPass->init(inputProvider);
124 D(PRINT(
"=====drawing======"));
125 drawing.
init(inputProvider);
127 if (startingPt == StartingPosition::Average) {
139 std::cout <<
"Save correction of rotation to disk at " << fileN << std::endl;
140 std::ofstream stream(fileN, std::ifstream::out);
142 assert(correctionVectorRotation.size() == correctionVectorTranslation.size());
143 assert(correctionVectorTranslation.size() == correctionPrincipalPt.size());
144 assert(correctionPrincipalPt.size() == correctionFocal.size());
148 for (
int id = 0;
id < correctionVectorRotation.size();
id ++ ) {
150 j[
"camera"][id][
"id"] = id;
153 auto r = correctionVectorRotation[id];
154 j[
"camera"][id][
"correction"][
"rotation"] = { r.x,r.y,r.z };
155 auto t = correctionVectorTranslation[id];
156 j[
"camera"][id][
"correction"][
"translation"] = {t.x,t.y,t.z};
157 auto p = correctionPrincipalPt[id];
158 j[
"camera"][id][
"correction"][
"principalPt"] = json::array({p.x,p.y});
159 auto f = correctionFocal[id];
160 j[
"camera"][id][
"correction"][
"focal"] = json::array({f.x,f.y});
163 auto ro = streamFrameInfos[id].extrinsics.rotation;
164 j[
"camera"][id][
"current"][
"rotation"] = {ro.x,ro.y,ro.z};
165 auto to = streamFrameInfos[id].extrinsics.position;
166 j[
"camera"][id][
"current"][
"translation"] = { to.x,to.y,to.z };
169 if (streamFrameInfos[
id].intrinsics.index() == 0) {
170 auto po = std::get<InputProvider::PerspectiveIntrinsics>(streamFrameInfos[
id].intrinsics).principle;
171 j[
"camera"][id][
"current"][
"principalPt"] = json::array({ po.x,po.y });
172 auto fo = std::get<InputProvider::PerspectiveIntrinsics>(streamFrameInfos[
id].intrinsics).focals;
173 j[
"camera"][id][
"current"][
"focal"] = json::array({ fo.x,fo.y });
185 std::ifstream stream(fileN, std::ifstream::out);
188 std::cout <<
"load correction of rotation to disk at " << fileN << std::endl;
189 if (stream.is_open()) {
192 for (
auto& cam : j[
"camera"]) {
194 auto r = j[
"camera"][id][
"correction"][
"rotation"];
195 correctionVectorRotation[id] = { r[0],r[1],r[2] };
196 auto t = j[
"camera"][id][
"correction"][
"translation"];
197 correctionVectorTranslation[id] = { t[0],t[1],t[2] };
198 auto p = j[
"camera"][id][
"correction"][
"principalPt"];
199 correctionPrincipalPt[id] = { p[0],p[1] };
200 auto f = j[
"camera"][id][
"correction"][
"focal"];
201 correctionFocal[id] = { f[0],f[1] };
205 std::cout <<
"No save file found" << std::endl;
211 return cameraActivation;
217 assert( i < cameraActivation.size() );
219 if (!cameraActivation[i] || renderPass->inputImage > 1 ) {
220#ifdef HVT_UDP_CONTROL
225 requestChange =
true;
226 cameraActivation[i] = !cameraActivation[i];
227#ifdef HVT_UDP_CONTROL
234 std::cout <<
"Impossible to desactivate camera " << i <<
" :there must always be one camera active" << std::endl;
241 assert(activation.size() == cameraActivation.size());
244 for (
auto a : activation) {
249#ifdef HVT_UDP_CONTROL
252 requestChange =
true;
253 cameraActivation = activation;
254#ifdef HVT_UDP_CONTROL
259 PRINT(
"Invalid activation vector. At least one camera should be activated");
278 if(renderPass->isInitialized()){
279 renderPass->cleanUp();
292 LOGI(
"recreate swapchain");
294 std::cout << (
"recreation swapchain !") << std::endl;
302#ifdef HVT_UDP_CONTROL
320void VulkanWrapper::createImageCall(uint32_t width, uint32_t height, vk::Format format, vk::ImageTiling tiling, vk::ImageUsageFlags usage, vk::MemoryPropertyFlags properties, vk::Image& image, vk::DeviceMemory& imageMemory)
324void VulkanWrapper::createBufferCall(vk::DeviceSize size, vk::BufferUsageFlags usage, vk::MemoryPropertyFlags properties, vk::Buffer& buffer, vk::DeviceMemory& bufferMemory)
332 memcpy(dataToCopy, data,
static_cast<size_t>(size));
339 for (
auto const& image : vectorImage) {
343 for (
auto const& mem : vectorMemory) {
351 for (
auto const& buf : vectorBuffer) {
355 for (
auto const& mem : vectorMemory) {
372 assert(triangleThreshold > 0);
385 if (v[0] != ref[0] || v[1] != ref[1]) {
415 vk::Extent2D max = {0,0};
418 if (max.width < ext.width) {
419 max.width = ext.width;
421 if (max.height < ext.height) {
422 max.height = ext.height;
440 auto res = vk::ImageLayout::eColorAttachmentOptimal;
442 res = vk::ImageLayout::ePresentSrcKHR;
459 glm::vec3 averagePos = {0,0,0};
460 glm::vec3 averageRot = {0,0,0};
461 const int numInput = frameInfo.size();
463 for (
auto f : frameInfo) {
464 averagePos += f.extrinsics.position;
467 averagePos /= numInput;
472 auto pos = conversion * averagePos;
483 auto dR = glmEulerAnglesDegreeToRotationMatrixNotOMAF(dRot);
486 auto rot = glm::transpose(R) * dRot * R;
495 if (camId < correctionVectorRotation.size()) {
496 correctionVectorRotation[camId] += rotationCorrection;
499 PRINT(
"Camera %i does not exist, only %i camera are availables", camId, (
int) correctionVectorRotation.size());
505 if (camId < correctionVectorTranslation.size()) {
506 correctionVectorTranslation[camId] += translationCorrection;
509 PRINT(
"Camera %i does not exist, only %i camera are availables", camId, (
int)correctionVectorTranslation.size());
515 if (camId < correctionFocal.size()) {
516 correctionFocal[camId] += focals;
519 PRINT(
"Camera %i does not exist, only %i camera are availables", camId, (
int)correctionFocal.size());
525 if (camId < correctionFocal.size()) {
526 correctionPrincipalPt[camId] += principalPt;
529 PRINT(
"Camera %i does not exist, only %i camera are availables", camId, (
int)correctionPrincipalPt.size());
535 assert(scaleFactor > 0);
541 return correctionVectorRotation;
548#ifdef HVT_UDP_CONTROL
552 renderPass->cleanUp();
553 renderPass->init(inputProvider);
554 drawing.
init(inputProvider);
555 requestChange =
false;
556#ifdef HVT_UDP_CONTROL
565 assert(correctionVectorRotation.size() == streamFrameInfos.size());
567 for (
int i = 0; i < correctionVectorRotation.size(); i++) {
568 streamFrameInfos[i].extrinsics.rotation += correctionVectorRotation[i];
569 streamFrameInfos[i].extrinsics.position += correctionVectorTranslation[i];
571 if (streamFrameInfos[i].intrinsics.index() == 0) {
572 std::get<InputProvider::PerspectiveIntrinsics>(streamFrameInfos[i].intrinsics).focals += correctionFocal[i];
573 std::get<InputProvider::PerspectiveIntrinsics>(streamFrameInfos[i].intrinsics).principle += correctionPrincipalPt[i];
578 return streamFrameInfos;
584XrGraphicsBindingVulkan2KHR VulkanWrapper::getGraphicsBinding() {
585 XrGraphicsBindingVulkan2KHR m_graphicsBinding{XR_TYPE_GRAPHICS_BINDING_VULKAN2_KHR};
590 m_graphicsBinding.queueIndex = 0;
591 return m_graphicsBinding;
595void VulkanWrapper::endCleanUp() {
Contains the class that loads the SPIR-V shaders from files.
Class that contains helper functions for Vulkan.
file that contains the VulkanWrapper class that manages the classes related to Vulkan code and ease t...
void setStartingPt(glm::vec3 startPos, glm::vec3 startRot)
const InputProvider::Extrinsics getVirtualExtrinsics(int view)
const glm::mat3x3 conversionToOMAF
const glm::vec3 getStartingPosition()
const glm::vec3 getStartingRotation()
std::vector< glm::vec2 > virtualViewDef
void updateSpaceTransform(glm::vec3 translation, glm::vec3 rotation)
void init(int view, WindowAbstract *window, VulkanWrapper *wraps)
static ShadersList & getInstance()
class that manages tasks related to Vulkan context (Vulkan Instance, Vulkan Physical device,...
vk::PhysicalDevice physicalDevice
uint32_t queueFamilyIndex
void init(InputProvider *inputProvider)
An abstract class that contains a common base of code for the class that inherit from it.
Class that manage the renderPass containing the synthesis and blending steps.
void loadConfigurationsFromDisk()
const std::vector< InputProvider::StreamFrameInfo > getFramesInfo(int view)
bool isDepthOutputRecquired()
void copyMemory(VkDeviceSize &size, vk::DeviceMemory &memory, unsigned char *dataToCopy)
void setCorrectionTranslation(int camId, glm::vec3 translationCorrection)
void destroyBufferAndMemory(std::vector< vk::Buffer > &vectorBuffer, std::vector< vk::DeviceMemory > &vectorMemory)
void setScaleFactor(float scaleFactor)
void addDeltaToStartingPoint(glm::vec3 dPos, glm::vec3 dRot)
void saveConfigurationsToDisk()
void setTriangleThreshold(float triangleThreshold)
void setCorrectionFocal(int camId, glm::vec2 focals)
vk::Extent2D getRenderOutputExtent()
void endInit(InputProvider *input, StartingPosition startingPt=StartingPosition::Average)
std::vector< vk::Format > getRenderPassSupportedDepthFormats() const
void createImageCall(uint32_t width, uint32_t height, vk::Format format, vk::ImageTiling tiling, vk::ImageUsageFlags usage, vk::MemoryPropertyFlags properties, vk::Image &image, vk::DeviceMemory &imageMemory)
bool requireAverageInputPosition
void setCorrectionPrincipalPt(int camId, glm::vec2 principalPt)
void setAverageInputPosition(std::vector< InputProvider::StreamFrameInfo > &frameInfo)
vk::Extent2D getSwapchainExtend(int view=0)
void setBlendingFactor(float blendingfactor)
const std::vector< glm::vec3 > getCorrectionVectorRotation()
bool isUsingDifferentViewSize()
void destroyImageAndMemory(std::vector< vk::Image > &vectorImage, std::vector< vk::DeviceMemory > &vectorMemory)
void updateSpaceTransform(glm::vec3 translation, glm::vec3 rotation)
vk::Format getDepthSwapchainFormat(int view=0)
void createBufferCall(vk::DeviceSize size, vk::BufferUsageFlags usage, vk::MemoryPropertyFlags properties, vk::Buffer &buffer, vk::DeviceMemory &bufferMemory)
vk::Format getSwapchainFormat(int view=0)
RenderingParameters params
std::vector< bool > getCameraActivation()
VulkanContext * getContext()
void setCameraActivation(std::vector< bool > activation)
vk::ImageLayout getLayoutAfterRenderpass()
void setCorrectionRotation(int camId, glm::vec3 rotationCorrection)
VulkanWrapper(WindowAbstract *window, PipelineMode pmode)
Abstraction of the way of the result is displayed (screen or HMD).
virtual const bool useOpenXR()
virtual vk::Extent2D getSwapchainExtent(int view)
void setWrapper(VulkanWrapper *wraps)
virtual vk::Format getDepthSwapchainFormat(int view)
bool isIndepFromWindowDimension()
virtual void checkForCorrectSize()=0
virtual void continueInit()=0
virtual vk::Format getSwapchainFormat(int view)
virtual bool isDepthRecquired()
virtual void initWindow()=0
virtual void mainLoop(VulkanDrawing *vulkanDrawing)=0