From b44e6b21563a16b35f6e13bb2cde60b61820ad5a Mon Sep 17 00:00:00 2001 From: Alex Szpakowski Date: Sun, 26 Feb 2017 20:18:06 -0400 Subject: [PATCH] love.graphics.newVolumeImage can now automatically convert a 1xN or Nx1 sheet of square images into layers. --HG-- branch : minor --- src/modules/graphics/wrap_Graphics.cpp | 25 ++++++++++++++++++++----- src/modules/image/Image.cpp | 23 +++++++++++++++++++++++ src/modules/image/Image.h | 3 ++- 3 files changed, 45 insertions(+), 6 deletions(-) diff --git a/src/modules/graphics/wrap_Graphics.cpp b/src/modules/graphics/wrap_Graphics.cpp index 0a66c76ee..1b24cd57a 100644 --- a/src/modules/graphics/wrap_Graphics.cpp +++ b/src/modules/graphics/wrap_Graphics.cpp @@ -583,13 +583,19 @@ int w_newCubeImage(lua_State *L) if (!lua_istable(L, 1)) { - auto imagedata = getImageData(L, 1, false, &settings.pixeldensity); + auto data = getImageData(L, 1, true, &settings.pixeldensity); std::vector> faces; - luax_catchexcept(L, [&](){ faces = imagemodule->newCubeFaces(imagedata.first); }); - for (int i = 0; i < (int) faces.size(); i++) - slices.set(i, 0, faces[i]); + if (data.first.get()) + { + luax_catchexcept(L, [&](){ faces = imagemodule->newCubeFaces(data.first); }); + + for (int i = 0; i < (int) faces.size(); i++) + slices.set(i, 0, faces[i]); + } + else + slices.add(data.second, 0, 0, true, true); } else { @@ -724,6 +730,8 @@ int w_newVolumeImage(lua_State *L) { luax_checkgraphicscreated(L); + auto imagemodule = Module::getInstance(Module::M_IMAGE); + Image::Slices slices(TEXTURE_VOLUME); Image::Settings settings; @@ -772,8 +780,15 @@ int w_newVolumeImage(lua_State *L) else { auto data = getImageData(L, 1, true, &settings.pixeldensity); + if (data.first.get()) - slices.set(0, 0, data.first); + { + std::vector> layers; + luax_catchexcept(L, [&](){ layers = imagemodule->newVolumeLayers(data.first); }); + + for (int i = 0; i < (int) layers.size(); i++) + slices.set(i, 0, layers[i]); + } else slices.add(data.second, 0, 0, true, true); } diff --git a/src/modules/image/Image.cpp b/src/modules/image/Image.cpp index 9e43e48f6..212aba2c8 100644 --- a/src/modules/image/Image.cpp +++ b/src/modules/image/Image.cpp @@ -115,5 +115,28 @@ std::vector> Image::newCubeFaces(love::image::ImageData *sr return faces; } +std::vector> Image::newVolumeLayers(ImageData *src) +{ + std::vector> layers; + + int totalW = src->getWidth(); + int totalH = src->getHeight(); + + if (totalW % totalH == 0) + { + for (int i = 0; i < totalW / totalH; i++) + layers.emplace_back(newPastedImageData(src, i * totalH, 0, totalH, totalH)); + } + else if (totalH % totalW == 0) + { + for (int i = 0; i < totalH / totalW; i++) + layers.emplace_back(newPastedImageData(src, 0, i * totalW, totalW, totalW)); + } + else + throw love::Exception("Cannot extract volume layers from source ImageData."); + + return layers; +} + } // image } // love diff --git a/src/modules/image/Image.h b/src/modules/image/Image.h index eac85743f..64ace18ca 100644 --- a/src/modules/image/Image.h +++ b/src/modules/image/Image.h @@ -90,7 +90,8 @@ public: **/ virtual bool isCompressed(love::filesystem::FileData *data) = 0; - std::vector> newCubeFaces(ImageData *layoutData); + std::vector> newCubeFaces(ImageData *src); + std::vector> newVolumeLayers(ImageData *src); private: