Browse Source

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

--HG--
branch : minor
Alex Szpakowski 8 years ago
parent
commit
b44e6b2156
3 changed files with 45 additions and 6 deletions
  1. 20 5
      src/modules/graphics/wrap_Graphics.cpp
  2. 23 0
      src/modules/image/Image.cpp
  3. 2 1
      src/modules/image/Image.h

+ 20 - 5
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<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 - 0
src/modules/image/Image.cpp

@@ -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
src/modules/image/Image.h

@@ -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: