Merged default into minor

--HG--
branch : minor
This commit is contained in:
Alex Szpakowski
2014-11-15 20:17:18 -04:00
32 changed files with 348 additions and 22 deletions
+103 -3
View File
@@ -1,4 +1,6 @@
Copyright (c) 2006-2014 LOVE Development Team This software uses LÖVE:
LÖVE is Copyright (c) 2006-2014 LOVE Development Team
This software is provided 'as-is', without any express or implied This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages warranty. In no event will the authors be held liable for any damages
@@ -19,11 +21,109 @@ misrepresented as being the original software.
3. This notice may not be removed or altered from any source 3. This notice may not be removed or altered from any source
distribution. distribution.
---------
This software uses LuaJIT:
------- LuaJIT is Copyright (c) 2005-2014 Mike Pall
LÖVE uses the following LGPL libraries: Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
---------
This software uses ENet:
Copyright (c) 2002-2014 Lee Salzman
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
---------
This software uses lua-enet:
Copyright (C) 2011 by Leaf Corcoran
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
---------
This software uses UTF8-CPP:
Copyright 2006 Nemanja Trifunovic
Permission is hereby granted, free of charge, to any person or organization
obtaining a copy of the software and accompanying documentation covered by
this license (the "Software") to use, reproduce, display, distribute,
execute, and transmit the Software, and to prepare derivative works of the
Software, and to permit third-parties to whom the Software is furnished to
do so, all subject to the following:
The copyright notices in the Software and this entire statement, including
the above license grant, this restriction and the following disclaimer,
must be included in all copies of the Software, in whole or in part, and
all derivative works of the Software, unless such copies or derivative
works are solely in the form of machine-executable object code generated by
a source language processor.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
---------
This software uses the following LGPL libraries:
- libmpg123 - libmpg123
Website: http://www.mpg123.de/ Website: http://www.mpg123.de/
@@ -14,17 +14,17 @@
A9255F58104324E100BA1496 /* Ogg.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = A9255F51104324D700BA1496 /* Ogg.framework */; }; A9255F58104324E100BA1496 /* Ogg.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = A9255F51104324D700BA1496 /* Ogg.framework */; };
A93E6E5510420B57007D418B /* Lua.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A93E6E5310420B57007D418B /* Lua.framework */; }; A93E6E5510420B57007D418B /* Lua.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A93E6E5310420B57007D418B /* Lua.framework */; };
A93E6EED10420BA8007D418B /* love.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6A3410420AC0007D418B /* love.cpp */; }; A93E6EED10420BA8007D418B /* love.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6A3410420AC0007D418B /* love.cpp */; };
A9D307F2106635D3004FEDF8 /* physfs.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = A9D307E9106635C3004FEDF8 /* physfs.framework */; }; A9D307F2106635D3004FEDF8 /* physfs.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = A9D307E9106635C3004FEDF8 /* physfs.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
A9DEC1C11046EFA70049C70C /* Love.icns in Resources */ = {isa = PBXBuildFile; fileRef = A9DEC1BF1046EFA60049C70C /* Love.icns */; }; A9DEC1C11046EFA70049C70C /* Love.icns in Resources */ = {isa = PBXBuildFile; fileRef = A9DEC1BF1046EFA60049C70C /* Love.icns */; };
A9DEC1C21046EFA70049C70C /* LoveDocument.icns in Resources */ = {isa = PBXBuildFile; fileRef = A9DEC1C01046EFA70049C70C /* LoveDocument.icns */; }; A9DEC1C21046EFA70049C70C /* LoveDocument.icns in Resources */ = {isa = PBXBuildFile; fileRef = A9DEC1C01046EFA70049C70C /* LoveDocument.icns */; };
A9F169AC109E825000FC83D1 /* mpg123.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = A9F169A6109E824900FC83D1 /* mpg123.framework */; }; A9F169AC109E825000FC83D1 /* mpg123.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = A9F169A6109E824900FC83D1 /* mpg123.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
A9F169AD109E825000FC83D1 /* libmodplug.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = A9F16926109E7BAD00FC83D1 /* libmodplug.framework */; }; A9F169AD109E825000FC83D1 /* libmodplug.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = A9F16926109E7BAD00FC83D1 /* libmodplug.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
FA08F69616C766E000F007B5 /* love.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA08F69116C765A200F007B5 /* love.framework */; }; FA08F69616C766E000F007B5 /* love.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA08F69116C765A200F007B5 /* love.framework */; };
FA08F69716C766E700F007B5 /* love.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = FA08F69116C765A200F007B5 /* love.framework */; }; FA08F69716C766E700F007B5 /* love.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = FA08F69116C765A200F007B5 /* love.framework */; };
FA77A36518F1172600D23AE9 /* jpeg-turbo.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = FA77A36418F1172600D23AE9 /* jpeg-turbo.framework */; }; FA77A36518F1172600D23AE9 /* jpeg-turbo.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = FA77A36418F1172600D23AE9 /* jpeg-turbo.framework */; };
FA9B4A0A16E1579F00074F42 /* SDL2.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA9B4A0916E1579F00074F42 /* SDL2.framework */; }; FA9B4A0A16E1579F00074F42 /* SDL2.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA9B4A0916E1579F00074F42 /* SDL2.framework */; };
FA9B4A0B16E157B500074F42 /* SDL2.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = FA9B4A0916E1579F00074F42 /* SDL2.framework */; }; FA9B4A0B16E157B500074F42 /* SDL2.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = FA9B4A0916E1579F00074F42 /* SDL2.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
FAAFF04716CB120000CCDE45 /* OpenAL-Soft.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = FAAFF04616CB120000CCDE45 /* OpenAL-Soft.framework */; }; FAAFF04716CB120000CCDE45 /* OpenAL-Soft.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = FAAFF04616CB120000CCDE45 /* OpenAL-Soft.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
FAC1A449196F5DC600125284 /* license.txt in Resources */ = {isa = PBXBuildFile; fileRef = FAC1A448196F5DC600125284 /* license.txt */; }; FAC1A449196F5DC600125284 /* license.txt in Resources */ = {isa = PBXBuildFile; fileRef = FAC1A448196F5DC600125284 /* license.txt */; };
FAC8E8D416F3C468004DADF3 /* OSX.mm in Sources */ = {isa = PBXBuildFile; fileRef = FAC8E8D316F3C468004DADF3 /* OSX.mm */; }; FAC8E8D416F3C468004DADF3 /* OSX.mm in Sources */ = {isa = PBXBuildFile; fileRef = FAC8E8D316F3C468004DADF3 /* OSX.mm */; };
/* End PBXBuildFile section */ /* End PBXBuildFile section */
@@ -201,7 +201,7 @@
29B97313FDCFA39411CA2CEA /* Project object */ = { 29B97313FDCFA39411CA2CEA /* Project object */ = {
isa = PBXProject; isa = PBXProject;
attributes = { attributes = {
LastUpgradeCheck = 0510; LastUpgradeCheck = 0610;
}; };
buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "love" */; buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "love" */;
compatibilityVersion = "Xcode 3.2"; compatibilityVersion = "Xcode 3.2";
+1 -1
View File
@@ -116,7 +116,7 @@ static Format parseDX10Format(DXGIFormat fmt)
f = FORMAT_BC6H; f = FORMAT_BC6H;
break; break;
case DXGI_FORMAT_BC6H_SF16: case DXGI_FORMAT_BC6H_SF16:
f = FORAMT_BC6Hs; f = FORMAT_BC6Hs;
break; break;
case DXGI_FORMAT_BC7_TYPELESS: case DXGI_FORMAT_BC7_TYPELESS:
case DXGI_FORMAT_BC7_UNORM: case DXGI_FORMAT_BC7_UNORM:
+1 -1
View File
@@ -45,7 +45,7 @@ enum Format
FORMAT_BC5, FORMAT_BC5,
FORMAT_BC5s, FORMAT_BC5s,
FORMAT_BC6H, FORMAT_BC6H,
FORAMT_BC6Hs, FORMAT_BC6Hs,
FORMAT_BC7, FORMAT_BC7,
FORMAT_BC7srgb, // sRGB color space. FORMAT_BC7srgb, // sRGB color space.
FORMAT_UNKNOWN FORMAT_UNKNOWN
+17 -3
View File
@@ -491,6 +491,17 @@ GLenum Image::getCompressedFormat(image::CompressedData::Format cformat) const
return GL_COMPRESSED_RG_RGTC2; return GL_COMPRESSED_RG_RGTC2;
case image::CompressedData::FORMAT_BC5s: case image::CompressedData::FORMAT_BC5s:
return GL_COMPRESSED_SIGNED_RG_RGTC2; return GL_COMPRESSED_SIGNED_RG_RGTC2;
case image::CompressedData::FORMAT_BC6H:
return GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT;
case image::CompressedData::FORMAT_BC6Hs:
return GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT;
case image::CompressedData::FORMAT_BC7:
if (flags.sRGB)
return GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM;
else
return GL_COMPRESSED_RGBA_BPTC_UNORM;
case image::CompressedData::FORMAT_BC7SRGB:
return GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM;
default: default:
if (flags.sRGB) if (flags.sRGB)
return GL_SRGB8_ALPHA8; return GL_SRGB8_ALPHA8;
@@ -519,11 +530,14 @@ bool Image::hasCompressedTextureSupport(image::CompressedData::Format format)
case image::CompressedData::FORMAT_BC5: case image::CompressedData::FORMAT_BC5:
case image::CompressedData::FORMAT_BC5s: case image::CompressedData::FORMAT_BC5s:
return (GLAD_VERSION_3_0 || GLAD_ARB_texture_compression_rgtc || GLAD_EXT_texture_compression_rgtc); return (GLAD_VERSION_3_0 || GLAD_ARB_texture_compression_rgtc || GLAD_EXT_texture_compression_rgtc);
case image::CompressedData::FORMAT_BC6H:
case image::CompressedData::FORMAT_BC6Hs:
case image::CompressedData::FORMAT_BC7:
case image::CompressedData::FORMAT_BC7SRGB:
return GLAD_VERSION_4_2 || GLAD_ARB_texture_compression_bptc;
default: default:
break; return false;
} }
return false;
} }
bool Image::hasSRGBSupport() bool Image::hasSRGBSupport()
+4
View File
@@ -110,6 +110,10 @@ StringMap<CompressedData::Format, CompressedData::FORMAT_MAX_ENUM>::Entry Compre
{"bc4s", CompressedData::FORMAT_BC4s}, {"bc4s", CompressedData::FORMAT_BC4s},
{"bc5", CompressedData::FORMAT_BC5}, {"bc5", CompressedData::FORMAT_BC5},
{"bc5s", CompressedData::FORMAT_BC5s}, {"bc5s", CompressedData::FORMAT_BC5s},
{"bc6h", CompressedData::FORMAT_BC6H},
{"bc6hs", CompressedData::FORMAT_BC6Hs},
{"bc7", CompressedData::FORMAT_BC7},
{"bc7srgb", CompressedData::FORMAT_BC7SRGB},
}; };
StringMap<CompressedData::Format, CompressedData::FORMAT_MAX_ENUM> CompressedData::formats(CompressedData::formatEntries, sizeof(CompressedData::formatEntries)); StringMap<CompressedData::Format, CompressedData::FORMAT_MAX_ENUM> CompressedData::formats(CompressedData::formatEntries, sizeof(CompressedData::formatEntries));
+4
View File
@@ -54,6 +54,10 @@ public:
FORMAT_BC4s, FORMAT_BC4s,
FORMAT_BC5, FORMAT_BC5,
FORMAT_BC5s, FORMAT_BC5s,
FORMAT_BC6H,
FORMAT_BC6Hs,
FORMAT_BC7,
FORMAT_BC7SRGB,
FORMAT_MAX_ENUM FORMAT_MAX_ENUM
}; };
+8 -2
View File
@@ -117,11 +117,17 @@ CompressedData::Format ddsHandler::convertFormat(dds::Format ddsformat)
return CompressedData::FORMAT_BC5; return CompressedData::FORMAT_BC5;
case dds::FORMAT_BC5s: case dds::FORMAT_BC5s:
return CompressedData::FORMAT_BC5s; return CompressedData::FORMAT_BC5s;
case dds::FORMAT_BC6H:
return CompressedData::FORMAT_BC6H;
case dds::FORMAT_BC6Hs:
return CompressedData::FORMAT_BC6Hs;
case dds::FORMAT_BC7:
return CompressedData::FORMAT_BC7;
case dds::FORMAT_BC7srgb:
return CompressedData::FORMAT_BC7SRGB;
default: default:
return CompressedData::FORMAT_UNKNOWN; return CompressedData::FORMAT_UNKNOWN;
} }
return CompressedData::FORMAT_UNKNOWN;
} }
} // magpie } // magpie
@@ -489,6 +489,10 @@ void JoystickModule::loadGamepadMappings(const std::string &mappings)
if (mapping.empty()) if (mapping.empty())
continue; continue;
// Lines starting with "#" are comments.
if (mapping[0] == '#')
continue;
// Strip out and compare any "platform:XYZ," in the mapping. // Strip out and compare any "platform:XYZ," in the mapping.
size_t pstartpos = mapping.find("platform:"); size_t pstartpos = mapping.find("platform:");
if (pstartpos != std::string::npos) if (pstartpos != std::string::npos)
@@ -499,7 +503,11 @@ void JoystickModule::loadGamepadMappings(const std::string &mappings)
std::string platform = mapping.substr(pstartpos, pendpos - pstartpos); std::string platform = mapping.substr(pstartpos, pendpos - pstartpos);
if (platform.compare(SDL_GetPlatform()) != 0) if (platform.compare(SDL_GetPlatform()) != 0)
{
// Ignore the mapping but still acknowledge that it is one.
success = true;
continue; continue;
}
pstartpos -= strlen("platform:"); pstartpos -= strlen("platform:");
mapping.erase(pstartpos, pendpos - pstartpos + 1); mapping.erase(pstartpos, pendpos - pstartpos + 1);
+9 -5
View File
@@ -179,13 +179,17 @@ int w_getGamepadMapping(lua_State *L)
int w_loadGamepadMappings(lua_State *L) int w_loadGamepadMappings(lua_State *L)
{ {
lua_pushvalue(L, 1); bool isfile = true;
luax_convobj(L, -1, "filesystem", "isFile");
bool isfile = luax_toboolean(L, -1);
lua_pop(L, 1);
std::string mappings; std::string mappings;
if (lua_isstring(L, 1))
{
lua_pushvalue(L, 1);
luax_convobj(L, -1, "filesystem", "isFile");
isfile = luax_toboolean(L, -1);
lua_pop(L, 1);
}
if (isfile) if (isfile)
{ {
love::filesystem::FileData *fd = love::filesystem::luax_getfiledata(L, 1); love::filesystem::FileData *fd = love::filesystem::luax_getfiledata(L, 1);
+27
View File
@@ -28,6 +28,9 @@
#include "World.h" #include "World.h"
#include "Physics.h" #include "Physics.h"
// Needed for luax_pushjoint.
#include "wrap_Joint.h"
namespace love namespace love
{ {
namespace physics namespace physics
@@ -440,6 +443,30 @@ int Body::getFixtureList(lua_State *L) const
return 1; return 1;
} }
int Body::getJointList(lua_State *L) const
{
lua_newtable(L);
const b2JointEdge *je = body->GetJointList();
int i = 1;
do
{
if (!je)
break;
Joint *joint = (Joint *) Memoizer::find(je->joint);
if (!joint)
throw love::Exception("A joint has escaped Memoizer!");
luax_pushjoint(L, joint);
lua_rawseti(L, -2, i);
i++;
}
while ((je = je->next));
return 1;
}
int Body::getContactList(lua_State *L) const int Body::getContactList(lua_State *L) const
{ {
lua_newtable(L); lua_newtable(L);
+5
View File
@@ -393,6 +393,11 @@ public:
**/ **/
int getFixtureList(lua_State *L) const; int getFixtureList(lua_State *L) const;
/**
* Get an array of all Joints attached to this Body.
**/
int getJointList(lua_State *L) const;
/** /**
* Get an array of all active Contacts attached to this Body. * Get an array of all active Contacts attached to this Body.
* This list changes during World:update and you may miss some collisions * This list changes during World:update and you may miss some collisions
+27
View File
@@ -23,6 +23,7 @@
// Module // Module
#include "Body.h" #include "Body.h"
#include "World.h" #include "World.h"
#include "common/Memoizer.h"
namespace love namespace love
{ {
@@ -60,6 +61,32 @@ float GearJoint::getRatio() const
return joint->GetRatio(); return joint->GetRatio();
} }
Joint *GearJoint::getJointA() const
{
b2Joint *b2joint = joint->GetJoint1();
if (b2joint == nullptr)
return nullptr;
Joint *j = (Joint *) Memoizer::find(b2joint);
if (j == nullptr)
throw love::Exception("A joint has escaped Memoizer!");
return j;
}
Joint *GearJoint::getJointB() const
{
b2Joint *b2joint = joint->GetJoint2();
if (b2joint == nullptr)
return nullptr;
Joint *j = (Joint *) Memoizer::find(b2joint);
if (j == nullptr)
throw love::Exception("A joint has escaped Memoizer!");
return j;
}
} // box2d } // box2d
} // physics } // physics
} // love } // love
+3
View File
@@ -64,6 +64,9 @@ public:
**/ **/
float getRatio() const; float getRatio() const;
Joint *getJointA() const;
Joint *getJointB() const;
private: private:
// The Box2D GearJoint object. // The Box2D GearJoint object.
b2GearJoint *joint; b2GearJoint *joint;
+28
View File
@@ -90,11 +90,39 @@ Joint::Type Joint::getType() const
return JOINT_WHEEL; return JOINT_WHEEL;
case e_ropeJoint: case e_ropeJoint:
return JOINT_ROPE; return JOINT_ROPE;
case e_motorJoint:
return JOINT_MOTOR;
default: default:
return JOINT_INVALID; return JOINT_INVALID;
} }
} }
Body *Joint::getBodyA() const
{
b2Body *b2body = joint->GetBodyA();
if (b2body == nullptr)
return nullptr;
Body *body = (Body *) Memoizer::find(b2body);
if (body == nullptr)
throw love::Exception("A body has escaped Memoizer!");
return body;
}
Body *Joint::getBodyB() const
{
b2Body *b2body = joint->GetBodyB();
if (b2body == nullptr)
return nullptr;
Body *body = (Body *) Memoizer::find(b2body);
if (body == nullptr)
throw love::Exception("A body has escaped Memoizer!");
return body;
}
bool Joint::isValid() const bool Joint::isValid() const
{ {
return joint != 0; return joint != 0;
+3 -1
View File
@@ -79,12 +79,14 @@ public:
**/ **/
bool isValid() const; bool isValid() const;
/** /**
* Gets the type of joint. * Gets the type of joint.
**/ **/
Type getType() const; Type getType() const;
Body *getBodyA() const;
Body *getBodyB() const;
/** /**
* Gets the anchor positions of the Joint in world * Gets the anchor positions of the Joint in world
* coordinates. This is useful for debugdrawing the joint. * coordinates. This is useful for debugdrawing the joint.
+10
View File
@@ -539,6 +539,15 @@ int w_Body_getFixtureList(lua_State *L)
return n; return n;
} }
int w_Body_getJointList(lua_State *L)
{
Body *t = luax_checkbody(L, 1);
lua_remove(L, 1);
int n = 0;
luax_catchexcept(L, [&](){ n = t->getJointList(L); });
return n;
}
int w_Body_getContactList(lua_State *L) int w_Body_getContactList(lua_State *L)
{ {
Body *t = luax_checkbody(L, 1); Body *t = luax_checkbody(L, 1);
@@ -623,6 +632,7 @@ static const luaL_Reg functions[] =
{ "isFixedRotation", w_Body_isFixedRotation }, { "isFixedRotation", w_Body_isFixedRotation },
{ "getWorld", w_Body_getWorld }, { "getWorld", w_Body_getWorld },
{ "getFixtureList", w_Body_getFixtureList }, { "getFixtureList", w_Body_getFixtureList },
{ "getJointList", w_Body_getJointList },
{ "getContactList", w_Body_getContactList }, { "getContactList", w_Body_getContactList },
{ "destroy", w_Body_destroy }, { "destroy", w_Body_destroy },
{ "setUserData", w_Body_setUserData }, { "setUserData", w_Body_setUserData },
+1
View File
@@ -85,6 +85,7 @@ int w_Body_setFixedRotation(lua_State *L);
int w_Body_isFixedRotation(lua_State *L); int w_Body_isFixedRotation(lua_State *L);
int w_Body_getWorld(lua_State *L); int w_Body_getWorld(lua_State *L);
int w_Body_getFixtureList(lua_State *L); int w_Body_getFixtureList(lua_State *L);
int w_Body_getJointList(lua_State *L);
int w_Body_getContactList(lua_State *L); int w_Body_getContactList(lua_State *L);
int w_Body_destroy(lua_State *L); int w_Body_destroy(lua_State *L);
int w_Body_setUserData(lua_State *L); int w_Body_setUserData(lua_State *L);
@@ -90,6 +90,7 @@ static const luaL_Reg functions[] =
{ "getDampingRatio", w_DistanceJoint_getDampingRatio }, { "getDampingRatio", w_DistanceJoint_getDampingRatio },
// From Joint. // From Joint.
{ "getType", w_Joint_getType }, { "getType", w_Joint_getType },
{ "getBodies", w_Joint_getBodies },
{ "getAnchors", w_Joint_getAnchors }, { "getAnchors", w_Joint_getAnchors },
{ "getReactionForce", w_Joint_getReactionForce }, { "getReactionForce", w_Joint_getReactionForce },
{ "getReactionTorque", w_Joint_getReactionTorque }, { "getReactionTorque", w_Joint_getReactionTorque },
@@ -74,6 +74,7 @@ static const luaL_Reg functions[] =
{ "getMaxTorque", w_FrictionJoint_getMaxTorque }, { "getMaxTorque", w_FrictionJoint_getMaxTorque },
// From Joint. // From Joint.
{ "getType", w_Joint_getType }, { "getType", w_Joint_getType },
{ "getBodies", w_Joint_getBodies },
{ "getAnchors", w_Joint_getAnchors }, { "getAnchors", w_Joint_getAnchors },
{ "getReactionForce", w_Joint_getReactionForce }, { "getReactionForce", w_Joint_getReactionForce },
{ "getReactionTorque", w_Joint_getReactionTorque }, { "getReactionTorque", w_Joint_getReactionTorque },
@@ -51,12 +51,30 @@ int w_GearJoint_getRatio(lua_State *L)
return 1; return 1;
} }
int w_GearJoint_getJoints(lua_State *L)
{
GearJoint *t = luax_checkgearjoint(L, 1);
Joint *j1 = nullptr;
Joint *j2 = nullptr;
luax_catchexcept(L, [&]() {
j1 = t->getJointA();
j2 = t->getJointB();
});
luax_pushjoint(L, j1);
luax_pushjoint(L, j2);
return 2;
}
static const luaL_Reg functions[] = static const luaL_Reg functions[] =
{ {
{ "setRatio", w_GearJoint_setRatio }, { "setRatio", w_GearJoint_setRatio },
{ "getRatio", w_GearJoint_getRatio }, { "getRatio", w_GearJoint_getRatio },
{ "getJoints", w_GearJoint_getJoints },
// From Joint. // From Joint.
{ "getType", w_Joint_getType }, { "getType", w_Joint_getType },
{ "getBodies", w_Joint_getBodies },
{ "getAnchors", w_Joint_getAnchors }, { "getAnchors", w_Joint_getAnchors },
{ "getReactionForce", w_Joint_getReactionForce }, { "getReactionForce", w_Joint_getReactionForce },
{ "getReactionTorque", w_Joint_getReactionTorque }, { "getReactionTorque", w_Joint_getReactionTorque },
@@ -36,6 +36,7 @@ namespace box2d
GearJoint *luax_checkgearjoint(lua_State *L, int idx); GearJoint *luax_checkgearjoint(lua_State *L, int idx);
int w_GearJoint_setRatio(lua_State *L); int w_GearJoint_setRatio(lua_State *L);
int w_GearJoint_getRatio(lua_State *L); int w_GearJoint_getRatio(lua_State *L);
int w_GearJoint_getJoints(lua_State *L);
extern "C" int luaopen_gearjoint(lua_State *L); extern "C" int luaopen_gearjoint(lua_State *L);
} // box2d } // box2d
+52
View File
@@ -21,6 +21,7 @@
// LOVE // LOVE
#include "wrap_Joint.h" #include "wrap_Joint.h"
#include "common/StringMap.h" #include "common/StringMap.h"
#include "Body.h"
namespace love namespace love
{ {
@@ -29,6 +30,40 @@ namespace physics
namespace box2d namespace box2d
{ {
void luax_pushjoint(lua_State *L, Joint *j)
{
if (j == nullptr)
return lua_pushnil(L);
switch (j->getType())
{
case Joint::JOINT_DISTANCE:
return luax_pushtype(L, "DistanceJoint", PHYSICS_DISTANCE_JOINT_T, j);
case Joint::JOINT_REVOLUTE:
return luax_pushtype(L, "RevoluteJoint", PHYSICS_REVOLUTE_JOINT_T, j);
case Joint::JOINT_PRISMATIC:
return luax_pushtype(L, "PrismaticJoint", PHYSICS_PRISMATIC_JOINT_T, j);
case Joint::JOINT_MOUSE:
return luax_pushtype(L, "MouseJoint", PHYSICS_MOUSE_JOINT_T, j);
case Joint::JOINT_PULLEY:
return luax_pushtype(L, "PulleyJoint", PHYSICS_PULLEY_JOINT_T, j);
case Joint::JOINT_GEAR:
return luax_pushtype(L, "GearJoint", PHYSICS_GEAR_JOINT_T, j);
case Joint::JOINT_FRICTION:
return luax_pushtype(L, "FrictionJoint", PHYSICS_FRICTION_JOINT_T, j);
case Joint::JOINT_WELD:
return luax_pushtype(L, "WeldJoint", PHYSICS_WELD_JOINT_T, j);
case Joint::JOINT_WHEEL:
return luax_pushtype(L, "WheelJoint", PHYSICS_WHEEL_JOINT_T, j);
case Joint::JOINT_ROPE:
return luax_pushtype(L, "RopeJoint", PHYSICS_ROPE_JOINT_T, j);
case Joint::JOINT_MOTOR:
return luax_pushtype(L, "MotorJoint", PHYSICS_MOTOR_JOINT_T, j);
default:
return lua_pushnil(L);
}
}
Joint *luax_checkjoint(lua_State *L, int idx) Joint *luax_checkjoint(lua_State *L, int idx)
{ {
Joint *t = luax_checktype<Joint>(L, idx, "Joint", PHYSICS_JOINT_T); Joint *t = luax_checktype<Joint>(L, idx, "Joint", PHYSICS_JOINT_T);
@@ -46,6 +81,22 @@ int w_Joint_getType(lua_State *L)
return 1; return 1;
} }
int w_Joint_getBodies(lua_State *L)
{
Joint *t = luax_checkjoint(L, 1);
Body *b1 = nullptr;
Body *b2 = nullptr;
luax_catchexcept(L, [&]() {
b1 = t->getBodyA();
b2 = t->getBodyB();
});
luax_pushtype(L, "Body", PHYSICS_BODY_T, b1);
luax_pushtype(L, "Body", PHYSICS_BODY_T, b2);
return 2;
}
int w_Joint_getAnchors(lua_State *L) int w_Joint_getAnchors(lua_State *L)
{ {
Joint *t = luax_checkjoint(L, 1); Joint *t = luax_checkjoint(L, 1);
@@ -99,6 +150,7 @@ int w_Joint_destroy(lua_State *L)
static const luaL_Reg functions[] = static const luaL_Reg functions[] =
{ {
{ "getType", w_Joint_getType }, { "getType", w_Joint_getType },
{ "getBodies", w_Joint_getBodies },
{ "getAnchors", w_Joint_getAnchors }, { "getAnchors", w_Joint_getAnchors },
{ "getReactionForce", w_Joint_getReactionForce }, { "getReactionForce", w_Joint_getReactionForce },
{ "getReactionTorque", w_Joint_getReactionTorque }, { "getReactionTorque", w_Joint_getReactionTorque },
+2
View File
@@ -32,8 +32,10 @@ namespace physics
namespace box2d namespace box2d
{ {
void luax_pushjoint(lua_State *L, Joint *j);
Joint *luax_checkjoint(lua_State *L, int idx); Joint *luax_checkjoint(lua_State *L, int idx);
int w_Joint_getType(lua_State *L); int w_Joint_getType(lua_State *L);
int w_Joint_getBodies(lua_State *L);
int w_Joint_getAnchors(lua_State *L); int w_Joint_getAnchors(lua_State *L);
int w_Joint_getReactionForce(lua_State *L); int w_Joint_getReactionForce(lua_State *L);
int w_Joint_getReactionTorque(lua_State *L); int w_Joint_getReactionTorque(lua_State *L);
@@ -124,6 +124,7 @@ static const luaL_Reg functions[] =
{ "getCorrectionFactor", w_MotorJoint_getCorrectionFactor }, { "getCorrectionFactor", w_MotorJoint_getCorrectionFactor },
// From Joint. // From Joint.
{ "getType", w_Joint_getType }, { "getType", w_Joint_getType },
{ "getBodies", w_Joint_getBodies },
{ "getAnchors", w_Joint_getAnchors }, { "getAnchors", w_Joint_getAnchors },
{ "getReactionForce", w_Joint_getReactionForce }, { "getReactionForce", w_Joint_getReactionForce },
{ "getReactionTorque", w_Joint_getReactionTorque }, { "getReactionTorque", w_Joint_getReactionTorque },
@@ -108,6 +108,7 @@ static const luaL_Reg functions[] =
{ "getDampingRatio", w_MouseJoint_getDampingRatio }, { "getDampingRatio", w_MouseJoint_getDampingRatio },
// From Joint. // From Joint.
{ "getType", w_Joint_getType }, { "getType", w_Joint_getType },
{ "getBodies", w_Joint_getBodies },
{ "getAnchors", w_Joint_getAnchors }, { "getAnchors", w_Joint_getAnchors },
{ "getReactionForce", w_Joint_getReactionForce }, { "getReactionForce", w_Joint_getReactionForce },
{ "getReactionTorque", w_Joint_getReactionTorque }, { "getReactionTorque", w_Joint_getReactionTorque },
@@ -185,6 +185,7 @@ static const luaL_Reg functions[] =
{ "getLimits", w_PrismaticJoint_getLimits }, { "getLimits", w_PrismaticJoint_getLimits },
// From Joint. // From Joint.
{ "getType", w_Joint_getType }, { "getType", w_Joint_getType },
{ "getBodies", w_Joint_getBodies },
{ "getAnchors", w_Joint_getAnchors }, { "getAnchors", w_Joint_getAnchors },
{ "getReactionForce", w_Joint_getReactionForce }, { "getReactionForce", w_Joint_getReactionForce },
{ "getReactionTorque", w_Joint_getReactionTorque }, { "getReactionTorque", w_Joint_getReactionTorque },
@@ -71,6 +71,7 @@ static const luaL_Reg functions[] =
{ "getRatio", w_PulleyJoint_getRatio }, { "getRatio", w_PulleyJoint_getRatio },
// From Joint. // From Joint.
{ "getType", w_Joint_getType }, { "getType", w_Joint_getType },
{ "getBodies", w_Joint_getBodies },
{ "getAnchors", w_Joint_getAnchors }, { "getAnchors", w_Joint_getAnchors },
{ "getReactionForce", w_Joint_getReactionForce }, { "getReactionForce", w_Joint_getReactionForce },
{ "getReactionTorque", w_Joint_getReactionTorque }, { "getReactionTorque", w_Joint_getReactionTorque },
@@ -185,6 +185,7 @@ static const luaL_Reg functions[] =
{ "getLimits", w_RevoluteJoint_getLimits }, { "getLimits", w_RevoluteJoint_getLimits },
// From Joint. // From Joint.
{ "getType", w_Joint_getType }, { "getType", w_Joint_getType },
{ "getBodies", w_Joint_getBodies },
{ "getAnchors", w_Joint_getAnchors }, { "getAnchors", w_Joint_getAnchors },
{ "getReactionForce", w_Joint_getReactionForce }, { "getReactionForce", w_Joint_getReactionForce },
{ "getReactionTorque", w_Joint_getReactionTorque }, { "getReactionTorque", w_Joint_getReactionTorque },
@@ -47,6 +47,7 @@ static const luaL_Reg functions[] =
{ "getMaxLength", w_RopeJoint_getMaxLength }, { "getMaxLength", w_RopeJoint_getMaxLength },
// From Joint. // From Joint.
{ "getType", w_Joint_getType }, { "getType", w_Joint_getType },
{ "getBodies", w_Joint_getBodies },
{ "getAnchors", w_Joint_getAnchors }, { "getAnchors", w_Joint_getAnchors },
{ "getReactionForce", w_Joint_getReactionForce }, { "getReactionForce", w_Joint_getReactionForce },
{ "getReactionTorque", w_Joint_getReactionTorque }, { "getReactionTorque", w_Joint_getReactionTorque },
@@ -73,6 +73,7 @@ static const luaL_Reg functions[] =
{ "getDampingRatio", w_WeldJoint_getDampingRatio }, { "getDampingRatio", w_WeldJoint_getDampingRatio },
// From Joint. // From Joint.
{ "getType", w_Joint_getType }, { "getType", w_Joint_getType },
{ "getBodies", w_Joint_getBodies },
{ "getAnchors", w_Joint_getAnchors }, { "getAnchors", w_Joint_getAnchors },
{ "getReactionForce", w_Joint_getReactionForce }, { "getReactionForce", w_Joint_getReactionForce },
{ "getReactionTorque", w_Joint_getReactionTorque }, { "getReactionTorque", w_Joint_getReactionTorque },
@@ -149,6 +149,7 @@ static const luaL_Reg functions[] =
{ "getSpringDampingRatio", w_WheelJoint_getSpringDampingRatio }, { "getSpringDampingRatio", w_WheelJoint_getSpringDampingRatio },
// From Joint. // From Joint.
{ "getType", w_Joint_getType }, { "getType", w_Joint_getType },
{ "getBodies", w_Joint_getBodies },
{ "getAnchors", w_Joint_getAnchors }, { "getAnchors", w_Joint_getAnchors },
{ "getReactionForce", w_Joint_getReactionForce }, { "getReactionForce", w_Joint_getReactionForce },
{ "getReactionTorque", w_Joint_getReactionTorque }, { "getReactionTorque", w_Joint_getReactionTorque },