mirror of
https://github.com/love2d/love.git
synced 2026-08-20 04:30:09 +02:00
Added support for MSAA on the window on iOS.
Requires updated dependencies to compile on iOS, which can be downloaded at https://dl.dropboxusercontent.com/u/4214717/love-ios-libraries-0.10.zip
This commit is contained in:
@@ -494,11 +494,13 @@ void Graphics::discard(const std::vector<bool> &colorbuffers, bool stencil)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
int activecanvascount = (int) states.back().canvases.size();
|
int rendertargetcount = 1;
|
||||||
|
if (Canvas::current)
|
||||||
|
rendertargetcount = (int) states.back().canvases.size();
|
||||||
|
|
||||||
for (int i = 0; i < (int) colorbuffers.size(); i++)
|
for (int i = 0; i < (int) colorbuffers.size(); i++)
|
||||||
{
|
{
|
||||||
if (colorbuffers[i] && i < activecanvascount)
|
if (colorbuffers[i] && i < rendertargetcount)
|
||||||
attachments.push_back(GL_COLOR_ATTACHMENT0 + i);
|
attachments.push_back(GL_COLOR_ATTACHMENT0 + i);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1308,8 +1310,34 @@ love::image::ImageData *Graphics::newScreenshot(love::image::Image *image, bool
|
|||||||
throw love::Exception("Out of memory.");
|
throw love::Exception("Out of memory.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef LOVE_IOS
|
||||||
|
SDL_SysWMinfo info = {};
|
||||||
|
SDL_VERSION(&info.version);
|
||||||
|
SDL_GetWindowWMInfo(SDL_GL_GetCurrentWindow(), &info);
|
||||||
|
|
||||||
|
if (info.info.uikit.resolveFramebuffer != 0)
|
||||||
|
{
|
||||||
|
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, info.info.uikit.resolveFramebuffer);
|
||||||
|
|
||||||
|
// We need to do an explicit MSAA resolve on iOS, because it uses GLES
|
||||||
|
// FBOs rather than a system framebuffer.
|
||||||
|
if (GLAD_ES_VERSION_3_0)
|
||||||
|
glBlitFramebuffer(0, 0, width, height, 0, 0, width, height, GL_COLOR_BUFFER_BIT, GL_NEAREST);
|
||||||
|
else if (GLAD_APPLE_framebuffer_multisample)
|
||||||
|
glResolveMultisampleFramebufferAPPLE();
|
||||||
|
|
||||||
|
glBindFramebuffer(GL_READ_FRAMEBUFFER, info.info.uikit.resolveFramebuffer);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
glReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
|
glReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
|
||||||
|
|
||||||
|
#ifdef LOVE_IOS
|
||||||
|
// Restore the previous binding for the main framebuffer.
|
||||||
|
if (info.info.uikit.resolveFramebuffer != 0)
|
||||||
|
glBindFramebuffer(GL_FRAMEBUFFER, gl.getDefaultFBO());
|
||||||
|
#endif
|
||||||
|
|
||||||
if (!copyAlpha)
|
if (!copyAlpha)
|
||||||
{
|
{
|
||||||
// Replace alpha values with full opacity.
|
// Replace alpha values with full opacity.
|
||||||
|
|||||||
@@ -39,19 +39,17 @@ SpriteBatch *luax_checkspritebatch(lua_State *L, int idx)
|
|||||||
return luax_checktype<SpriteBatch>(L, idx, GRAPHICS_SPRITE_BATCH_ID);
|
return luax_checktype<SpriteBatch>(L, idx, GRAPHICS_SPRITE_BATCH_ID);
|
||||||
}
|
}
|
||||||
|
|
||||||
int w_SpriteBatch_add(lua_State *L)
|
static inline int w_SpriteBatch_add_or_set(lua_State *L, SpriteBatch *t, int startidx, int index)
|
||||||
{
|
{
|
||||||
SpriteBatch *t = luax_checkspritebatch(L, 1);
|
|
||||||
Quad *quad = nullptr;
|
Quad *quad = nullptr;
|
||||||
int startidx = 2;
|
|
||||||
|
|
||||||
if (luax_istype(L, 2, GRAPHICS_QUAD_ID))
|
if (luax_istype(L, startidx, GRAPHICS_QUAD_ID))
|
||||||
{
|
{
|
||||||
quad = luax_totype<Quad>(L, 2, GRAPHICS_QUAD_ID);
|
quad = luax_totype<Quad>(L, startidx, GRAPHICS_QUAD_ID);
|
||||||
startidx = 3;
|
startidx++;
|
||||||
}
|
}
|
||||||
else if (lua_isnil(L, 2) && !lua_isnoneornil(L, 3))
|
else if (lua_isnil(L, startidx) && !lua_isnoneornil(L, startidx + 1))
|
||||||
return luax_typerror(L, 2, "Quad");
|
return luax_typerror(L, startidx, "Quad");
|
||||||
|
|
||||||
float x = (float) luaL_optnumber(L, startidx + 0, 0.0);
|
float x = (float) luaL_optnumber(L, startidx + 0, 0.0);
|
||||||
float y = (float) luaL_optnumber(L, startidx + 1, 0.0);
|
float y = (float) luaL_optnumber(L, startidx + 1, 0.0);
|
||||||
@@ -63,15 +61,23 @@ int w_SpriteBatch_add(lua_State *L)
|
|||||||
float kx = (float) luaL_optnumber(L, startidx + 7, 0.0);
|
float kx = (float) luaL_optnumber(L, startidx + 7, 0.0);
|
||||||
float ky = (float) luaL_optnumber(L, startidx + 8, 0.0);
|
float ky = (float) luaL_optnumber(L, startidx + 8, 0.0);
|
||||||
|
|
||||||
int index = 0;
|
|
||||||
luax_catchexcept(L, [&]() {
|
luax_catchexcept(L, [&]() {
|
||||||
if (quad)
|
if (quad)
|
||||||
index = t->addq(quad, x, y, a, sx, sy, ox, oy, kx, ky);
|
index = t->addq(quad, x, y, a, sx, sy, ox, oy, kx, ky, index);
|
||||||
else
|
else
|
||||||
index = t->add(x, y, a, sx, sy, ox, oy, kx, ky);
|
index = t->add(x, y, a, sx, sy, ox, oy, kx, ky, index);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
return index;
|
||||||
|
}
|
||||||
|
|
||||||
|
int w_SpriteBatch_add(lua_State *L)
|
||||||
|
{
|
||||||
|
SpriteBatch *t = luax_checkspritebatch(L, 1);
|
||||||
|
|
||||||
|
int index = w_SpriteBatch_add_or_set(L, t, 2, -1);
|
||||||
lua_pushinteger(L, index + 1);
|
lua_pushinteger(L, index + 1);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -80,33 +86,7 @@ int w_SpriteBatch_set(lua_State *L)
|
|||||||
SpriteBatch *t = luax_checkspritebatch(L, 1);
|
SpriteBatch *t = luax_checkspritebatch(L, 1);
|
||||||
int index = (int) luaL_checknumber(L, 2) - 1;
|
int index = (int) luaL_checknumber(L, 2) - 1;
|
||||||
|
|
||||||
Quad *quad = nullptr;
|
w_SpriteBatch_add_or_set(L, t, 3, index);
|
||||||
int startidx = 3;
|
|
||||||
|
|
||||||
if (luax_istype(L, 3, GRAPHICS_QUAD_ID))
|
|
||||||
{
|
|
||||||
quad = luax_totype<Quad>(L, 3, GRAPHICS_QUAD_ID);
|
|
||||||
startidx = 4;
|
|
||||||
}
|
|
||||||
else if (lua_isnil(L, 3) && !lua_isnoneornil(L, 4))
|
|
||||||
return luax_typerror(L, 3, "Quad");
|
|
||||||
|
|
||||||
float x = (float) luaL_optnumber(L, startidx + 0, 0.0);
|
|
||||||
float y = (float) luaL_optnumber(L, startidx + 1, 0.0);
|
|
||||||
float a = (float) luaL_optnumber(L, startidx + 2, 0.0);
|
|
||||||
float sx = (float) luaL_optnumber(L, startidx + 3, 1.0);
|
|
||||||
float sy = (float) luaL_optnumber(L, startidx + 4, sx);
|
|
||||||
float ox = (float) luaL_optnumber(L, startidx + 5, 0.0);
|
|
||||||
float oy = (float) luaL_optnumber(L, startidx + 6, 0.0);
|
|
||||||
float kx = (float) luaL_optnumber(L, startidx + 7, 0.0);
|
|
||||||
float ky = (float) luaL_optnumber(L, startidx + 8, 0.0);
|
|
||||||
|
|
||||||
luax_catchexcept(L, [&]() {
|
|
||||||
if (quad)
|
|
||||||
t->addq(quad, x, y, a, sx, sy, ox, oy, kx, ky, index);
|
|
||||||
else
|
|
||||||
t->add(x, y, a, sx, sy, ox, oy, kx, ky, index);
|
|
||||||
});
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user