diff --git a/libs/ibl/include/ibl/Image.h b/libs/ibl/include/ibl/Image.h index a1a024b22e..f61b753cb2 100644 --- a/libs/ibl/include/ibl/Image.h +++ b/libs/ibl/include/ibl/Image.h @@ -26,16 +26,10 @@ namespace filament { namespace ibl { -/** - * \deprecated - * We are phasing out this class in favor of LinearImage. The latter has a stable and well-defined - * pixel format, making it easier to implement image-based algorithms. - */ class Image { public: Image(); - Image(std::unique_ptr data, size_t w, size_t h, - size_t bpr, size_t bpp, size_t channels = 3); + Image(size_t w, size_t h, size_t stride = 0); void reset(); @@ -51,24 +45,22 @@ public: size_t getBytesPerRow() const { return mBpr; } - size_t getBytesPerPixel() const { return mBpp; } + size_t getBytesPerPixel() const { return sizeof(math::float3); } void* getData() const { return mData; } void* getPixelRef(size_t x, size_t y) const; private: - std::unique_ptr mOwnedData; - void* mData = nullptr; + size_t mBpr = 0; size_t mWidth = 0; size_t mHeight = 0; - size_t mBpr = 0; - size_t mBpp = 0; - size_t mChannels = 0; + std::unique_ptr mOwnedData; + void* mData = nullptr; }; inline void* Image::getPixelRef(size_t x, size_t y) const { - return static_cast(mData) + y * mBpr + x * mBpp; + return static_cast(mData) + y * getBytesPerRow() + x * getBytesPerPixel(); } } // namespace ibl diff --git a/libs/ibl/src/CubemapIBL.cpp b/libs/ibl/src/CubemapIBL.cpp index ab5ff12dd4..da972f16e2 100644 --- a/libs/ibl/src/CubemapIBL.cpp +++ b/libs/ibl/src/CubemapIBL.cpp @@ -65,7 +65,7 @@ static double3 UTILS_UNUSED hemisphereUniformSample(double2 u) { // pdf = 1.0 / /* * * Importance sampling Charlie - * ------------------------------------------ + * --------------------------- * * In order to pick the most significative samples and increase the convergence rate, we chose to * rely on Charlie's distribution function for the pdf as we do in hemisphereImportanceSampleDggx. @@ -167,7 +167,7 @@ static double Visibility(double NoV, double NoL, double a) { return 0.5 / (GGXV + GGXL); } -static double UTILS_UNUSED VisibilityAshikhmin(double NoV, double NoL, double a) { +static double UTILS_UNUSED VisibilityAshikhmin(double NoV, double NoL, double /*a*/) { // Neubelt and Pettineo 2013, "Crafting a Next-gen Material Pipeline for The Order: 1886" return 1 / (4 * (NoL + NoV - NoL * NoV)); } @@ -814,7 +814,7 @@ static double DFV_Charlie_Uniform(double NoV, double linearRoughness, size_t num /* * * Importance sampling Charlie - * ------------------------------------------ + * --------------------------- * * Important samples are chosen to integrate DCharlie() * cos(theta) over the hemisphere. * @@ -884,14 +884,14 @@ static double DFV_Charlie_Uniform(double NoV, double linearRoughness, size_t num * * It results that: * - * 1 4 + * 1 4 * Er() = --- ∑ DCharlie(h) V(v, l) ------------ * N h DCharlie(h) * * * +---------------------------------------+ * | 4 | - * | Er() = --- ∑ V(v, l) --- | + * | Er() = --- ∑ V(v, l) ------- | * | N h | * +---------------------------------------+ * @@ -947,7 +947,7 @@ void CubemapIBL::DFG(Image& dst, bool multiscatter, bool cloth) { auto dfvFunction = multiscatter ? DFV_Multiscatter : DFV; JobSystem& js = CubemapUtils::getJobSystem(); auto job = jobs::parallel_for(js, nullptr, nullptr, uint32_t(dst.getHeight()), - [&dst, dfvFunction, cloth](char* d, size_t c) { + [&dst, dfvFunction, cloth](char const* d, size_t c) { const size_t width = dst.getWidth(); const size_t height = dst.getHeight(); size_t y0 = size_t(d); diff --git a/libs/ibl/src/CubemapUtils.cpp b/libs/ibl/src/CubemapUtils.cpp index 8e842ca0f0..f7cf50fcb5 100644 --- a/libs/ibl/src/CubemapUtils.cpp +++ b/libs/ibl/src/CubemapUtils.cpp @@ -292,12 +292,8 @@ Image CubemapUtils::createCubemapImage(size_t dim, bool horizontal) { std::swap(width, height); } - size_t bpr = width * sizeof(Cubemap::Texel); - bpr = (bpr + 31) & ~31; - size_t bufSize = bpr * height; - std::unique_ptr data(new uint8_t[bufSize]); - memset(data.get(), 0, bufSize); - Image image(std::move(data), width, height, bpr, sizeof(Cubemap::Texel)); + Image image(width, height); + memset(image.getData(), 0, image.getBytesPerRow() * height); return image; } diff --git a/libs/ibl/src/Image.cpp b/libs/ibl/src/Image.cpp index 6bcf622c8c..8acdc580f1 100644 --- a/libs/ibl/src/Image.cpp +++ b/libs/ibl/src/Image.cpp @@ -23,16 +23,12 @@ namespace ibl { Image::Image() = default; -Image::Image(std::unique_ptr data, - size_t w, size_t h, size_t bpr, size_t bpp, size_t channels) - : mOwnedData(std::move(data)), - mData(mOwnedData.get()), - mWidth(w), - mHeight(h), - mBpr(bpr), - mBpp(bpp), - mChannels(channels) -{ +Image::Image(size_t w, size_t h, size_t stride) + : mBpr((stride ? stride : w) * sizeof(math::float3)), + mWidth(w), + mHeight(h), + mOwnedData(new uint8_t[mBpr * h]), + mData(mOwnedData.get()) { } void Image::reset() { @@ -40,8 +36,6 @@ void Image::reset() { mWidth = 0; mHeight = 0; mBpr = 0; - mBpp = 0; - mChannels = 0; mData = nullptr; } @@ -50,8 +44,6 @@ void Image::set(Image const& image) { mWidth = image.mWidth; mHeight = image.mHeight; mBpr = image.mBpr; - mBpp = image.mBpp; - mChannels = image.mChannels; mData = image.mData; } @@ -60,8 +52,6 @@ void Image::subset(Image const& image, size_t x, size_t y, size_t w, size_t h) { mWidth = w; mHeight = h; mBpr = image.mBpr; - mBpp = image.mBpp; - mChannels = image.mChannels; mData = static_cast(image.getPixelRef(x, y)); } diff --git a/tools/cmgen/src/cmgen.cpp b/tools/cmgen/src/cmgen.cpp index 66dd2df66b..0d2d17d17b 100644 --- a/tools/cmgen/src/cmgen.cpp +++ b/tools/cmgen/src/cmgen.cpp @@ -489,12 +489,9 @@ int main(int argc, char* argv[]) { } // Convert from LinearImage to the deprecated Image object which is used throughout cmgen. - std::unique_ptr buf(new uint8_t[ - linputImage.getWidth() * linputImage.getHeight() * sizeof(float3)]); const size_t width = linputImage.getWidth(), height = linputImage.getHeight(); - const size_t bpp = sizeof(float) * 3, bpr = bpp * width; - memcpy(buf.get(), linputImage.getPixelRef(), height * bpr); - Image inputImage(std::move(buf), width, height, bpr, bpp); + Image inputImage(width, height); + memcpy(inputImage.getData(), linputImage.getPixelRef(), height * inputImage.getBytesPerRow()); CubemapUtils::clamp(inputImage); @@ -782,8 +779,7 @@ void iblMipmapPrefilter(const utils::Path& iname, if (g_type == OutputType::EQUIRECT) { size_t dim = dst.getDimensions(); - std::unique_ptr buf(new uint8_t[dim * 2 * dim * sizeof(float3)]); - Image image(std::move(buf), dim * 2, dim, dim * 2 * sizeof(float3), sizeof(float3)); + Image image(dim * 2, dim); CubemapUtils::cubemapToEquirectangular(image, dst); std::string filename = outputDir + ("is_m" + std::to_string(level) + ext); saveImage(filename, g_format, image, g_compression); @@ -792,8 +788,7 @@ void iblMipmapPrefilter(const utils::Path& iname, if (g_type == OutputType::OCTAHEDRON) { size_t dim = dst.getDimensions(); - std::unique_ptr buf(new uint8_t[dim * dim * sizeof(float3)]); - Image image(std::move(buf), dim, dim, dim * sizeof(float3), sizeof(float3)); + Image image(dim, dim); CubemapUtils::cubemapToOctahedron(image, dst); std::string filename = outputDir + ("is_m" + std::to_string(level) + ext); saveImage(filename, g_format, image, g_compression); @@ -898,8 +893,7 @@ void iblRoughnessPrefilter(const utils::Path& iname, } if (g_type == OutputType::EQUIRECT) { - std::unique_ptr buf(new uint8_t[dim * 2 * dim * sizeof(float3)]); - Image outImage(std::move(buf), dim * 2, dim, dim * 2 * sizeof(float3), sizeof(float3)); + Image outImage(dim * 2, dim); CubemapUtils::cubemapToEquirectangular(outImage, dst); std::string filename = outputDir + ("m" + std::to_string(level) + ext); saveImage(filename, g_format, outImage, g_compression); @@ -907,8 +901,7 @@ void iblRoughnessPrefilter(const utils::Path& iname, } if (g_type == OutputType::OCTAHEDRON) { - std::unique_ptr buf(new uint8_t[dim * dim * sizeof(float3)]); - Image outImage(std::move(buf), dim, dim, dim * sizeof(float3), sizeof(float3)); + Image outImage(dim, dim); CubemapUtils::cubemapToOctahedron(outImage, dst); std::string filename = outputDir + ("m" + std::to_string(level) + ext); saveImage(filename, g_format, outImage, g_compression); @@ -1009,8 +1002,7 @@ static bool isIncludeFile(const utils::Path& filename) { } void iblLutDfg(const utils::Path& filename, size_t size, bool multiscatter, bool cloth) { - std::unique_ptr buf(new uint8_t[size * size * sizeof(float3)]); - Image image(std::move(buf), size, size, size * sizeof(float3), sizeof(float3)); + Image image(size, size); CubemapIBL::DFG(image, multiscatter, cloth); utils::Path outputDir(filename.getAbsolutePath().getParent()); @@ -1089,8 +1081,7 @@ void extractCubemapFaces(const utils::Path& iname, const Cubemap& cm, const util if (g_type == OutputType::EQUIRECT) { size_t dim = cm.getDimensions(); - std::unique_ptr buf(new uint8_t[dim * 2 * dim * sizeof(float3)]); - Image image(std::move(buf), dim * 2, dim, dim * 2 * sizeof(float3), sizeof(float3)); + Image image(dim * 2, dim); CubemapUtils::cubemapToEquirectangular(image, cm); std::string filename = outputDir + ("skybox" + ext); saveImage(filename, g_format, image, g_compression); @@ -1099,8 +1090,7 @@ void extractCubemapFaces(const utils::Path& iname, const Cubemap& cm, const util if (g_type == OutputType::OCTAHEDRON) { size_t dim = cm.getDimensions(); - std::unique_ptr buf(new uint8_t[dim * dim * sizeof(float3)]); - Image image(std::move(buf), dim, dim, dim * sizeof(float3), sizeof(float3)); + Image image(dim, dim); CubemapUtils::cubemapToOctahedron(image, cm); std::string filename = outputDir + ("skybox" + ext); saveImage(filename, g_format, image, g_compression);