From 562cc6b1cbbba34a6d9db100a4cb563d56993cee Mon Sep 17 00:00:00 2001 From: Qais Patankar Date: Wed, 30 Dec 2020 04:27:48 +0000 Subject: [PATCH 1/5] Fix #1614: add Body:getLocalPoints --- src/modules/physics/box2d/Body.cpp | 24 ++++++++++++++++++++++++ src/modules/physics/box2d/Body.h | 6 ++++++ src/modules/physics/box2d/wrap_Body.cpp | 8 ++++++++ 3 files changed, 38 insertions(+) diff --git a/src/modules/physics/box2d/Body.cpp b/src/modules/physics/box2d/Body.cpp index 2f8301be0..446be6b8b 100644 --- a/src/modules/physics/box2d/Body.cpp +++ b/src/modules/physics/box2d/Body.cpp @@ -346,6 +346,30 @@ void Body::getLocalVector(float x, float y, float &x_o, float &y_o) y_o = v.y; } +int Body::getLocalPoints(lua_State *L) +{ + int argc = lua_gettop(L); + int vcount = (int)argc/2; + // at least one point + love::luax_assert_argc(L, 2); + + for (int i = 0; iGetLocalPoint(Physics::scaleDown(b2Vec2(x, y)))); + // And then we push the result + lua_pushnumber(L, point.x); + lua_pushnumber(L, point.y); + } + + return argc; +} + void Body::getLinearVelocityFromWorldPoint(float x, float y, float &x_o, float &y_o) { b2Vec2 v = Physics::scaleUp(body->GetLinearVelocityFromWorldPoint(Physics::scaleDown(b2Vec2(x, y)))); diff --git a/src/modules/physics/box2d/Body.h b/src/modules/physics/box2d/Body.h index 6c2edcc62..b279fa0d6 100644 --- a/src/modules/physics/box2d/Body.h +++ b/src/modules/physics/box2d/Body.h @@ -317,6 +317,12 @@ public: **/ void getLocalVector(float x, float y, float &x_o, float &y_o); + /** + * Transforms a series of points (x, y) from world coordinates + * to local coordinates. + **/ + int getLocalPoints(lua_State *L); + /** * Gets the velocity on the Body for the given world point. * @param x The x-coordinate of the world point. diff --git a/src/modules/physics/box2d/wrap_Body.cpp b/src/modules/physics/box2d/wrap_Body.cpp index af57ce766..2b303a63d 100644 --- a/src/modules/physics/box2d/wrap_Body.cpp +++ b/src/modules/physics/box2d/wrap_Body.cpp @@ -444,6 +444,13 @@ int w_Body_getLocalVector(lua_State *L) return 2; } +int w_Body_getLocalPoints(lua_State *L) +{ + Body *t = luax_checkbody(L, 1); + lua_remove(L, 1); + return t->getLocalPoints(L); +} + int w_Body_getLinearVelocityFromWorldPoint(lua_State *L) { Body *t = luax_checkbody(L, 1); @@ -679,6 +686,7 @@ static const luaL_Reg w_Body_functions[] = { "getWorldPoints", w_Body_getWorldPoints }, { "getLocalPoint", w_Body_getLocalPoint }, { "getLocalVector", w_Body_getLocalVector }, + { "getLocalPoints", w_Body_getLocalPoints }, { "getLinearVelocityFromWorldPoint", w_Body_getLinearVelocityFromWorldPoint }, { "getLinearVelocityFromLocalPoint", w_Body_getLinearVelocityFromLocalPoint }, { "isBullet", w_Body_isBullet }, From 7524677d4c8c09fd1cabec9a36b89df6c4279036 Mon Sep 17 00:00:00 2001 From: Miku AuahDark Date: Thu, 31 Dec 2020 10:32:05 +0800 Subject: [PATCH 2/5] Don't use `feof` to check for end-of-file in DroppedFile. Fixes #1551 Apparently `feof` is only set when `fread(..., size, count, ...) < size * count` happends, however we actually have code that automatically adjust amount of bytes to read (and at "eof" it really happends to be 0) so fread is never able to set the EOF flag. --- src/modules/filesystem/DroppedFile.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/filesystem/DroppedFile.cpp b/src/modules/filesystem/DroppedFile.cpp index 5ed9773f1..5a602ff04 100644 --- a/src/modules/filesystem/DroppedFile.cpp +++ b/src/modules/filesystem/DroppedFile.cpp @@ -165,7 +165,7 @@ bool DroppedFile::flush() bool DroppedFile::isEOF() { - return file == nullptr || feof(file) != 0; + return file == nullptr || tell() >= getSize(); } int64 DroppedFile::tell() From 781acf5c4d9875080ca1e9802c5f2a37968e298c Mon Sep 17 00:00:00 2001 From: Miku AuahDark Date: Thu, 31 Dec 2020 16:48:42 +0800 Subject: [PATCH 3/5] Support for >2GB DroppedFile in desktops. --- src/modules/filesystem/DroppedFile.cpp | 43 +++++++++++++++++++++----- 1 file changed, 35 insertions(+), 8 deletions(-) diff --git a/src/modules/filesystem/DroppedFile.cpp b/src/modules/filesystem/DroppedFile.cpp index 5a602ff04..1dea290a3 100644 --- a/src/modules/filesystem/DroppedFile.cpp +++ b/src/modules/filesystem/DroppedFile.cpp @@ -106,14 +106,25 @@ bool DroppedFile::isOpen() const int64 DroppedFile::getSize() { + int fd = file ? fileno(file) : -1; + #ifdef LOVE_WINDOWS + + struct _stat64 buf; - // make sure non-ASCII filenames work. - std::wstring wfilename = to_widestr(filename); + if (fd != -1) + { + if (_fstat64(fd, &buf) != 0) + return -1; + } + else + { + // make sure non-ASCII filenames work. + std::wstring wfilename = to_widestr(filename); - struct _stat buf; - if (_wstat(wfilename.c_str(), &buf) != 0) - return -1; + if (_wstat64(wfilename.c_str(), &buf) != 0) + return -1; + } return (int64) buf.st_size; @@ -121,7 +132,13 @@ int64 DroppedFile::getSize() // Assume POSIX support... struct stat buf; - if (stat(filename.c_str(), &buf) != 0) + + if (fd != -1) + { + if (fstat(fd, &buf) != 0) + return -1; + } + else if (stat(filename.c_str(), &buf) != 0) return -1; return (int64) buf.st_size; @@ -173,12 +190,22 @@ int64 DroppedFile::tell() if (file == nullptr) return -1; - return (int64) ftell(file); +#ifdef LOVE_WINDOWS + return (int64) _ftelli64(file); +#else + return (int64) ftello(file); +#endif } bool DroppedFile::seek(uint64 pos) { - return file != nullptr && fseek(file, (long) pos, SEEK_SET) == 0; + return file != nullptr && + +#ifdef LOVE_WINDOWS + _fseeki64(file, (int64) pos, SEEK_SET) == 0; +#else + fseeko(file, (off_t) pos, SEEK_SET) == 0; +#endif } bool DroppedFile::setBuffer(BufferMode bufmode, int64 size) From 61580c7a0d416cb6dc0c79bc5fdd33ee0806be20 Mon Sep 17 00:00:00 2001 From: Miku AuahDark Date: Fri, 1 Jan 2021 20:48:15 +0800 Subject: [PATCH 4/5] Update src/modules/filesystem/DroppedFile.cpp as suggested Co-authored-by: Qais Patankar --- src/modules/filesystem/DroppedFile.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/modules/filesystem/DroppedFile.cpp b/src/modules/filesystem/DroppedFile.cpp index 1dea290a3..2917525d8 100644 --- a/src/modules/filesystem/DroppedFile.cpp +++ b/src/modules/filesystem/DroppedFile.cpp @@ -199,12 +199,13 @@ int64 DroppedFile::tell() bool DroppedFile::seek(uint64 pos) { - return file != nullptr && + if (file == nullptr) + return false; #ifdef LOVE_WINDOWS - _fseeki64(file, (int64) pos, SEEK_SET) == 0; + return _fseeki64(file, (int64) pos, SEEK_SET) == 0; #else - fseeko(file, (off_t) pos, SEEK_SET) == 0; + return fseeko(file, (off_t) pos, SEEK_SET) == 0; #endif } From 9742adb1b9a8f9036497ac17f17d6a2768e97847 Mon Sep 17 00:00:00 2001 From: Alex Szpakowski Date: Tue, 5 Jan 2021 17:37:01 -0400 Subject: [PATCH 5/5] macOS: add search paths for mpg123's headers Needed for newer versions of mpg123 --- platform/xcode/liblove.xcodeproj/project.pbxproj | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/platform/xcode/liblove.xcodeproj/project.pbxproj b/platform/xcode/liblove.xcodeproj/project.pbxproj index 0b3dbf5be..4b815e49c 100644 --- a/platform/xcode/liblove.xcodeproj/project.pbxproj +++ b/platform/xcode/liblove.xcodeproj/project.pbxproj @@ -5320,9 +5320,11 @@ "$(PROJECT_DIR)/macosx/Frameworks/freetype.framework/Headers", "$(PROJECT_DIR)/macosx/Frameworks/Lua.framework/Headers", "$(PROJECT_DIR)/macosx/Frameworks/SDL2.framework/Headers", + "$(PROJECT_DIR)/macosx/Frameworks/mpg123.framework/Headers", /Library/Frameworks/freetype.framework/Headers, /Library/Frameworks/Lua.framework/Headers, /Library/Frameworks/SDL2.framework/Headers, + /Library/Frameworks/mpg123.framework/Headers, ); INFOPLIST_FILE = "macosx/liblove-macosx.plist"; LD_DYLIB_INSTALL_NAME = "@rpath/$(EXECUTABLE_PATH)"; @@ -5364,9 +5366,11 @@ "$(PROJECT_DIR)/macosx/Frameworks/freetype.framework/Headers", "$(PROJECT_DIR)/macosx/Frameworks/Lua.framework/Headers", "$(PROJECT_DIR)/macosx/Frameworks/SDL2.framework/Headers", + "$(PROJECT_DIR)/macosx/Frameworks/mpg123.framework/Headers", /Library/Frameworks/freetype.framework/Headers, /Library/Frameworks/Lua.framework/Headers, /Library/Frameworks/SDL2.framework/Headers, + /Library/Frameworks/mpg123.framework/Headers, ); INFOPLIST_FILE = "macosx/liblove-macosx.plist"; LD_DYLIB_INSTALL_NAME = "@rpath/$(EXECUTABLE_PATH)"; @@ -5409,9 +5413,11 @@ "$(PROJECT_DIR)/macosx/Frameworks/freetype.framework/Headers", "$(PROJECT_DIR)/macosx/Frameworks/Lua.framework/Headers", "$(PROJECT_DIR)/macosx/Frameworks/SDL2.framework/Headers", + "$(PROJECT_DIR)/macosx/Frameworks/mpg123.framework/Headers", /Library/Frameworks/freetype.framework/Headers, /Library/Frameworks/Lua.framework/Headers, /Library/Frameworks/SDL2.framework/Headers, + /Library/Frameworks/mpg123.framework/Headers, ); INFOPLIST_FILE = "macosx/liblove-macosx.plist"; LD_DYLIB_INSTALL_NAME = "@rpath/$(EXECUTABLE_PATH)";