mirror of
https://github.com/love2d/love.git
synced 2026-08-16 00:02:12 +02:00
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:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
|
||||
Reference in New Issue
Block a user