diff --git a/src/modules/graphics/Canvas.cpp b/src/modules/graphics/Canvas.cpp index a4ac24f70..c13b1e038 100644 --- a/src/modules/graphics/Canvas.cpp +++ b/src/modules/graphics/Canvas.cpp @@ -37,6 +37,7 @@ Canvas::Canvas(const Settings &settings) sRGB = false; requestedMSAA = settings.msaa; + mipmapsMode = settings.mipmaps; width = settings.width; height = settings.height; pixelWidth = (int) ((width * settings.dpiScale) + 0.5); @@ -63,10 +64,10 @@ Canvas::Canvas(const Settings &settings) if (readable && isPixelFormatDepthStencil(format) && settings.msaa > 1) throw love::Exception("Readable depth/stencil Canvases with MSAA are not currently supported."); - if ((!readable || settings.msaa > 1) && settings.mipmaps != MIPMAPS_NONE) + if ((!readable || settings.msaa > 1) && mipmapsMode != MIPMAPS_NONE) throw love::Exception("Non-readable and MSAA textures cannot have mipmaps."); - if (settings.mipmaps != MIPMAPS_NONE) + if (mipmapsMode != MIPMAPS_NONE) mipmapCount = getTotalMipmapCount(pixelWidth, pixelHeight, depth); auto gfx = Module::getInstance(Module::M_GRAPHICS); @@ -102,11 +103,6 @@ Canvas::~Canvas() { } -Texture::MipmapsMode Canvas::getMipmapsMode() const -{ - return settings.mipmaps; -} - bool Canvas::getConstant(const char *in, SettingType &out) { return settingTypes.find(in, out); diff --git a/src/modules/graphics/Canvas.h b/src/modules/graphics/Canvas.h index 9b18ef7e2..9c77152b2 100644 --- a/src/modules/graphics/Canvas.h +++ b/src/modules/graphics/Canvas.h @@ -69,8 +69,6 @@ public: Canvas(const Settings &settings); virtual ~Canvas(); - MipmapsMode getMipmapsMode() const; - static bool getConstant(const char *in, SettingType &out); static bool getConstant(SettingType in, const char *&out); static const char *getConstant(SettingType in); @@ -82,9 +80,6 @@ protected: private: - static StringMap::Entry mipmapEntries[]; - static StringMap mipmapModes; - static StringMap::Entry settingTypeEntries[]; static StringMap settingTypes; diff --git a/src/modules/graphics/Image.cpp b/src/modules/graphics/Image.cpp index ed3ca5d47..63d3694b7 100644 --- a/src/modules/graphics/Image.cpp +++ b/src/modules/graphics/Image.cpp @@ -90,13 +90,14 @@ void Image::init(PixelFormat fmt, int w, int h, int dataMipmaps, const Settings pixelWidth = w; pixelHeight = h; + mipmapsMode = settings.mipmaps ? MIPMAPS_MANUAL : MIPMAPS_NONE; width = (int) (pixelWidth / settings.dpiScale + 0.5); height = (int) (pixelHeight / settings.dpiScale + 0.5); format = fmt; - if (!settings.mipmaps || (isCompressed() && dataMipmaps <= 1)) + if (mipmapsMode == MIPMAPS_NONE || (isCompressed() && dataMipmaps <= 1)) mipmapCount = 1; else mipmapCount = getTotalMipmapCount(w, h, depth); diff --git a/src/modules/graphics/Texture.cpp b/src/modules/graphics/Texture.cpp index 4aaa6a972..2f0131f00 100644 --- a/src/modules/graphics/Texture.cpp +++ b/src/modules/graphics/Texture.cpp @@ -164,6 +164,7 @@ Texture::Texture(TextureType texType) , format(PIXELFORMAT_UNKNOWN) , renderTarget(false) , readable(true) + , mipmapsMode(MIPMAPS_NONE) , sRGB(false) , width(0) , height(0) @@ -214,6 +215,11 @@ PixelFormat Texture::getPixelFormat() const return format; } +Texture::MipmapsMode Texture::getMipmapsMode() const +{ + return mipmapsMode; +} + bool Texture::isRenderTarget() const { return renderTarget; diff --git a/src/modules/graphics/Texture.h b/src/modules/graphics/Texture.h index eb4716c66..57172898a 100644 --- a/src/modules/graphics/Texture.h +++ b/src/modules/graphics/Texture.h @@ -194,6 +194,7 @@ public: TextureType getTextureType() const; PixelFormat getPixelFormat() const; + MipmapsMode getMipmapsMode() const; bool isRenderTarget() const; bool isReadable() const; @@ -249,6 +250,8 @@ protected: bool renderTarget; bool readable; + MipmapsMode mipmapsMode; + bool sRGB; int width; diff --git a/src/modules/graphics/wrap_Canvas.cpp b/src/modules/graphics/wrap_Canvas.cpp index 40e493c1e..167db507a 100644 --- a/src/modules/graphics/wrap_Canvas.cpp +++ b/src/modules/graphics/wrap_Canvas.cpp @@ -78,21 +78,9 @@ int w_Canvas_renderTo(lua_State *L) return 0; } -int w_Canvas_getMipmapMode(lua_State *L) -{ - Canvas *c = luax_checkcanvas(L, 1); - const char *str; - if (!Texture::getConstant(c->getMipmapsMode(), str)) - return luax_enumerror(L, "mipmap mode", Texture::getConstants(Texture::MIPMAPS_MAX_ENUM), str); - - lua_pushstring(L, str); - return 1; -} - static const luaL_Reg w_Canvas_functions[] = { { "renderTo", w_Canvas_renderTo }, - { "getMipmapMode", w_Canvas_getMipmapMode }, { 0, 0 } }; diff --git a/src/modules/graphics/wrap_Texture.cpp b/src/modules/graphics/wrap_Texture.cpp index 87143887c..a216a1139 100644 --- a/src/modules/graphics/wrap_Texture.cpp +++ b/src/modules/graphics/wrap_Texture.cpp @@ -322,6 +322,16 @@ int w_Texture_getDepthSampleMode(lua_State *L) return 1; } +int w_Texture_getMipmapMode(lua_State *L) +{ + Texture *t = luax_checktexture(L, 1); + const char *str; + if (!Texture::getConstant(t->getMipmapsMode(), str)) + return luax_enumerror(L, "mipmap mode", Texture::getConstants(Texture::MIPMAPS_MAX_ENUM), str); + lua_pushstring(L, str); + return 1; +} + int w_Texture_generateMipmaps(lua_State *L) { Texture *t = luax_checktexture(L, 1); @@ -338,7 +348,7 @@ int w_Texture_replacePixels(lua_State *L) int mipmap = 0; int x = 0; int y = 0; - bool reloadmipmaps = false; // TODO i->getMipmapsSource() == Texture::MIPMAPS_SOURCE_GENERATED; + bool reloadmipmaps = t->getMipmapsMode() == Texture::MIPMAPS_AUTO; if (t->getTextureType() != TEXTURE_2D) slice = (int) luaL_checkinteger(L, 3) - 1; @@ -412,6 +422,7 @@ const luaL_Reg w_Texture_functions[] = { "getWrap", w_Texture_getWrap }, { "getFormat", w_Texture_getFormat }, { "isReadable", w_Texture_isReadable }, + { "getMipmapMode", w_Texture_getMipmapMode }, { "getDepthSampleMode", w_Texture_getDepthSampleMode }, { "setDepthSampleMode", w_Texture_setDepthSampleMode }, { "generateMipmaps", w_Texture_generateMipmaps },