love.graphics.newVolumeImage can now automatically convert a 1xN or Nx1 sheet of square images into layers.

--HG--
branch : minor
This commit is contained in:
Alex Szpakowski
2017-02-26 20:18:06 -04:00
parent a3454aa205
commit b44e6b2156
3 changed files with 45 additions and 6 deletions
+20 -5
View File
@@ -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<StrongRef<love::image::ImageData>> 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<love::image::Image>(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<StrongRef<love::image::ImageData>> 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);
}
+23
View File
@@ -115,5 +115,28 @@ std::vector<StrongRef<ImageData>> Image::newCubeFaces(love::image::ImageData *sr
return faces;
}
std::vector<StrongRef<ImageData>> Image::newVolumeLayers(ImageData *src)
{
std::vector<StrongRef<ImageData>> 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
+2 -1
View File
@@ -90,7 +90,8 @@ public:
**/
virtual bool isCompressed(love::filesystem::FileData *data) = 0;
std::vector<StrongRef<ImageData>> newCubeFaces(ImageData *layoutData);
std::vector<StrongRef<ImageData>> newCubeFaces(ImageData *src);
std::vector<StrongRef<ImageData>> newVolumeLayers(ImageData *src);
private: