// MIT License // Copyright (c) 2019 Erin Catto // 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. #include "test.h" class PulleyJoint : public Test { public: PulleyJoint() { float y = 16.0f; float L = 12.0f; float a = 1.0f; float b = 2.0f; b2Body* ground = NULL; { b2BodyDef bd; ground = m_world->CreateBody(&bd); b2CircleShape circle; circle.m_radius = 2.0f; circle.m_p.Set(-10.0f, y + b + L); ground->CreateFixture(&circle, 0.0f); circle.m_p.Set(10.0f, y + b + L); ground->CreateFixture(&circle, 0.0f); } { b2PolygonShape shape; shape.SetAsBox(a, b); b2BodyDef bd; bd.type = b2_dynamicBody; //bd.fixedRotation = true; bd.position.Set(-10.0f, y); b2Body* body1 = m_world->CreateBody(&bd); body1->CreateFixture(&shape, 5.0f); bd.position.Set(10.0f, y); b2Body* body2 = m_world->CreateBody(&bd); body2->CreateFixture(&shape, 5.0f); b2PulleyJointDef pulleyDef; b2Vec2 anchor1(-10.0f, y + b); b2Vec2 anchor2(10.0f, y + b); b2Vec2 groundAnchor1(-10.0f, y + b + L); b2Vec2 groundAnchor2(10.0f, y + b + L); pulleyDef.Initialize(body1, body2, groundAnchor1, groundAnchor2, anchor1, anchor2, 1.5f); m_joint1 = (b2PulleyJoint*)m_world->CreateJoint(&pulleyDef); } } void Step(Settings& settings) override { Test::Step(settings); float ratio = m_joint1->GetRatio(); float L = m_joint1->GetCurrentLengthA() + ratio * m_joint1->GetCurrentLengthB(); g_debugDraw.DrawString(5, m_textLine, "L1 + %4.2f * L2 = %4.2f", (float) ratio, (float) L); m_textLine += m_textIncrement; } static Test* Create() { return new PulleyJoint; } b2PulleyJoint* m_joint1; }; static int testIndex = RegisterTest("Joints", "Pulley", PulleyJoint::Create);