mirror of
https://github.com/love2d/love.git
synced 2026-08-19 12:14:20 +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))
|
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;
|
std::vector<StrongRef<love::image::ImageData>> faces;
|
||||||
luax_catchexcept(L, [&](){ faces = imagemodule->newCubeFaces(imagedata.first); });
|
|
||||||
|
|
||||||
for (int i = 0; i < (int) faces.size(); i++)
|
if (data.first.get())
|
||||||
slices.set(i, 0, faces[i]);
|
{
|
||||||
|
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
|
else
|
||||||
{
|
{
|
||||||
@@ -724,6 +730,8 @@ int w_newVolumeImage(lua_State *L)
|
|||||||
{
|
{
|
||||||
luax_checkgraphicscreated(L);
|
luax_checkgraphicscreated(L);
|
||||||
|
|
||||||
|
auto imagemodule = Module::getInstance<love::image::Image>(Module::M_IMAGE);
|
||||||
|
|
||||||
Image::Slices slices(TEXTURE_VOLUME);
|
Image::Slices slices(TEXTURE_VOLUME);
|
||||||
Image::Settings settings;
|
Image::Settings settings;
|
||||||
|
|
||||||
@@ -772,8 +780,15 @@ int w_newVolumeImage(lua_State *L)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
auto data = getImageData(L, 1, true, &settings.pixeldensity);
|
auto data = getImageData(L, 1, true, &settings.pixeldensity);
|
||||||
|
|
||||||
if (data.first.get())
|
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
|
else
|
||||||
slices.add(data.second, 0, 0, true, true);
|
slices.add(data.second, 0, 0, true, true);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -115,5 +115,28 @@ std::vector<StrongRef<ImageData>> Image::newCubeFaces(love::image::ImageData *sr
|
|||||||
return faces;
|
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
|
} // image
|
||||||
} // love
|
} // love
|
||||||
|
|||||||
@@ -90,7 +90,8 @@ public:
|
|||||||
**/
|
**/
|
||||||
virtual bool isCompressed(love::filesystem::FileData *data) = 0;
|
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:
|
private:
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user