diff --git a/include/vkcv/Core.hpp b/include/vkcv/Core.hpp index bf9514d5ba4c9d5dbf8d41be2a489dae826886a8..b97c707dafad515ca55380a8c56754f58f7c1a68 100644 --- a/include/vkcv/Core.hpp +++ b/include/vkcv/Core.hpp @@ -222,6 +222,11 @@ namespace vkcv [[nodiscard]] Image createImage(vk::Format format, uint32_t width, uint32_t height, uint32_t depth = 1); + [[nodiscard]] + const uint32_t getImageWidth(ImageHandle imageHandle); + [[nodiscard]] + const uint32_t getImageHeight(ImageHandle imageHandle); + /** TODO: * @param setDescriptions * @return diff --git a/modules/CMakeLists.txt b/modules/CMakeLists.txt index 5edb802b3adf16878c2dec4050d8444278739026..28b2184b2a83515a514f1428733bcf8cf1499633 100644 --- a/modules/CMakeLists.txt +++ b/modules/CMakeLists.txt @@ -1,6 +1,7 @@ # Add new modules here: add_subdirectory(asset_loader) +add_subdirectory(material) add_subdirectory(camera) add_subdirectory(gui) add_subdirectory(shader_compiler) diff --git a/modules/material/src/vkcv/material/pbrMetallicRoughness.cpp b/modules/material/src/vkcv/material/pbrMetallicRoughness.cpp index 034702360db512669254127b4e86fb4730fb24ad..98a30f99703d6589e56e614503e4125f8f8022c1 100644 --- a/modules/material/src/vkcv/material/pbrMetallicRoughness.cpp +++ b/modules/material/src/vkcv/material/pbrMetallicRoughness.cpp @@ -40,16 +40,41 @@ namespace vkcv::material SamplerHandle& metRoughSmp) { //Test if Images and samplers valid, if not use default - if (colorImg) { - //TODO + uint32_t width = core->getImageWidth(colorImg); //use colorImg size as default + uint32_t height = core->getImageHeight(colorImg); + uint32_t n = width * height; + struct vec3 { + float x, y, z; + }; + struct vec4 { + float x, y, z, a; + }; + + if (!colorImg) { + width = core->getImageWidth(metRoughImg); // if colorImg has no size + height = core->getImageHeight(metRoughImg); + n = width * height; + vkcv::Image defaultColor = core->createImage(vk::Format::eR8G8B8A8Srgb, width, height); + std::vector<vec4> colorData(n); + std::fill(colorData.begin(), colorData.end(), vec4{ 228, 51 , 255, 1 }); + defaultColor.fill(colorData.data()); + colorImg = defaultColor.getHandle(); } - if (normalImg) { - //TODO + if (!normalImg || (core->getImageWidth(normalImg)!=width)|| (core->getImageHeight(normalImg) != height)) { + vkcv::Image defaultNormal = core->createImage(vk::Format::eR8G8B8A8Srgb, width, height); + std::vector<vec4> normalData(n); + std::fill(normalData.begin(), normalData.end(), vec4{ 228, 51 , 255, 1 }); + defaultNormal.fill(normalData.data()); + normalImg = defaultNormal.getHandle(); } - if (metRoughImg) { - //TODO + if (!metRoughImg || (core->getImageWidth(metRoughImg) != width) || (core->getImageHeight(metRoughImg) != height)) { + vkcv::Image defaultRough = core->createImage(vk::Format::eR8G8B8A8Srgb, width, height); + std::vector<vec4> roughData(n); + std::fill(roughData.begin(), roughData.end(), vec4{ 228, 51 , 255, 1 }); + defaultRough.fill(roughData.data()); + metRoughImg = defaultRough.getHandle(); } - if (colorSmp) { + if (!colorSmp) { colorSmp = core->createSampler( vkcv::SamplerFilterType::LINEAR, vkcv::SamplerFilterType::LINEAR, @@ -57,7 +82,7 @@ namespace vkcv::material vkcv::SamplerAddressMode::REPEAT ); } - if (normalSmp) { + if (!normalSmp) { normalSmp = core->createSampler( vkcv::SamplerFilterType::LINEAR, vkcv::SamplerFilterType::LINEAR, @@ -65,7 +90,7 @@ namespace vkcv::material vkcv::SamplerAddressMode::REPEAT ); } - if (metRoughSmp) { + if (!metRoughSmp) { metRoughSmp = core->createSampler( vkcv::SamplerFilterType::LINEAR, vkcv::SamplerFilterType::LINEAR, @@ -87,7 +112,7 @@ namespace vkcv::material vkcv::SamplerDescriptorWrite(1, colorSmp), vkcv::SamplerDescriptorWrite(3, normalSmp), vkcv::SamplerDescriptorWrite(5, metRoughSmp) }; - core->writeResourceDescription(descriptorSetHandle, 0, setWrites); + core->writeDescriptorSet(descriptorSetHandle, setWrites); return PBRMaterial(colorImg, colorSmp, normalImg, normalSmp, metRoughImg, metRoughSmp, descriptorSetHandle); } diff --git a/src/vkcv/Core.cpp b/src/vkcv/Core.cpp index 49707d4cffc18719d8fbb18a9e632e12ba679c2e..3d8e6188980e3c048aa8da66f812f6cdd78afada 100644 --- a/src/vkcv/Core.cpp +++ b/src/vkcv/Core.cpp @@ -456,6 +456,16 @@ namespace vkcv return Image::create(m_ImageManager.get(), format, width, height, depth); } + const uint32_t Core::getImageWidth(ImageHandle imageHandle) + { + return m_ImageManager->getImageWidth(imageHandle); + } + + const uint32_t Core::getImageHeight(ImageHandle imageHandle) + { + return m_ImageManager->getImageHeight(imageHandle); + } + DescriptorSetHandle Core::createDescriptorSet(const std::vector<DescriptorBinding>& bindings) { return m_DescriptorManager->createDescriptorSet(bindings);