Exemple #1
0
        public override void initTest(bool deserialized)
        {
            if (deserialized)
            {
                return;
            }
            Body[] bodies = new Body[e_count];
            {
                BodyDef bd = new BodyDef();
                Body ground = getWorld().createBody(bd);

                EdgeShape shape = new EdgeShape();
                shape.set(new Vec2(-40.0f, 0.0f), new Vec2(40.0f, 0.0f));
                ground.createFixture(shape, 0.0f);
            }

            {
                CircleShape shape = new CircleShape();
                shape.m_radius = 1.0f;

                for (int i = 0; i < e_count; ++i)
                {
                    BodyDef bd = new BodyDef();
                    bd.type = BodyType.DYNAMIC;
                    bd.position.set(0.0f, 4.0f + 3.0f*i);

                    bodies[i] = getWorld().createBody(bd);

                    bodies[i].createFixture(shape, 1.0f);

                    // m_bodies[i].setLinearVelocity(new Vec2(0.0f, -100.0f));
                }
            }
        }
Exemple #2
0
 public override Shape clone()
 {
     CircleShape shape = new CircleShape();
     shape.m_p.x = m_p.x;
     shape.m_p.y = m_p.y;
     shape.m_radius = m_radius;
     return shape;
 }
        public override void initTest(bool deserialized)
        {
            if (deserialized)
            {
                return;
            }
            Body pendulum;
            Body pendulumBase;
            Body ground;

            {
                CircleShape circleShape = new CircleShape();
                circleShape.m_radius = 1;
                Shape shape = circleShape;

                BodyDef bodyDef = new BodyDef();
                bodyDef.type = BodyType.DYNAMIC;
                bodyDef.position.set(-5, 0);
                bodyDef.allowSleep = false;
                pendulum = getWorld().createBody(bodyDef);
                pendulum.createFixture(shape, 1);
            }

            {
                PolygonShape shape = new PolygonShape();
                shape.setAsBox(1, 1);

                BodyDef bodyDef = new BodyDef();
                bodyDef.type = BodyType.DYNAMIC;
                bodyDef.position.set(0, 2);
                bodyDef.allowSleep = false;
                pendulumBase = getWorld().createBody(bodyDef);
                pendulumBase.createFixture(shape, 1);
            }

            {
                PolygonShape shape = new PolygonShape();
                shape.setAsBox(3, 1);

                BodyDef bodyDef = new BodyDef();
                bodyDef.type = BodyType.STATIC;
                ground = getWorld().createBody(bodyDef);
                ground.createFixture(shape, 0);
            }

            RevoluteJointDef jointDef = new RevoluteJointDef();

            if (switchBodiesInJoint)
                jointDef.initialize(pendulum, pendulumBase, new Vec2(0, 0));
            else
                jointDef.initialize(pendulumBase, pendulum, new Vec2(0, 0));

            getWorld().createJoint(jointDef);
        }
Exemple #4
0
        public override void initTest(bool deserialized)
        {
            {
                {
                    PolygonShape shape = new PolygonShape();
                    Vec2[] vertices =
                        new Vec2[] {new Vec2(-40, -10), new Vec2(40, -10), new Vec2(40, 0), new Vec2(-40, 0)};
                    shape.set(vertices, 4);
                    getGroundBody().createFixture(shape, 0.0f);
                }

                {
                    PolygonShape shape = new PolygonShape();
                    Vec2[] vertices =
                    {new Vec2(-40, -1), new Vec2(-20, -1), new Vec2(-20, 20), new Vec2(-40, 30)};
                    shape.set(vertices, 4);
                    getGroundBody().createFixture(shape, 0.0f);
                }

                {
                    PolygonShape shape = new PolygonShape();
                    Vec2[] vertices = {new Vec2(20, -1), new Vec2(40, -1), new Vec2(40, 30), new Vec2(20, 20)};
                    shape.set(vertices, 4);
                    getGroundBody().createFixture(shape, 0.0f);
                }
            }

            m_world.setParticleRadius(0.35f);
            m_world.setParticleDamping(0.2f);

            {
                CircleShape shape = new CircleShape();
                shape.m_p.set(0, 30);
                shape.m_radius = 20;
                ParticleGroupDef pd = new ParticleGroupDef();
                pd.flags = ParticleType.b2_waterParticle;
                pd.shape = shape;
                m_world.createParticleGroup(pd);
            }

            {
                BodyDef bd = new BodyDef();
                bd.type = BodyType.DYNAMIC;
                Body body = m_world.createBody(bd);
                CircleShape shape = new CircleShape();
                shape.m_p.set(0, 80);
                shape.m_radius = 5;
                body.createFixture(shape, 0.5f);
            }
        }
Exemple #5
0
        public void createCircle()
        {
            float radius = 2.0f;
            CircleShape shape = new CircleShape();
            shape.m_p.setZero();
            shape.m_radius = radius;

            FixtureDef fd = new FixtureDef();
            fd.shape = shape;
            fd.density = 1.0f;
            fd.friction = 0.0f;

            Vec2 p = new Vec2((float) _random.NextDouble(), 3.0f + (float) _random.NextDouble());
            BodyDef bd = new BodyDef();
            bd.type = BodyType.DYNAMIC;
            bd.position = p;
            //bd.allowSleep = false;
            Body body = getWorld().createBody(bd);

            body.createFixture(fd);
        }
        public override void initTest(bool deserialized)
        {
            if (deserialized)
            {
                return;
            }
            {
                BodyDef bd = new BodyDef();
                Body ground = getWorld().createBody(bd);

                EdgeShape shape = new EdgeShape();
                shape.set(new Vec2(-40.0f, 0.0f), new Vec2(40.0f, 0.0f));
                ground.createFixture(shape, 0.0f);
            }

            {
                CircleShape shape = new CircleShape();
                shape.m_radius = 1.0f;

                FixtureDef fd = new FixtureDef();
                fd.shape = shape;
                fd.density = 1.0f;

                float[] restitution = {0.0f, 0.1f, 0.3f, 0.5f, 0.75f, 0.9f, 1.0f};

                for (int i = 0; i < 7; ++i)
                {
                    BodyDef bd = new BodyDef();
                    bd.type = BodyType.DYNAMIC;
                    bd.position.set(-10.0f + 3.0f*i, 20.0f);

                    Body body = getWorld().createBody(bd);

                    fd.restitution = restitution[i];
                    body.createFixture(fd);
                }
            }
        }
Exemple #7
0
        // Compute contact points for edge versus circle.
        // This accounts for edge connectivity.
        public void collideEdgeAndCircle(Manifold manifold, EdgeShape edgeA, Transform xfA,
            CircleShape circleB, Transform xfB)
        {
            manifold.pointCount = 0;

            // Compute circle in frame of edge
            // Vec2 Q = MulT(xfA, Mul(xfB, circleB.m_p));
            Transform.mulToOutUnsafe(xfB, circleB.m_p, ref temp);
            Transform.mulTransToOutUnsafe(xfA, temp, ref Q);

            Vec2 A = edgeA.m_vertex1;
            Vec2 B = edgeA.m_vertex2;
            e.set(B);
            e.subLocal(A);

            // Barycentric coordinates
            temp.set(B);
            temp.subLocal(Q);
            float u = Vec2.dot(e, temp);
            temp.set(Q);
            temp.subLocal(A);
            float v = Vec2.dot(e, temp);

            float radius = edgeA.m_radius + circleB.m_radius;

            // ContactFeature cf;
            cf.indexB = 0;
            cf.typeB = (byte) ContactID.Type.VERTEX;

            // Region A
            float dd;
            Vec2 P;
            if (v <= 0.0f)
            {
                P = A;
                d.set(Q);
                d.subLocal(P);
                dd = Vec2.dot(d, d);

                if (dd > radius*radius)
                {
                    return;
                }

                // Is there an edge connected to A?
                if (edgeA.m_hasVertex0)
                {
                    Vec2 A1 = edgeA.m_vertex0;
                    Vec2 B1 = A;
                    e1.set(B1);
                    e1.subLocal(A1);
                    temp.set(B1);
                    temp.subLocal(Q);
                    float u1 = Vec2.dot(e1, temp);

                    // Is the circle in Region AB of the previous edge?
                    if (u1 > 0.0f)
                    {
                        return;
                    }
                }

                cf.indexA = 0;
                cf.typeA = (byte) ContactID.Type.VERTEX;
                manifold.pointCount = 1;
                manifold.type = ManifoldType.CIRCLES;
                manifold.localNormal.setZero();
                manifold.localPoint.set(P);
                // manifold.points[0].id.key = 0;
                manifold.points[0].id.set(cf);
                manifold.points[0].localPoint.set(circleB.m_p);
                return;
            }

            // Region B
            if (u <= 0.0f)
            {
                P = B;
                d.set(Q);
                d.subLocal(P);
                dd = Vec2.dot(d, d);
                if (dd > radius*radius)
                {
                    return;
                }

                // Is there an edge connected to B?
                if (edgeA.m_hasVertex3)
                {
                    Vec2 B2 = edgeA.m_vertex3;
                    Vec2 A2 = B;
                    Vec2 e2 = e1;
                    e2.set(B2);
                    e2.subLocal(A2);
                    temp.set(Q);
                    temp.subLocal(A2);
                    float v2 = Vec2.dot(e2, temp);

                    // Is the circle in Region AB of the next edge?
                    if (v2 > 0.0f)
                    {
                        return;
                    }
                }

                cf.indexA = 1;
                cf.typeA = (byte) ContactID.Type.VERTEX;
                manifold.pointCount = 1;
                manifold.type = ManifoldType.CIRCLES;
                manifold.localNormal.setZero();
                manifold.localPoint.set(P);
                // manifold.points[0].id.key = 0;
                manifold.points[0].id.set(cf);
                manifold.points[0].localPoint.set(circleB.m_p);
                return;
            }

            // Region AB
            float den = Vec2.dot(e, e);
            Debug.Assert(den > 0.0f);

            // Vec2 P = (1.0f / den) * (u * A + v * B);
            P = A;
            P.mulLocal(u);
            temp.set(B);
            temp.mulLocal(v);
            P.addLocal(temp);
            P.mulLocal(1.0f/den);
            d.set(Q);
            d.subLocal(P);
            dd = Vec2.dot(d, d);
            if (dd > radius*radius)
            {
                return;
            }

            n.x = -e.y;
            n.y = e.x;
            temp.set(Q);
            temp.subLocal(A);
            if (Vec2.dot(n, temp) < 0.0f)
            {
                n.set(-n.x, -n.y);
            }
            n.normalize();

            cf.indexA = 0;
            cf.typeA = (byte) ContactID.Type.FACE;
            manifold.pointCount = 1;
            manifold.type = ManifoldType.FACE_A;
            manifold.localNormal.set(n);
            manifold.localPoint.set(A);
            // manifold.points[0].id.key = 0;
            manifold.points[0].id.set(cf);
            manifold.points[0].localPoint.set(circleB.m_p);
        }
Exemple #8
0
        // djm pooling, and from above
        /**
        * Compute the collision manifold between a polygon and a circle.
        *
        * @param manifold
        * @param polygon
        * @param xfA
        * @param circle
        * @param xfB
        */
        public void collidePolygonAndCircle(Manifold manifold, PolygonShape polygon,
            Transform xfA, CircleShape circle, Transform xfB)
        {
            manifold.pointCount = 0;
            // Vec2 v = circle.m_p;

            // Compute circle position in the frame of the polygon.
            // before inline:
            // Transform.mulToOutUnsafe(xfB, circle.m_p, c);
            // Transform.mulTransToOut(xfA, c, cLocal);
            //  float cLocalx = cLocal.x;
            //  float cLocaly = cLocal.y;
            // after inline:
            Vec2 circlep = circle.m_p;
            Rot xfBq = xfB.q;
            Rot xfAq = xfA.q;
            float cx = (xfBq.c*circlep.x - xfBq.s*circlep.y) + xfB.p.x;
            float cy = (xfBq.s*circlep.x + xfBq.c*circlep.y) + xfB.p.y;
            float px = cx - xfA.p.x;
            float py = cy - xfA.p.y;
            float cLocalx = (xfAq.c*px + xfAq.s*py);
            float cLocaly = (-xfAq.s*px + xfAq.c*py);
            // end inline

            // Find the min separating edge.
            int normalIndex = 0;
            float separation = -float.MaxValue;
            float radius = polygon.m_radius + circle.m_radius;
            int vertexCount = polygon.m_count;
            float s;
            Vec2[] vertices = polygon.m_vertices;
            Vec2[] normals = polygon.m_normals;

            for (int i = 0; i < vertexCount; i++)
            {
                // before inline
                // temp.set(cLocal).subLocal(vertices[i]);
                // float s = Vec2.dot(normals[i], temp);
                // after inline
                Vec2 vertex = vertices[i];
                float tempx = cLocalx - vertex.x;
                float tempy = cLocaly - vertex.y;
                s = normals[i].x*tempx + normals[i].y*tempy;

                if (s > radius)
                {
                    // early ref
                    return;
                }

                if (s > separation)
                {
                    separation = s;
                    normalIndex = i;
                }
            }

            // Vertices that subtend the incident face.
            int vertIndex1 = normalIndex;
            int vertIndex2 = vertIndex1 + 1 < vertexCount ? vertIndex1 + 1 : 0;
            Vec2 v1 = vertices[vertIndex1];
            Vec2 v2 = vertices[vertIndex2];

            // If the center is inside the polygon ...
            if (separation < Settings.EPSILON)
            {
                manifold.pointCount = 1;
                manifold.type = ManifoldType.FACE_A;

                // before inline:
                // manifold.localNormal.set(normals[normalIndex]);
                // manifold.localPoint.set(v1).addLocal(v2).mulLocal(.5f);
                // manifold.points[0].localPoint.set(circle.m_p);
                // after inline:
                Vec2 normal = normals[normalIndex];
                manifold.localNormal.x = normal.x;
                manifold.localNormal.y = normal.y;
                manifold.localPoint.x = (v1.x + v2.x)*.5f;
                manifold.localPoint.y = (v1.y + v2.y)*.5f;
                ManifoldPoint mpoint = manifold.points[0];
                mpoint.localPoint.x = circlep.x;
                mpoint.localPoint.y = circlep.y;
                mpoint.id.zero();
                // end inline

                return;
            }

            // Compute barycentric coordinates
            // before inline:
            // temp.set(cLocal).subLocal(v1);
            // temp2.set(v2).subLocal(v1);
            // float u1 = Vec2.dot(temp, temp2);
            // temp.set(cLocal).subLocal(v2);
            // temp2.set(v1).subLocal(v2);
            // float u2 = Vec2.dot(temp, temp2);
            // after inline:
            float tempX = cLocalx - v1.x;
            float tempY = cLocaly - v1.y;
            float temp2X = v2.x - v1.x;
            float temp2Y = v2.y - v1.y;
            float u1 = tempX*temp2X + tempY*temp2Y;

            float temp3X = cLocalx - v2.x;
            float temp3Y = cLocaly - v2.y;
            float temp4X = v1.x - v2.x;
            float temp4Y = v1.y - v2.y;
            float u2 = temp3X*temp4X + temp3Y*temp4Y;
            // end inline

            if (u1 <= 0f)
            {
                // inlined
                float dx = cLocalx - v1.x;
                float dy = cLocaly - v1.y;
                if (dx*dx + dy*dy > radius*radius)
                {
                    return;
                }

                manifold.pointCount = 1;
                manifold.type = ManifoldType.FACE_A;
                // before inline:
                // manifold.localNormal.set(cLocal).subLocal(v1);
                // after inline:
                manifold.localNormal.x = cLocalx - v1.x;
                manifold.localNormal.y = cLocaly - v1.y;
                // end inline
                manifold.localNormal.normalize();
                manifold.localPoint.set(v1);
                manifold.points[0].localPoint.set(circlep);
                manifold.points[0].id.zero();
            }
            else if (u2 <= 0.0f)
            {
                // inlined
                float dx = cLocalx - v2.x;
                float dy = cLocaly - v2.y;
                if (dx*dx + dy*dy > radius*radius)
                {
                    return;
                }

                manifold.pointCount = 1;
                manifold.type = ManifoldType.FACE_A;
                // before inline:
                // manifold.localNormal.set(cLocal).subLocal(v2);
                // after inline:
                manifold.localNormal.x = cLocalx - v2.x;
                manifold.localNormal.y = cLocaly - v2.y;
                // end inline
                manifold.localNormal.normalize();
                manifold.localPoint.set(v2);
                manifold.points[0].localPoint.set(circlep);
                manifold.points[0].id.zero();
            }
            else
            {
                // Vec2 faceCenter = 0.5f * (v1 + v2);
                // (temp is faceCenter)
                // before inline:
                // temp.set(v1).addLocal(v2).mulLocal(.5f);
                //
                // temp2.set(cLocal).subLocal(temp);
                // separation = Vec2.dot(temp2, normals[vertIndex1]);
                // if (separation > radius) {
                // return;
                // }
                // after inline:
                float fcx = (v1.x + v2.x)*.5f;
                float fcy = (v1.y + v2.y)*.5f;

                float tx = cLocalx - fcx;
                float ty = cLocaly - fcy;
                Vec2 normal = normals[vertIndex1];
                separation = tx*normal.x + ty*normal.y;
                if (separation > radius)
                {
                    return;
                }
                // end inline

                manifold.pointCount = 1;
                manifold.type = ManifoldType.FACE_A;
                manifold.localNormal.set(normals[vertIndex1]);
                manifold.localPoint.x = fcx; // (faceCenter)
                manifold.localPoint.y = fcy;
                manifold.points[0].localPoint.set(circlep);
                manifold.points[0].id.zero();
            }
        }
        public override void initTest(bool deserialized)
        {
            if (deserialized)
            {
                return;
            }
            // Ground body
            {
                EdgeShape shape = new EdgeShape();
                shape.set(new Vec2(-40.0f, 0.0f), new Vec2(40.0f, 0.0f));

                FixtureDef sd = new FixtureDef();
                sd.shape = shape;
                sd.friction = 0.3f;

                BodyDef bd = new BodyDef();
                Body ground = getWorld().createBody(bd);
                ground.createFixture(sd);
            }

            // Small triangle
            Vec2[] vertices = new Vec2[3];
            vertices[0] = new Vec2(-1.0f, 0.0f);
            vertices[1] = new Vec2(1.0f, 0.0f);
            vertices[2] = new Vec2(0.0f, 2.0f);
            PolygonShape polygon = new PolygonShape();
            polygon.set(vertices, 3);

            FixtureDef triangleShapeDef = new FixtureDef();
            triangleShapeDef.shape = polygon;
            triangleShapeDef.density = 1.0f;

            triangleShapeDef.filter.groupIndex = k_smallGroup;
            triangleShapeDef.filter.categoryBits = k_triangleCategory;
            triangleShapeDef.filter.maskBits = k_triangleMask;

            BodyDef triangleBodyDef = new BodyDef();
            triangleBodyDef.type = BodyType.DYNAMIC;
            triangleBodyDef.position.set(-5.0f, 2.0f);

            Body body1 = getWorld().createBody(triangleBodyDef);
            body1.createFixture(triangleShapeDef);

            // Large triangle (recycle definitions)
            vertices[0].mulLocal(2.0f);
            vertices[1].mulLocal(2.0f);
            vertices[2].mulLocal(2.0f);
            polygon.set(vertices, 3);
            triangleShapeDef.filter.groupIndex = k_largeGroup;
            triangleBodyDef.position.set(-5.0f, 6.0f);
            triangleBodyDef.fixedRotation = true; // look at me!

            Body body2 = getWorld().createBody(triangleBodyDef);
            body2.createFixture(triangleShapeDef);

            {
                BodyDef bd = new BodyDef();
                bd.type = BodyType.DYNAMIC;
                bd.position.set(-5.0f, 10.0f);
                Body body = getWorld().createBody(bd);

                PolygonShape p = new PolygonShape();
                p.setAsBox(0.5f, 1.0f);
                body.createFixture(p, 1.0f);

                PrismaticJointDef jd = new PrismaticJointDef();
                jd.bodyA = body2;
                jd.bodyB = body;
                jd.enableLimit = true;
                jd.localAnchorA.set(0.0f, 4.0f);
                jd.localAnchorB.setZero();
                jd.localAxisA.set(0.0f, 1.0f);
                jd.lowerTranslation = -1.0f;
                jd.upperTranslation = 1.0f;

                getWorld().createJoint(jd);
            }

            // Small box
            polygon.setAsBox(1.0f, 0.5f);
            FixtureDef boxShapeDef = new FixtureDef();
            boxShapeDef.shape = polygon;
            boxShapeDef.density = 1.0f;
            boxShapeDef.restitution = 0.1f;

            boxShapeDef.filter.groupIndex = k_smallGroup;
            boxShapeDef.filter.categoryBits = k_boxCategory;
            boxShapeDef.filter.maskBits = k_boxMask;

            BodyDef boxBodyDef = new BodyDef();
            boxBodyDef.type = BodyType.DYNAMIC;
            boxBodyDef.position.set(0.0f, 2.0f);

            Body body3 = getWorld().createBody(boxBodyDef);
            body3.createFixture(boxShapeDef);

            // Large box (recycle definitions)
            polygon.setAsBox(2.0f, 1.0f);
            boxShapeDef.filter.groupIndex = k_largeGroup;
            boxBodyDef.position.set(0.0f, 6.0f);

            Body body4 = getWorld().createBody(boxBodyDef);
            body4.createFixture(boxShapeDef);

            // Small circle
            CircleShape circle = new CircleShape();
            circle.m_radius = 1.0f;

            FixtureDef circleShapeDef = new FixtureDef();
            circleShapeDef.shape = circle;
            circleShapeDef.density = 1.0f;

            circleShapeDef.filter.groupIndex = k_smallGroup;
            circleShapeDef.filter.categoryBits = k_circleCategory;
            circleShapeDef.filter.maskBits = k_circleMask;

            BodyDef circleBodyDef = new BodyDef();
            circleBodyDef.type = BodyType.DYNAMIC;
            circleBodyDef.position.set(5.0f, 2.0f);

            Body body5 = getWorld().createBody(circleBodyDef);
            body5.createFixture(circleShapeDef);

            // Large circle
            circle.m_radius *= 2.0f;
            circleShapeDef.filter.groupIndex = k_largeGroup;
            circleBodyDef.position.set(5.0f, 6.0f);

            Body body6 = getWorld().createBody(circleBodyDef);
            body6.createFixture(circleShapeDef);
        }
Exemple #10
0
        public override void initTest(bool argDeserialized)
        {
            for (int i = 0; i < m_bodies.Length; i++)
            {
                m_bodies[i] = null;
            }
            // Ground body
            {
                BodyDef bd = new BodyDef();
                Body ground = getWorld().createBody(bd);

                float x1 = -20.0f;
                float y1 = 2.0f*MathUtils.cos(x1/10.0f*MathUtils.PI);
                for (int i = 0; i < 80; ++i)
                {
                    float x2 = x1 + 0.5f;
                    float y2 = 2.0f*MathUtils.cos(x2/10.0f*MathUtils.PI);

                    EdgeShape shape = new EdgeShape();
                    shape.set(new Vec2(x1, y1), new Vec2(x2, y2));
                    ground.createFixture(shape, 0.0f);

                    x1 = x2;
                    y1 = y2;
                }
            }

            {
                Vec2[] vertices = new Vec2[3];
                vertices[0] = new Vec2(-0.5f, 0.0f);
                vertices[1] = new Vec2(0.5f, 0.0f);
                vertices[2] = new Vec2(0.0f, 1.5f);
                m_polygons[0] = new PolygonShape();
                m_polygons[0].set(vertices, 3);
            }

            {
                Vec2[] vertices = new Vec2[3];
                vertices[0] = new Vec2(-0.1f, 0.0f);
                vertices[1] = new Vec2(0.1f, 0.0f);
                vertices[2] = new Vec2(0.0f, 1.5f);
                m_polygons[1] = new PolygonShape();
                m_polygons[1].set(vertices, 3);
            }

            {
                float w = 1.0f;
                float b = w/(2.0f + MathUtils.sqrt(2.0f));
                float s = MathUtils.sqrt(2.0f)*b;

                Vec2[] vertices = new Vec2[8];
                vertices[0] = new Vec2(0.5f*s, 0.0f);
                vertices[1] = new Vec2(0.5f*w, b);
                vertices[2] = new Vec2(0.5f*w, b + s);
                vertices[3] = new Vec2(0.5f*s, w);
                vertices[4] = new Vec2(-0.5f*s, w);
                vertices[5] = new Vec2(-0.5f*w, b + s);
                vertices[6] = new Vec2(-0.5f*w, b);
                vertices[7] = new Vec2(-0.5f*s, 0.0f);

                m_polygons[2] = new PolygonShape();
                m_polygons[2].set(vertices, 8);
            }

            {
                m_polygons[3] = new PolygonShape();
                m_polygons[3].setAsBox(0.5f, 0.5f);
            }

            {
                m_circle = new CircleShape();
                m_circle.m_radius = 0.5f;
            }

            m_bodyIndex = 0;
            m_angle = 0.0f;
        }
Exemple #11
0
        public override void initTest(bool deserialized)
        {
            if (deserialized)
            {
                return;
            }

            {
                BodyDef bd = new BodyDef();
                bd.position.set(0.0f, 0.0f);
                Body body = getWorld().createBody(bd);

                EdgeShape shape = new EdgeShape();
                shape.set(new Vec2(50.0f, 0.0f), new Vec2(-50.0f, 0.0f));

                body.createFixture(shape, 0.0f);
            }

            {
                CircleShape circle1 = new CircleShape();
                circle1.m_radius = 0.5f;
                circle1.m_p.set(-0.5f, 0.5f);

                CircleShape circle2 = new CircleShape();
                ;
                circle2.m_radius = 0.5f;
                circle2.m_p.set(0.5f, 0.5f);

                for (int i = 0; i < 10; ++i)
                {
                    float x = MathUtils.randomFloat(-0.1f, 0.1f);
                    BodyDef bd = new BodyDef();
                    bd.type = BodyType.DYNAMIC;
                    bd.position.set(x + 5.0f, 1.05f + 2.5f*i);
                    bd.angle = MathUtils.randomFloat(-MathUtils.PI, MathUtils.PI);
                    Body body = getWorld().createBody(bd);
                    body.createFixture(circle1, 2.0f);
                    body.createFixture(circle2, 0.0f);
                }
            }

            {
                PolygonShape polygon1 = new PolygonShape();
                polygon1.setAsBox(0.25f, 0.5f);

                PolygonShape polygon2 = new PolygonShape();
                polygon2.setAsBox(0.25f, 0.5f, new Vec2(0.0f, -0.5f), 0.5f*MathUtils.PI);

                for (int i = 0; i < 10; ++i)
                {
                    float x = MathUtils.randomFloat(-0.1f, 0.1f);
                    BodyDef bd = new BodyDef();
                    bd.type = BodyType.DYNAMIC;
                    bd.position.set(x - 5.0f, 1.05f + 2.5f*i);
                    bd.angle = MathUtils.randomFloat(-MathUtils.PI, MathUtils.PI);
                    Body body = getWorld().createBody(bd);
                    body.createFixture(polygon1, 2.0f);
                    body.createFixture(polygon2, 2.0f);
                }
            }

            {
                Transform xf1 = new Transform();
                xf1.q.set(0.3524f*MathUtils.PI);
                Rot.mulToOut(xf1.q, new Vec2(1.0f, 0.0f), ref xf1.p);

                Vec2[] vertices = new Vec2[3];

                PolygonShape triangle1 = new PolygonShape();
                vertices[0] = Transform.mul(xf1, new Vec2(-1.0f, 0.0f));
                vertices[1] = Transform.mul(xf1, new Vec2(1.0f, 0.0f));
                vertices[2] = Transform.mul(xf1, new Vec2(0.0f, 0.5f));
                triangle1.set(vertices, 3);

                Transform xf2 = new Transform();
                xf2.q.set(-0.3524f*MathUtils.PI);
                Rot.mulToOut(xf2.q, new Vec2(-1.0f, 0.0f), ref xf2.p);

                PolygonShape triangle2 = new PolygonShape();
                vertices[0] = Transform.mul(xf2, new Vec2(-1.0f, 0.0f));
                vertices[1] = Transform.mul(xf2, new Vec2(1.0f, 0.0f));
                vertices[2] = Transform.mul(xf2, new Vec2(0.0f, 0.5f));
                triangle2.set(vertices, 3);

                for (int i = 0; i < 10; ++i)
                {
                    float x = MathUtils.randomFloat(-0.1f, 0.1f);
                    BodyDef bd = new BodyDef();
                    bd.type = BodyType.DYNAMIC;
                    bd.position.set(x, 2.05f + 2.5f*i);
                    bd.angle = 0.0f;
                    Body body = getWorld().createBody(bd);
                    body.createFixture(triangle1, 2.0f);
                    body.createFixture(triangle2, 2.0f);
                }
            }

            {
                PolygonShape bottom = new PolygonShape();
                bottom.setAsBox(1.5f, 0.15f);

                PolygonShape left = new PolygonShape();
                left.setAsBox(0.15f, 2.7f, new Vec2(-1.45f, 2.35f), 0.2f);

                PolygonShape right = new PolygonShape();
                right.setAsBox(0.15f, 2.7f, new Vec2(1.45f, 2.35f), -0.2f);

                BodyDef bd = new BodyDef();
                bd.type = BodyType.DYNAMIC;
                bd.position.set(0.0f, 2.0f);
                Body body = getWorld().createBody(bd);
                body.createFixture(bottom, 4.0f);
                body.createFixture(left, 4.0f);
                body.createFixture(right, 4.0f);
            }
        }
Exemple #12
0
        /**
        * Compute the collision manifold between two circles.
        *
        * @param manifold
        * @param circle1
        * @param xfA
        * @param circle2
        * @param xfB
        */
        public void collideCircles(Manifold manifold, CircleShape circle1,
            Transform xfA, CircleShape circle2, Transform xfB)
        {
            manifold.pointCount = 0;
            // before inline:
            // Transform.mulToOut(xfA, circle1.m_p, pA);
            // Transform.mulToOut(xfB, circle2.m_p, pB);
            // d.set(pB).subLocal(pA);
            // float distSqr = d.x * d.x + d.y * d.y;

            // after inline:
            Vec2 circle1p = circle1.m_p;
            Vec2 circle2p = circle2.m_p;
            float pAx = (xfA.q.c*circle1p.x - xfA.q.s*circle1p.y) + xfA.p.x;
            float pAy = (xfA.q.s*circle1p.x + xfA.q.c*circle1p.y) + xfA.p.y;
            float pBx = (xfB.q.c*circle2p.x - xfB.q.s*circle2p.y) + xfB.p.x;
            float pBy = (xfB.q.s*circle2p.x + xfB.q.c*circle2p.y) + xfB.p.y;
            float dx = pBx - pAx;
            float dy = pBy - pAy;
            float distSqr = dx*dx + dy*dy;
            // end inline

            float radius = circle1.m_radius + circle2.m_radius;
            if (distSqr > radius*radius)
            {
                return;
            }

            manifold.type = ManifoldType.CIRCLES;
            manifold.localPoint.set(circle1p);
            manifold.localNormal.setZero();
            manifold.pointCount = 1;

            manifold.points[0].localPoint.set(circle2p);
            manifold.points[0].id.zero();
        }
        public override void initTest(bool deserialized)
        {
            if (deserialized)
            {
                return;
            }
            // Ground body
            {
                EdgeShape shape = new EdgeShape();
                shape.set(new Vec2(-50.0f, 0.0f), new Vec2(50.0f, 0.0f));

                FixtureDef sd = new FixtureDef();
                sd.shape = shape;

                BodyDef bd = new BodyDef();
                Body ground = getWorld().createBody(bd);
                ground.createFixture(sd);
            }

            float xLo = -5.0f, xHi = 5.0f;
            float yLo = 2.0f, yHi = 35.0f;

            // Small triangle
            Vec2[] vertices = new Vec2[3];
            vertices[0] = new Vec2(-1.0f, 0.0f);
            vertices[1] = new Vec2(1.0f, 0.0f);
            vertices[2] = new Vec2(0.0f, 2.0f);

            PolygonShape polygon = new PolygonShape();
            polygon.set(vertices, 3);

            FixtureDef triangleShapeDef = new FixtureDef();
            triangleShapeDef.shape = polygon;
            triangleShapeDef.density = 1.0f;

            BodyDef triangleBodyDef = new BodyDef();
            triangleBodyDef.type = BodyType.DYNAMIC;
            triangleBodyDef.position.set(MathUtils.randomFloat(xLo, xHi), MathUtils.randomFloat(yLo, yHi));

            Body body1 = getWorld().createBody(triangleBodyDef);
            body1.createFixture(triangleShapeDef);

            // Large triangle (recycle definitions)
            vertices[0].mulLocal(2.0f);
            vertices[1].mulLocal(2.0f);
            vertices[2].mulLocal(2.0f);
            polygon.set(vertices, 3);

            triangleBodyDef.position.set(MathUtils.randomFloat(xLo, xHi), MathUtils.randomFloat(yLo, yHi));

            Body body2 = getWorld().createBody(triangleBodyDef);
            body2.createFixture(triangleShapeDef);

            // Small box
            polygon.setAsBox(1.0f, 0.5f);

            FixtureDef boxShapeDef = new FixtureDef();
            boxShapeDef.shape = polygon;
            boxShapeDef.density = 1.0f;

            BodyDef boxBodyDef = new BodyDef();
            boxBodyDef.type = BodyType.DYNAMIC;
            boxBodyDef.position.set(MathUtils.randomFloat(xLo, xHi), MathUtils.randomFloat(yLo, yHi));

            Body body3 = getWorld().createBody(boxBodyDef);
            body3.createFixture(boxShapeDef);

            // Large box (recycle definitions)
            polygon.setAsBox(2.0f, 1.0f);
            boxBodyDef.position.set(MathUtils.randomFloat(xLo, xHi), MathUtils.randomFloat(yLo, yHi));

            Body body4 = getWorld().createBody(boxBodyDef);
            body4.createFixture(boxShapeDef);

            // Small circle
            CircleShape circle = new CircleShape();
            circle.m_radius = 1.0f;

            FixtureDef circleShapeDef = new FixtureDef();
            circleShapeDef.shape = circle;
            circleShapeDef.density = 1.0f;

            BodyDef circleBodyDef = new BodyDef();
            circleBodyDef.type = BodyType.DYNAMIC;
            circleBodyDef.position.set(MathUtils.randomFloat(xLo, xHi), MathUtils.randomFloat(yLo, yHi));

            Body body5 = getWorld().createBody(circleBodyDef);
            body5.createFixture(circleShapeDef);

            // Large circle
            circle.m_radius *= 2.0f;
            circleBodyDef.position.set(MathUtils.randomFloat(xLo, xHi), MathUtils.randomFloat(yLo, yHi));

            Body body6 = getWorld().createBody(circleBodyDef);
            body6.createFixture(circleShapeDef);
        }
Exemple #14
0
        public override void initTest(bool argDeserialized)
        {
            // Ground body
            {
                BodyDef bd = new BodyDef();
                Body ground = getWorld().createBody(bd);

                EdgeShape shape = new EdgeShape();
                shape.set(new Vec2(-40.0f, 0.0f), new Vec2(40.0f, 0.0f));
                ground.createFixture(shape, 0.0f);
            }

            {
                Vec2[] vertices = new Vec2[3];
                vertices[0] = new Vec2(-0.5f, 0.0f);
                vertices[1] = new Vec2(0.5f, 0.0f);
                vertices[2] = new Vec2(0.0f, 1.5f);
                m_polygons[0] = new PolygonShape();
                m_polygons[0].set(vertices, 3);
            }

            {
                Vec2[] vertices = new Vec2[3];
                vertices[0] = new Vec2(-0.1f, 0.0f);
                vertices[1] = new Vec2(0.1f, 0.0f);
                vertices[2] = new Vec2(0.0f, 1.5f);
                m_polygons[1] = new PolygonShape();
                m_polygons[1].set(vertices, 3);
            }

            {
                float w = 1.0f;
                float b = w/(2.0f + MathUtils.sqrt(2.0f));
                float s = MathUtils.sqrt(2.0f)*b;

                Vec2[] vertices = new Vec2[8];
                vertices[0] = new Vec2(0.5f*s, 0.0f);
                vertices[1] = new Vec2(0.5f*w, b);
                vertices[2] = new Vec2(0.5f*w, b + s);
                vertices[3] = new Vec2(0.5f*s, w);
                vertices[4] = new Vec2(-0.5f*s, w);
                vertices[5] = new Vec2(-0.5f*w, b + s);
                vertices[6] = new Vec2(-0.5f*w, b);
                vertices[7] = new Vec2(-0.5f*s, 0.0f);

                m_polygons[2] = new PolygonShape();
                m_polygons[2].set(vertices, 8);
            }

            {
                m_polygons[3] = new PolygonShape();
                m_polygons[3].setAsBox(0.5f, 0.5f);
            }

            {
                m_circle = new CircleShape();
                m_circle.m_radius = 0.5f;
            }

            m_bodyIndex = 0;
        }
Exemple #15
0
        public override void initTest(bool argDeserialized)
        {
            if (argDeserialized)
            {
                return;
            }
            Body ground = null;
            {
                BodyDef bd = new BodyDef();
                ground = getWorld().createBody(bd);

                EdgeShape shape = new EdgeShape();
                shape.set(new Vec2(-40.0f, 0.0f), new Vec2(40.0f, 0.0f));
                ground.createFixture(shape, 0.0f);
            }

            {
                PolygonShape shape = new PolygonShape();
                shape.setAsBox(0.5f, 0.125f);

                FixtureDef fd = new FixtureDef();
                fd.shape = shape;
                fd.density = 20.0f;

                WeldJointDef jd = new WeldJointDef();

                Body prevBody = ground;
                for (int i = 0; i < e_count; ++i)
                {
                    BodyDef bd = new BodyDef();
                    bd.type = BodyType.DYNAMIC;
                    bd.position.set(-14.5f + 1.0f*i, 5.0f);
                    Body body = getWorld().createBody(bd);
                    body.createFixture(fd);

                    Vec2 anchor = new Vec2(-15.0f + 1.0f*i, 5.0f);
                    jd.initialize(prevBody, body, anchor);
                    getWorld().createJoint(jd);

                    prevBody = body;
                }
            }

            {
                PolygonShape shape = new PolygonShape();
                shape.setAsBox(1f, 0.125f);

                FixtureDef fd = new FixtureDef();
                fd.shape = shape;
                fd.density = 20.0f;

                WeldJointDef jd = new WeldJointDef();
                jd.frequencyHz = 5f;
                jd.dampingRatio = .7f;

                Body prevBody = ground;
                for (int i = 0; i < 3; ++i)
                {
                    BodyDef bd = new BodyDef();
                    bd.type = BodyType.DYNAMIC;
                    bd.position.set(-14.0f + 2.0f*i, 15.0f);
                    Body body = getWorld().createBody(bd);
                    body.createFixture(fd);

                    Vec2 anchor = new Vec2(-15.0f + 2.0f*i, 15.0f);
                    jd.initialize(prevBody, body, anchor);
                    getWorld().createJoint(jd);

                    prevBody = body;
                }
            }

            {
                PolygonShape shape = new PolygonShape();
                shape.setAsBox(0.5f, 0.125f);

                FixtureDef fd = new FixtureDef();
                fd.shape = shape;
                fd.density = 20.0f;

                WeldJointDef jd = new WeldJointDef();

                Body prevBody = ground;
                for (int i = 0; i < e_count; ++i)
                {
                    BodyDef bd = new BodyDef();
                    bd.type = BodyType.DYNAMIC;
                    bd.position.set(-4.5f + 1.0f*i, 5.0f);
                    Body body = getWorld().createBody(bd);
                    body.createFixture(fd);

                    if (i > 0)
                    {
                        Vec2 anchor = new Vec2(-5.0f + 1.0f*i, 5.0f);
                        jd.initialize(prevBody, body, anchor);
                        getWorld().createJoint(jd);
                    }

                    prevBody = body;
                }
            }

            {
                PolygonShape shape = new PolygonShape();
                shape.setAsBox(0.5f, 0.125f);

                FixtureDef fd = new FixtureDef();
                fd.shape = shape;
                fd.density = 20.0f;

                WeldJointDef jd = new WeldJointDef();
                jd.frequencyHz = 8f;
                jd.dampingRatio = .7f;

                Body prevBody = ground;
                for (int i = 0; i < e_count; ++i)
                {
                    BodyDef bd = new BodyDef();
                    bd.type = BodyType.DYNAMIC;
                    bd.position.set(5.5f + 1.0f*i, 10.0f);
                    Body body = getWorld().createBody(bd);
                    body.createFixture(fd);

                    if (i > 0)
                    {
                        Vec2 anchor = new Vec2(5.0f + 1.0f*i, 10.0f);
                        jd.initialize(prevBody, body, anchor);
                        getWorld().createJoint(jd);
                    }

                    prevBody = body;
                }
            }

            for (int i = 0; i < 2; ++i)
            {
                Vec2[] vertices = new Vec2[3];
                vertices[0] = new Vec2(-0.5f, 0.0f);
                vertices[1] = new Vec2(0.5f, 0.0f);
                vertices[2] = new Vec2(0.0f, 1.5f);

                PolygonShape shape = new PolygonShape();
                shape.set(vertices, 3);

                FixtureDef fd = new FixtureDef();
                fd.shape = shape;
                fd.density = 1.0f;

                BodyDef bd = new BodyDef();
                bd.type = BodyType.DYNAMIC;
                bd.position.set(-8.0f + 8.0f*i, 12.0f);
                Body body = getWorld().createBody(bd);
                body.createFixture(fd);
            }

            for (int i = 0; i < 2; ++i)
            {
                CircleShape shape = new CircleShape();
                shape.m_radius = 0.5f;

                FixtureDef fd = new FixtureDef();
                fd.shape = shape;
                fd.density = 1.0f;

                BodyDef bd = new BodyDef();
                bd.type = BodyType.DYNAMIC;
                bd.position.set(-6.0f + 6.0f*i, 10.0f);
                Body body = getWorld().createBody(bd);
                body.createFixture(fd);
            }
        }
Exemple #16
0
        public override void initTest(bool deserialized)
        {
            if (deserialized)
            {
                return;
            }
            m_hz = 4.0f;
            m_zeta = 0.7f;
            m_speed = 50.0f;

            Body ground = null;
            {
                BodyDef bd = new BodyDef();
                ground = m_world.createBody(bd);

                EdgeShape shape = new EdgeShape();

                FixtureDef fd = new FixtureDef();
                fd.shape = shape;
                fd.density = 0.0f;
                fd.friction = 0.6f;

                shape.set(new Vec2(-20.0f, 0.0f), new Vec2(20.0f, 0.0f));
                ground.createFixture(fd);

                float[] hs = {0.25f, 1.0f, 4.0f, 0.0f, 0.0f, -1.0f, -2.0f, -2.0f, -1.25f, 0.0f};

                float x = 20.0f, y1 = 0.0f, dx = 5.0f;

                for (int i = 0; i < 10; ++i)
                {
                    float y2 = hs[i];
                    shape.set(new Vec2(x, y1), new Vec2(x + dx, y2));
                    ground.createFixture(fd);
                    y1 = y2;
                    x += dx;
                }

                for (int i = 0; i < 10; ++i)
                {
                    float y2 = hs[i];
                    shape.set(new Vec2(x, y1), new Vec2(x + dx, y2));
                    ground.createFixture(fd);
                    y1 = y2;
                    x += dx;
                }

                shape.set(new Vec2(x, 0.0f), new Vec2(x + 40.0f, 0.0f));
                ground.createFixture(fd);

                x += 80.0f;
                shape.set(new Vec2(x, 0.0f), new Vec2(x + 40.0f, 0.0f));
                ground.createFixture(fd);

                x += 40.0f;
                shape.set(new Vec2(x, 0.0f), new Vec2(x + 10.0f, 5.0f));
                ground.createFixture(fd);

                x += 20.0f;
                shape.set(new Vec2(x, 0.0f), new Vec2(x + 40.0f, 0.0f));
                ground.createFixture(fd);

                x += 40.0f;
                shape.set(new Vec2(x, 0.0f), new Vec2(x, 20.0f));
                ground.createFixture(fd);
            }

            // Teeter
            {
                BodyDef bd = new BodyDef();
                bd.position.set(140.0f, 1.0f);
                bd.type = BodyType.DYNAMIC;
                Body body = m_world.createBody(bd);

                PolygonShape box = new PolygonShape();
                box.setAsBox(10.0f, 0.25f);
                body.createFixture(box, 1.0f);

                RevoluteJointDef jd = new RevoluteJointDef();
                jd.initialize(ground, body, body.getPosition());
                jd.lowerAngle = -8.0f*MathUtils.PI/180.0f;
                jd.upperAngle = 8.0f*MathUtils.PI/180.0f;
                jd.enableLimit = true;
                m_world.createJoint(jd);

                body.applyAngularImpulse(100.0f);
            }

            // Bridge
            {
                int N = 20;
                PolygonShape shape = new PolygonShape();
                shape.setAsBox(1.0f, 0.125f);

                FixtureDef fd = new FixtureDef();
                fd.shape = shape;
                fd.density = 1.0f;
                fd.friction = 0.6f;

                RevoluteJointDef jd = new RevoluteJointDef();

                Body prevBody = ground;
                for (int i = 0; i < N; ++i)
                {
                    BodyDef bd = new BodyDef();
                    bd.type = BodyType.DYNAMIC;
                    bd.position.set(161.0f + 2.0f*i, -0.125f);
                    Body body = m_world.createBody(bd);
                    body.createFixture(fd);

                    Vec2 anchor = new Vec2(160.0f + 2.0f*i, -0.125f);
                    jd.initialize(prevBody, body, anchor);
                    m_world.createJoint(jd);

                    prevBody = body;
                }

                Vec2 anchor2 = new Vec2(160.0f + 2.0f*N, -0.125f);
                jd.initialize(prevBody, ground, anchor2);
                m_world.createJoint(jd);
            }

            // Boxes
            {
                PolygonShape box = new PolygonShape();
                box.setAsBox(0.5f, 0.5f);

                Body body = null;
                BodyDef bd = new BodyDef();
                bd.type = BodyType.DYNAMIC;

                bd.position.set(230.0f, 0.5f);
                body = m_world.createBody(bd);
                body.createFixture(box, 0.5f);

                bd.position.set(230.0f, 1.5f);
                body = m_world.createBody(bd);
                body.createFixture(box, 0.5f);

                bd.position.set(230.0f, 2.5f);
                body = m_world.createBody(bd);
                body.createFixture(box, 0.5f);

                bd.position.set(230.0f, 3.5f);
                body = m_world.createBody(bd);
                body.createFixture(box, 0.5f);

                bd.position.set(230.0f, 4.5f);
                body = m_world.createBody(bd);
                body.createFixture(box, 0.5f);
            }

            // Car
            {
                PolygonShape chassis = new PolygonShape();
                Vec2[] vertices = new Vec2[8];
                vertices[0] = new Vec2(-1.5f, -0.5f);
                vertices[1] = new Vec2(1.5f, -0.5f);
                vertices[2] = new Vec2(1.5f, 0.0f);
                vertices[3] = new Vec2(0.0f, 0.9f);
                vertices[4] = new Vec2(-1.15f, 0.9f);
                vertices[5] = new Vec2(-1.5f, 0.2f);
                chassis.set(vertices, 6);

                CircleShape circle = new CircleShape();
                circle.m_radius = 0.4f;

                BodyDef bd = new BodyDef();
                bd.type = BodyType.DYNAMIC;
                bd.position.set(0.0f, 1.0f);
                m_car = m_world.createBody(bd);
                m_car.createFixture(chassis, 1.0f);

                FixtureDef fd = new FixtureDef();
                fd.shape = circle;
                fd.density = 1.0f;
                fd.friction = 0.9f;

                bd.position.set(-1.0f, 0.35f);
                m_wheel1 = m_world.createBody(bd);
                m_wheel1.createFixture(fd);

                bd.position.set(1.0f, 0.4f);
                m_wheel2 = m_world.createBody(bd);
                m_wheel2.createFixture(fd);

                WheelJointDef jd = new WheelJointDef();
                Vec2 axis = new Vec2(0.0f, 1.0f);

                jd.initialize(m_car, m_wheel1, m_wheel1.getPosition(), axis);
                jd.motorSpeed = 0.0f;
                jd.maxMotorTorque = 20.0f;
                jd.enableMotor = true;
                jd.frequencyHz = m_hz;
                jd.dampingRatio = m_zeta;
                m_spring1 = (WheelJoint) m_world.createJoint(jd);

                jd.initialize(m_car, m_wheel2, m_wheel2.getPosition(), axis);
                jd.motorSpeed = 0.0f;
                jd.maxMotorTorque = 10.0f;
                jd.enableMotor = false;
                jd.frequencyHz = m_hz;
                jd.dampingRatio = m_zeta;
                m_spring2 = (WheelJoint) m_world.createJoint(jd);
            }
        }
Exemple #17
0
        public override void initTest(bool argDeserialized)
        {
            if (argDeserialized)
            {
                return;
            }

            Body leftWall = null;
            Body rightWall = null;
            {
                // Ground
                PolygonShape sd = new PolygonShape();
                sd.setAsBox(50.0f, 10.0f);
                BodyDef bd = new BodyDef();
                bd.type = BodyType.STATIC;
                bd.position = new Vec2(0.0f, -10.0f);
                Body b = getWorld().createBody(bd);
                FixtureDef fd = new FixtureDef();
                fd.shape = sd;
                fd.friction = 1.0f;
                b.createFixture(fd);

                // Walls
                sd.setAsBox(3.0f, 50.0f);
                bd = new BodyDef();
                bd.position = new Vec2(45.0f, 25.0f);
                rightWall = getWorld().createBody(bd);
                rightWall.createFixture(sd, 0);
                bd.position = new Vec2(-45.0f, 25.0f);
                leftWall = getWorld().createBody(bd);
                leftWall.createFixture(sd, 0);

                // Corners
                bd = new BodyDef();
                sd.setAsBox(20.0f, 3.0f);
                bd.angle = (float) (-System.Math.PI/4.0);
                bd.position = new Vec2(-35f, 8.0f);
                Body myBod = getWorld().createBody(bd);
                myBod.createFixture(sd, 0);
                bd.angle = (float) (System.Math.PI/4.0);
                bd.position = new Vec2(35f, 8.0f);
                myBod = getWorld().createBody(bd);
                myBod.createFixture(sd, 0);

                // top
                sd.setAsBox(50.0f, 10.0f);
                bd.type = BodyType.STATIC;
                bd.angle = 0;
                bd.position = new Vec2(0.0f, 75.0f);
                b = getWorld().createBody(bd);
                fd.shape = sd;
                fd.friction = 1.0f;
                b.createFixture(fd);

            }

            CircleShape cd;
            FixtureDef fd2 = new FixtureDef();

            BodyDef bd2 = new BodyDef();
            bd2.type = BodyType.DYNAMIC;
            int numPieces = 5;
            float radius = 6f;
            bd2.position = new Vec2(0.0f, 10.0f);
            Body body = getWorld().createBody(bd2);
            for (int i = 0; i < numPieces; i++)
            {
                cd = new CircleShape();
                cd.m_radius = 1.2f;
                fd2.shape = cd;
                fd2.density = 25;
                fd2.friction = .1f;
                fd2.restitution = .9f;
                float xPos = radius*(float) System.Math.Cos(2f*System.Math.PI*(i/(float) (numPieces)));
                float yPos = radius*(float) System.Math.Sin(2f*System.Math.PI*(i/(float) (numPieces)));
                cd.m_p.set(xPos, yPos);

                body.createFixture(fd2);
            }

            body.setBullet(false);

            RevoluteJointDef rjd = new RevoluteJointDef();
            rjd.initialize(body, getGroundBody(), body.getPosition());
            rjd.motorSpeed = MathUtils.PI;
            rjd.maxMotorTorque = 1000000.0f;
            rjd.enableMotor = true;
            joint = (RevoluteJoint) getWorld().createJoint(rjd);

            {
                int loadSize = 41;

                for (int j = 0; j < 15; j++)
                {
                    for (int i = 0; i < loadSize; i++)
                    {
                        CircleShape circ = new CircleShape();
                        BodyDef bod = new BodyDef();
                        bod.type = BodyType.DYNAMIC;
                        circ.m_radius = 1.0f + (i%2 == 0 ? 1.0f : -1.0f)*.5f*MathUtils.randomFloat(.5f, 1f);
                        FixtureDef fd3 = new FixtureDef();
                        fd3.shape = circ;
                        fd3.density = circ.m_radius*1.5f;
                        fd3.friction = 0.5f;
                        fd3.restitution = 0.7f;
                        float xPos = -39f + 2*i;
                        float yPos = 50f + j;
                        bod.position = new Vec2(xPos, yPos);
                        Body myBody = getWorld().createBody(bod);
                        myBody.createFixture(fd3);

                    }
                }

            }

            getWorld().setGravity(new Vec2(0, -50));
        }
Exemple #18
0
        public override void initTest(bool deserialized)
        {
            //m_state = State.e_unknown;
            if (deserialized)
            {
                return;
            }
            // Ground
            {
                BodyDef bd = new BodyDef();
                Body ground = getWorld().createBody(bd);

                EdgeShape shape = new EdgeShape();
                shape.set(new Vec2(-20.0f, 0.0f), new Vec2(20.0f, 0.0f));
                ground.createFixture(shape, 0.0f);
            }

            // Platform
            {
                BodyDef bd = new BodyDef();
                bd.position.set(0.0f, 10.0f);
                Body body = getWorld().createBody(bd);

                PolygonShape shape = new PolygonShape();
                shape.setAsBox(3.0f, 0.5f);
                m_platform = body.createFixture(shape, 0.0f);

                //m_bottom = 10.0f - 0.5f;
                m_top = 10.0f + 0.5f;
            }

            // Actor
            {
                BodyDef bd = new BodyDef();
                bd.type = BodyType.DYNAMIC;
                bd.position.set(0.0f, 12.0f);
                Body body = getWorld().createBody(bd);

                m_radius = 0.5f;
                CircleShape shape = new CircleShape();
                shape.m_radius = m_radius;
                m_character = body.createFixture(shape, 20.0f);

                body.setLinearVelocity(new Vec2(0.0f, -50.0f));

                //m_state = State.e_unknown;
            }
        }
        public override void initTest(bool deserialized)
        {
            if (deserialized)
            {
                return;
            }
            // Ground body
            {
                BodyDef bd = new BodyDef();
                Body ground = getWorld().createBody(bd);

                EdgeShape shape = new EdgeShape();
                shape.set(new Vec2(-20.0f, 0.0f), new Vec2(20.0f, 0.0f));
                ground.createFixture(shape, 0.0f);
            }

            // Collinear edges
            // This shows the problematic case where a box shape can hit
            // an internal vertex.
            {
                BodyDef bd = new BodyDef();
                Body ground = getWorld().createBody(bd);

                EdgeShape shape = new EdgeShape();
                shape.m_radius = 0.0f;
                shape.set(new Vec2(-8.0f, 1.0f), new Vec2(-6.0f, 1.0f));
                ground.createFixture(shape, 0.0f);
                shape.set(new Vec2(-6.0f, 1.0f), new Vec2(-4.0f, 1.0f));
                ground.createFixture(shape, 0.0f);
                shape.set(new Vec2(-4.0f, 1.0f), new Vec2(-2.0f, 1.0f));
                ground.createFixture(shape, 0.0f);
            }

            // Chain shape
            {
                BodyDef bd = new BodyDef();
                bd.angle = 0.25f*MathUtils.PI;
                Body ground = getWorld().createBody(bd);

                Vec2[] vs = new Vec2[4];
                vs[0] = new Vec2(5.0f, 7.0f);
                vs[1] = new Vec2(6.0f, 8.0f);
                vs[2] = new Vec2(7.0f, 8.0f);
                vs[3] = new Vec2(8.0f, 7.0f);
                ChainShape shape = new ChainShape();
                shape.createChain(vs, 4);
                ground.createFixture(shape, 0.0f);
            }

            // Square tiles. This shows that adjacency shapes may
            // have non-smooth collision. There is no solution
            // to this problem.
            {
                BodyDef bd = new BodyDef();
                Body ground = getWorld().createBody(bd);

                PolygonShape shape = new PolygonShape();
                shape.setAsBox(1.0f, 1.0f, new Vec2(4.0f, 3.0f), 0.0f);
                ground.createFixture(shape, 0.0f);
                shape.setAsBox(1.0f, 1.0f, new Vec2(6.0f, 3.0f), 0.0f);
                ground.createFixture(shape, 0.0f);
                shape.setAsBox(1.0f, 1.0f, new Vec2(8.0f, 3.0f), 0.0f);
                ground.createFixture(shape, 0.0f);
            }

            // Square made from an edge loop. Collision should be smooth.
            {
                BodyDef bd = new BodyDef();
                Body ground = m_world.createBody(bd);

                Vec2[] vs = new Vec2[4];
                vs[0] = new Vec2(-1.0f, 3.0f);
                vs[1] = new Vec2(1.0f, 3.0f);
                vs[2] = new Vec2(1.0f, 5.0f);
                vs[3] = new Vec2(-1.0f, 5.0f);
                ChainShape shape = new ChainShape();
                shape.createLoop(vs, 4);
                ground.createFixture(shape, 0.0f);
            }

            // Edge loop. Collision should be smooth.
            {
                BodyDef bd = new BodyDef();
                bd.position.set(-10.0f, 4.0f);
                Body ground = getWorld().createBody(bd);

                Vec2[] vs = new Vec2[10];
                vs[0] = new Vec2(0.0f, 0.0f);
                vs[1] = new Vec2(6.0f, 0.0f);
                vs[2] = new Vec2(6.0f, 2.0f);
                vs[3] = new Vec2(4.0f, 1.0f);
                vs[4] = new Vec2(2.0f, 2.0f);
                vs[5] = new Vec2(0.0f, 2.0f);
                vs[6] = new Vec2(-2.0f, 2.0f);
                vs[7] = new Vec2(-4.0f, 3.0f);
                vs[8] = new Vec2(-6.0f, 2.0f);
                vs[9] = new Vec2(-6.0f, 0.0f);
                ChainShape shape = new ChainShape();
                shape.createLoop(vs, 10);
                ground.createFixture(shape, 0.0f);
            }

            // Square character 1
            {
                BodyDef bd = new BodyDef();
                bd.position.set(-3.0f, 8.0f);
                bd.type = BodyType.DYNAMIC;
                bd.fixedRotation = true;
                bd.allowSleep = false;

                Body body = getWorld().createBody(bd);

                PolygonShape shape = new PolygonShape();
                shape.setAsBox(0.5f, 0.5f);

                FixtureDef fd = new FixtureDef();
                fd.shape = shape;
                fd.density = 20.0f;
                body.createFixture(fd);
            }

            // Square character 2
            {
                BodyDef bd = new BodyDef();
                bd.position.set(-5.0f, 5.0f);
                bd.type = BodyType.DYNAMIC;
                bd.fixedRotation = true;
                bd.allowSleep = false;

                Body body = getWorld().createBody(bd);

                PolygonShape shape = new PolygonShape();
                shape.setAsBox(0.25f, 0.25f);

                FixtureDef fd = new FixtureDef();
                fd.shape = shape;
                fd.density = 20.0f;
                body.createFixture(fd);
            }

            // Hexagon character
            {
                BodyDef bd = new BodyDef();
                bd.position.set(-5.0f, 8.0f);
                bd.type = BodyType.DYNAMIC;
                bd.fixedRotation = true;
                bd.allowSleep = false;

                Body body = getWorld().createBody(bd);

                float angle = 0.0f;
                float delta = MathUtils.PI/3.0f;
                Vec2[] vertices = new Vec2[6];
                for (int i = 0; i < 6; ++i)
                {
                    vertices[i] = new Vec2(0.5f*MathUtils.cos(angle), 0.5f*MathUtils.sin(angle));
                    angle += delta;
                }

                PolygonShape shape = new PolygonShape();
                shape.set(vertices, 6);

                FixtureDef fd = new FixtureDef();
                fd.shape = shape;
                fd.density = 20.0f;
                body.createFixture(fd);
            }

            // Circle character
            {
                BodyDef bd = new BodyDef();
                bd.position.set(3.0f, 5.0f);
                bd.type = BodyType.DYNAMIC;
                bd.fixedRotation = true;
                bd.allowSleep = false;

                Body body = getWorld().createBody(bd);

                CircleShape shape = new CircleShape();
                shape.m_radius = 0.5f;

                FixtureDef fd = new FixtureDef();
                fd.shape = shape;
                fd.density = 20.0f;
                body.createFixture(fd);
            }

            // Circle character
            {
                BodyDef bd = new BodyDef();
                bd.position.set(-7.0f, 6.0f);
                bd.type = BodyType.DYNAMIC;
                bd.allowSleep = false;

                m_character = getWorld().createBody(bd);

                CircleShape shape = new CircleShape();
                shape.m_radius = 0.25f;

                FixtureDef fd = new FixtureDef();
                fd.shape = shape;
                fd.density = 20.0f;
                fd.friction = 1;
                m_character.createFixture(fd);
            }
        }
Exemple #20
0
        private void launchBomb(Vec2 position, Vec2 velocity)
        {
            if (bomb != null)
            {
                m_world.destroyBody(bomb);
                bomb = null;
            }
            // todo optimize this
            BodyDef bd = new BodyDef();
            bd.type = BodyType.DYNAMIC;
            bd.position.set(position);
            bd.bullet = true;
            bomb = m_world.createBody(bd);
            bomb.setLinearVelocity(velocity);

            CircleShape circle = new CircleShape();
            circle.m_radius = 0.3f;

            FixtureDef fd = new FixtureDef();
            fd.shape = circle;
            fd.density = 20f;
            fd.restitution = 0;

            Vec2 minV = new Vec2(position);
            Vec2 maxV = new Vec2(position);

            minV.subLocal(new Vec2(.3f, .3f));
            maxV.addLocal(new Vec2(.3f, .3f));

            aabb.lowerBound.set(minV);
            aabb.upperBound.set(maxV);

            bomb.createFixture(fd);
        }
Exemple #21
0
        public override void initTest(bool argDeserialized)
        {
            if (argDeserialized)
            {
                return;
            }
            {
                BodyDef bd = new BodyDef();
                Body ground = getWorld().createBody(bd);

                EdgeShape shape = new EdgeShape();

                // Floor
                shape.set(new Vec2(-10.0f, 0.0f), new Vec2(10.0f, 0.0f));
                ground.createFixture(shape, 0.0f);

                // Left wall
                shape.set(new Vec2(-10.0f, 0.0f), new Vec2(-10.0f, 20.0f));
                ground.createFixture(shape, 0.0f);

                // Right wall
                shape.set(new Vec2(10.0f, 0.0f), new Vec2(10.0f, 20.0f));
                ground.createFixture(shape, 0.0f);

                // Roof
                shape.set(new Vec2(-10.0f, 20.0f), new Vec2(10.0f, 20.0f));
                ground.createFixture(shape, 0.0f);
            }

            float radius = 0.5f;
            CircleShape shape2 = new CircleShape();
            shape2.m_p.setZero();
            shape2.m_radius = radius;

            FixtureDef fd = new FixtureDef();
            fd.shape = shape2;
            fd.density = 1.0f;
            fd.friction = 0.1f;

            for (int j = 0; j < e_columnCount; ++j)
            {
                for (int i = 0; i < e_rowCount; ++i)
                {
                    BodyDef bd = new BodyDef();
                    bd.type = BodyType.DYNAMIC;
                    bd.position.set(-10.0f + (2.1f*j + 1.0f + 0.01f*i)*radius, (2.0f*i + 1.0f)*radius);
                    Body body = getWorld().createBody(bd);

                    body.createFixture(fd);
                }
            }

            getWorld().setGravity(new Vec2(0.0f, 0.0f));
        }
Exemple #22
0
        public override void initTest(bool argDeserialized)
        {
            {
                BodyDef bd = new BodyDef();
                bd.position.set(0.0f, 0.0f);
                Body body = getWorld().createBody(bd);

                EdgeShape shape = new EdgeShape();

                shape.set(new Vec2(-10.0f, 0.0f), new Vec2(10.0f, 0.0f));
                body.createFixture(shape, 0.0f);

                PolygonShape pshape = new PolygonShape();
                pshape.setAsBox(0.2f, 1.0f, new Vec2(0.5f, 1.0f), 0.0f);
                body.createFixture(pshape, 0.0f);
            }
            m_poly = new PolygonShape();
            m_poly.setAsBox(2.0f, 0.1f);
            m_circle = new CircleShape();
            m_circle.m_p.setZero();
            m_circle.m_radius = 0.5f;

            BodyDef bd2 = new BodyDef();
            bd2.type = BodyType.DYNAMIC;
            bd2.position.set(0.0f, 20.0f);

            m_body = getWorld().createBody(bd2);
            currFixture = m_body.createFixture(m_poly, 1.0f);

            m_angularVelocity = (float) _random.NextDouble()*100 - 50;
            m_angularVelocity = 33.468121f;
            m_body.setLinearVelocity(new Vec2(0.0f, -100.0f));
            m_body.setAngularVelocity(m_angularVelocity);

            TimeOfImpact.toiCalls = 0;
            TimeOfImpact.toiIters = 0;
            TimeOfImpact.toiMaxIters = 0;
            TimeOfImpact.toiRootIters = 0;
            TimeOfImpact.toiMaxRootIters = 0;
        }
Exemple #23
0
        public override void initTest(bool deserialized)
        {
            for (int i = 0; i < m_touching.Length; i++)
            {
                m_touching[i] = new BoolWrapper();
            }

            {
                BodyDef bd = new BodyDef();
                Body ground = getWorld().createBody(bd);

                {
                    EdgeShape shape = new EdgeShape();
                    shape.set(new Vec2(-40.0f, 0.0f), new Vec2(40.0f, 0.0f));
                    ground.createFixture(shape, 0.0f);
                }

                {
                    CircleShape shape = new CircleShape();
                    shape.m_radius = 5.0f;
                    shape.m_p.set(0.0f, 10.0f);

                    FixtureDef fd = new FixtureDef();
                    fd.shape = shape;
                    fd._isSensor = true;
                    m_sensor = ground.createFixture(fd);
                }
            }

            {
                CircleShape shape = new CircleShape();
                shape.m_radius = 1.0f;

                for (int i = 0; i < _e_count; ++i)
                {
                    BodyDef bd = new BodyDef();
                    bd.type = BodyType.DYNAMIC;
                    bd.position.set(-10.0f + 3.0f*i, 20.0f);
                    bd.userData = m_touching[i];

                    m_touching[i].tf = false;
                    m_bodies[i] = getWorld().createBody(bd);

                    m_bodies[i].createFixture(shape, 1.0f);
                }
            }
        }
Exemple #24
0
        public override void initTest(bool deserialized)
        {
            if (deserialized)
            {
                return;
            }
            Body ground = null;
            {
                BodyDef bd = new BodyDef();
                ground = getWorld().createBody(bd);

                EdgeShape shape = new EdgeShape();
                shape.set(new Vec2(-40.0f, 0.0f), new Vec2(40.0f, 0.0f));
                ground.createFixture(shape, 0.0f);
            }

            {
                CircleShape shape = new CircleShape();
                shape.m_radius = 0.5f;

                BodyDef bd = new BodyDef();
                bd.type = BodyType.DYNAMIC;

                RevoluteJointDef rjd = new RevoluteJointDef();

                bd.position.set(-10f, 20.0f);
                Body body = getWorld().createBody(bd);
                body.createFixture(shape, 5.0f);

                float w = 100.0f;
                body.setAngularVelocity(w);
                body.setLinearVelocity(new Vec2(-8.0f*w, 0.0f));

                rjd.initialize(ground, body, new Vec2(-10.0f, 12.0f));
                rjd.motorSpeed = -1.0f*MathUtils.PI;
                rjd.maxMotorTorque = 10000.0f;
                rjd.enableMotor = false;
                rjd.lowerAngle = -0.25f*MathUtils.PI;
                rjd.upperAngle = 0.5f*MathUtils.PI;
                rjd.enableLimit = true;
                rjd.collideConnected = true;

                m_joint = (RevoluteJoint) getWorld().createJoint(rjd);
            }

            {
                CircleShape circle_shape = new CircleShape();
                circle_shape.m_radius = 3.0f;

                BodyDef circle_bd = new BodyDef();
                circle_bd.type = BodyType.DYNAMIC;
                circle_bd.position.set(5.0f, 30.0f);

                FixtureDef fd = new FixtureDef();
                fd.density = 5.0f;
                fd.filter.maskBits = 1;
                fd.shape = circle_shape;

                Body ball = m_world.createBody(circle_bd);
                ball.createFixture(fd);

                PolygonShape polygon_shape = new PolygonShape();
                polygon_shape.setAsBox(10.0f, 0.2f, new Vec2(-10.0f, 0.0f), 0.0f);

                BodyDef polygon_bd = new BodyDef();
                polygon_bd.position.set(20.0f, 10.0f);
                polygon_bd.type = BodyType.DYNAMIC;
                polygon_bd.bullet = true;
                Body polygon_body = m_world.createBody(polygon_bd);
                polygon_body.createFixture(polygon_shape, 2.0f);

                RevoluteJointDef rjd = new RevoluteJointDef();
                rjd.initialize(ground, polygon_body, new Vec2(20.0f, 10.0f));
                rjd.lowerAngle = -0.25f*MathUtils.PI;
                rjd.upperAngle = 0.0f*MathUtils.PI;
                rjd.enableLimit = true;
                m_world.createJoint(rjd);
            }

            // Tests mass computation of a small object far from the origin
            {
                BodyDef bodyDef = new BodyDef();
                bodyDef.type = BodyType.DYNAMIC;
                Body body = m_world.createBody(bodyDef);

                PolygonShape polyShape = new PolygonShape();
                Vec2[] verts = new Vec2[3];
                verts[0] = new Vec2(17.63f, 36.31f);
                verts[1] = new Vec2(17.52f, 36.69f);
                verts[2] = new Vec2(17.19f, 36.36f);
                polyShape.set(verts, 3);

                FixtureDef polyFixtureDef = new FixtureDef();
                polyFixtureDef.shape = polyShape;
                polyFixtureDef.density = 1;

                body.createFixture(polyFixtureDef); // assertion hits inside here
            }
        }
Exemple #25
0
        public override void keyPressed(char argKeyChar, int argKeyCode)
        {
            switch (argKeyChar)
            {
                case ',':
                    if (m_bullet != null)
                    {
                        getWorld().destroyBody(m_bullet);
                        m_bullet = null;
                    }

                {
                    CircleShape shape = new CircleShape();
                    shape.m_radius = 0.25f;

                    FixtureDef fd = new FixtureDef();
                    fd.shape = shape;
                    fd.density = 20.0f;
                    fd.restitution = 0.05f;

                    BodyDef bd = new BodyDef();
                    bd.type = BodyType.DYNAMIC;
                    bd.bullet = true;
                    bd.position.set(-31.0f, 5.0f);

                    m_bullet = getWorld().createBody(bd);
                    m_bullet.createFixture(fd);

                    m_bullet.setLinearVelocity(new Vec2(400.0f, 0.0f));
                }
                    break;
            }
        }
Exemple #26
0
        public override void keyPressed(char key, int argKeyCode)
        {
            switch (key)
            {
                case 'c':
                    if (m_fixture2 == null)
                    {
                        CircleShape shape = new CircleShape();
                        shape.m_radius = 3.0f;
                        shape.m_p.set(0.5f, -4.0f);
                        m_fixture2 = m_body.createFixture(shape, 10.0f);
                        m_body.setAwake(true);
                    }
                    break;

                case 'd':
                    if (m_fixture2 != null)
                    {
                        m_body.destroyFixture(m_fixture2);
                        m_fixture2 = null;
                        m_body.setAwake(true);
                    }
                    break;
            }
        }
Exemple #27
0
        public override void initTest(bool argDeserialized)
        {
            if (argDeserialized)
            {
                return;
            }

            m_offset.set(0.0f, 8.0f);
            m_motorSpeed = 2.0f;
            m_motorOn = true;
            Vec2 pivot = new Vec2(0.0f, 0.8f);

            // Ground
            {
                BodyDef bd = new BodyDef();
                Body ground = getWorld().createBody(bd);

                EdgeShape shape = new EdgeShape();
                shape.set(new Vec2(-50.0f, 0.0f), new Vec2(50.0f, 0.0f));
                ground.createFixture(shape, 0.0f);

                shape.set(new Vec2(-50.0f, 0.0f), new Vec2(-50.0f, 10.0f));
                ground.createFixture(shape, 0.0f);

                shape.set(new Vec2(50.0f, 0.0f), new Vec2(50.0f, 10.0f));
                ground.createFixture(shape, 0.0f);
            }

            // Balls
            for (int i = 0; i < 40; ++i)
            {
                CircleShape shape = new CircleShape();
                shape.m_radius = 0.25f;

                BodyDef bd = new BodyDef();
                bd.type = BodyType.DYNAMIC;
                bd.position.set(-40.0f + 2.0f*i, 0.5f);

                Body body = getWorld().createBody(bd);
                body.createFixture(shape, 1.0f);
            }

            // Chassis
            {
                PolygonShape shape = new PolygonShape();
                shape.setAsBox(2.5f, 1.0f);

                FixtureDef sd = new FixtureDef();
                sd.density = 1.0f;
                sd.shape = shape;
                sd.filter.groupIndex = -1;
                BodyDef bd = new BodyDef();
                bd.type = BodyType.DYNAMIC;
                bd.position.set(pivot);
                bd.position.addLocal(m_offset);
                m_chassis = getWorld().createBody(bd);
                m_chassis.createFixture(sd);
            }

            {
                CircleShape shape = new CircleShape();
                shape.m_radius = 1.6f;

                FixtureDef sd = new FixtureDef();
                sd.density = 1.0f;
                sd.shape = shape;
                sd.filter.groupIndex = -1;
                BodyDef bd = new BodyDef();
                bd.type = BodyType.DYNAMIC;
                bd.position.set(pivot);
                bd.position.addLocal(m_offset);
                m_wheel = getWorld().createBody(bd);
                m_wheel.createFixture(sd);
            }

            {
                RevoluteJointDef jd = new RevoluteJointDef();

                jd.initialize(m_wheel, m_chassis, pivot.add(m_offset));
                jd.collideConnected = false;
                jd.motorSpeed = m_motorSpeed;
                jd.maxMotorTorque = 400.0f;
                jd.enableMotor = m_motorOn;
                m_motorJoint = (RevoluteJoint) getWorld().createJoint(jd);
            }

            Vec2 wheelAnchor;

            wheelAnchor = pivot.add(new Vec2(0.0f, -0.8f));

            createLeg(-1.0f, wheelAnchor);
            createLeg(1.0f, wheelAnchor);

            m_wheel.setTransform(m_wheel.getPosition(), 120.0f*MathUtils.PI/180.0f);
            createLeg(-1.0f, wheelAnchor);
            createLeg(1.0f, wheelAnchor);

            m_wheel.setTransform(m_wheel.getPosition(), -120.0f*MathUtils.PI/180.0f);
            createLeg(-1.0f, wheelAnchor);
            createLeg(1.0f, wheelAnchor);
        }
Exemple #28
0
        public override void initTest(bool deserialized)
        {
            {
                BodyDef bd = new BodyDef();
                Body ground = m_world.createBody(bd);

                {
                    PolygonShape shape = new PolygonShape();
                    Vec2[] vertices =
                        new Vec2[] {new Vec2(-40, -10), new Vec2(40, -10), new Vec2(40, 0), new Vec2(-40, 0)};
                    shape.set(vertices, 4);
                    ground.createFixture(shape, 0.0f);
                }

                {
                    PolygonShape shape = new PolygonShape();
                    Vec2[] vertices =
                        new Vec2[] {new Vec2(-40, -1), new Vec2(-20, -1), new Vec2(-20, 20), new Vec2(-40, 30)};
                    shape.set(vertices, 4);
                    ground.createFixture(shape, 0.0f);
                }

                {
                    PolygonShape shape = new PolygonShape();
                    Vec2[] vertices =
                        new Vec2[] {new Vec2(20, -1), new Vec2(40, -1), new Vec2(40, 30), new Vec2(20, 20)};
                    shape.set(vertices, 4);
                    ground.createFixture(shape, 0.0f);
                }
            }

            m_world.setParticleRadius(0.2f);
            {
                PolygonShape shape = new PolygonShape();
                shape.setAsBox(20, 10, new Vec2(0, 10), 0);
                ParticleGroupDef pd = new ParticleGroupDef();
                pd.flags = flags;
                pd.shape = shape;
                m_world.createParticleGroup(pd);
            }

            {
                BodyDef bd = new BodyDef();
                bd.type = BodyType.KINEMATIC;
                Body body = m_world.createBody(bd);
                circle = body;
                CircleShape shape = new CircleShape();
                shape.m_p.set(0, 5);
                shape.m_radius = 1;
                body.createFixture(shape, 0.1f);
                body.setLinearVelocity(new Vec2(-6, 0.0f));
            }

            {
                BodyDef bd = new BodyDef();
                bd.type = BodyType.DYNAMIC;
                Body body = m_world.createBody(bd);
                PolygonShape shape = new PolygonShape();
                shape.setAsBox(1, 1, new Vec2(-10, 5), 0);
                body.createFixture(shape, 0.1f);
            }

            {
                BodyDef bd = new BodyDef();
                bd.type = BodyType.DYNAMIC;
                Body body = m_world.createBody(bd);
                PolygonShape shape = new PolygonShape();
                shape.setAsBox(1, 1, new Vec2(10, 5), 0.5f);
                body.createFixture(shape, 0.1f);
            }

            {
                BodyDef bd = new BodyDef();
                bd.type = BodyType.DYNAMIC;
                Body body = m_world.createBody(bd);
                EdgeShape shape = new EdgeShape();
                shape.set(new Vec2(0, 20), new Vec2(1, 21));
                body.createFixture(shape, 0.1f);
            }

            {
                BodyDef bd = new BodyDef();
                bd.type = BodyType.DYNAMIC;
                Body body = m_world.createBody(bd);
                EdgeShape shape = new EdgeShape();
                shape.set(new Vec2(3, 20), new Vec2(4, 21));
                body.createFixture(shape, 0.1f);
            }

            {
                BodyDef bd = new BodyDef();
                bd.type = BodyType.DYNAMIC;
                Body body = m_world.createBody(bd);
                EdgeShape shape = new EdgeShape();
                shape.set(new Vec2(-3, 21), new Vec2(-2, 20));
                body.createFixture(shape, 0.1f);
            }
        }
Exemple #29
0
        public override void initTest(bool argDeserialized)
        {
            Body ground = null;
            {
                BodyDef bd = new BodyDef();
                ground = getWorld().createBody(bd);

                EdgeShape shape = new EdgeShape();
                shape.set(new Vec2(50.0f, 0.0f), new Vec2(-50.0f, 0.0f));
                ground.createFixture(shape, 0.0f);
            }

            {
                CircleShape circle1 = new CircleShape();
                circle1.m_radius = 1.0f;

                PolygonShape box = new PolygonShape();
                box.setAsBox(0.5f, 5.0f);

                CircleShape circle2 = new CircleShape();
                circle2.m_radius = 2.0f;

                BodyDef bd1 = new BodyDef();
                bd1.type = BodyType.STATIC;
                bd1.position.set(10.0f, 9.0f);
                Body body1 = m_world.createBody(bd1);
                body1.createFixture(circle1, 5.0f);

                BodyDef bd2 = new BodyDef();
                bd2.type = BodyType.DYNAMIC;
                bd2.position.set(10.0f, 8.0f);
                Body body2 = m_world.createBody(bd2);
                body2.createFixture(box, 5.0f);

                BodyDef bd3 = new BodyDef();
                bd3.type = BodyType.DYNAMIC;
                bd3.position.set(10.0f, 6.0f);
                Body body3 = m_world.createBody(bd3);
                body3.createFixture(circle2, 5.0f);

                RevoluteJointDef jd1 = new RevoluteJointDef();
                jd1.initialize(body2, body1, bd1.position);
                Joint joint1 = m_world.createJoint(jd1);

                RevoluteJointDef jd2 = new RevoluteJointDef();
                jd2.initialize(body2, body3, bd3.position);
                Joint joint2 = m_world.createJoint(jd2);

                GearJointDef jd4 = new GearJointDef();
                jd4.bodyA = body1;
                jd4.bodyB = body3;
                jd4.joint1 = joint1;
                jd4.joint2 = joint2;
                jd4.ratio = circle2.m_radius/circle1.m_radius;
                m_world.createJoint(jd4);
            }

            {
                CircleShape circle1 = new CircleShape();
                circle1.m_radius = 1.0f;

                CircleShape circle2 = new CircleShape();
                circle2.m_radius = 2.0f;

                PolygonShape box = new PolygonShape();
                box.setAsBox(0.5f, 5.0f);

                BodyDef bd1 = new BodyDef();
                bd1.type = BodyType.DYNAMIC;
                bd1.position.set(-3.0f, 12.0f);
                Body body1 = m_world.createBody(bd1);
                body1.createFixture(circle1, 5.0f);

                RevoluteJointDef jd1 = new RevoluteJointDef();
                jd1.bodyA = ground;
                jd1.bodyB = body1;
                ground.getLocalPointToOut(bd1.position, ref jd1.localAnchorA);
                body1.getLocalPointToOut(bd1.position, ref jd1.localAnchorB);
                jd1.referenceAngle = body1.getAngle() - ground.getAngle();
                m_joint1 = (RevoluteJoint) m_world.createJoint(jd1);

                BodyDef bd2 = new BodyDef();
                bd2.type = BodyType.DYNAMIC;
                bd2.position.set(0.0f, 12.0f);
                Body body2 = m_world.createBody(bd2);
                body2.createFixture(circle2, 5.0f);

                RevoluteJointDef jd2 = new RevoluteJointDef();
                jd2.initialize(ground, body2, bd2.position);
                m_joint2 = (RevoluteJoint) m_world.createJoint(jd2);

                BodyDef bd3 = new BodyDef();
                bd3.type = BodyType.DYNAMIC;
                bd3.position.set(2.5f, 12.0f);
                Body body3 = m_world.createBody(bd3);
                body3.createFixture(box, 5.0f);

                PrismaticJointDef jd3 = new PrismaticJointDef();
                jd3.initialize(ground, body3, bd3.position, new Vec2(0.0f, 1.0f));
                jd3.lowerTranslation = -5.0f;
                jd3.upperTranslation = 5.0f;
                jd3.enableLimit = true;

                m_joint3 = (PrismaticJoint) m_world.createJoint(jd3);

                GearJointDef jd4 = new GearJointDef();
                jd4.bodyA = body1;
                jd4.bodyB = body2;
                jd4.joint1 = m_joint1;
                jd4.joint2 = m_joint2;
                jd4.ratio = circle2.m_radius/circle1.m_radius;
                m_joint4 = (GearJoint) m_world.createJoint(jd4);

                GearJointDef jd5 = new GearJointDef();
                jd5.bodyA = body2;
                jd5.bodyB = body3;
                jd5.joint1 = m_joint2;
                jd5.joint2 = m_joint3;
                jd5.ratio = 1f/circle2.m_radius;
                m_joint5 = (GearJoint) m_world.createJoint(jd5);
            }
        }
Exemple #30
0
        public override void initTest(bool deserialized)
        {
            if (deserialized)
            {
                return;
            }
            float y = 16.0f;
            float L = 12.0f;
            float a = 1.0f;
            float b = 2.0f;
            Body ground = null;
            {
                BodyDef bd = new BodyDef();
                ground = getWorld().createBody(bd);

                EdgeShape shape = new EdgeShape();
                shape.set(new Vec2(-40.0f, 0.0f), new Vec2(40.0f, 0.0f));
                ground.createFixture(shape, 0.0f);

                CircleShape circle = new CircleShape();
                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);
            }

            {

                PolygonShape shape = new PolygonShape();
                shape.setAsBox(a, b);

                BodyDef bd = new BodyDef();
                bd.type = BodyType.DYNAMIC;

                bd.position.set(-10.0f, y);
                Body body1 = getWorld().createBody(bd);
                body1.createFixture(shape, 5.0f);

                bd.position.set(10.0f, y);
                Body body2 = getWorld().createBody(bd);
                body2.createFixture(shape, 5.0f);

                PulleyJointDef pulleyDef = new PulleyJointDef();
                Vec2 anchor1 = new Vec2(-10.0f, y + b);
                Vec2 anchor2 = new Vec2(10.0f, y + b);
                Vec2 groundAnchor1 = new Vec2(-10.0f, y + b + L);
                Vec2 groundAnchor2 = new Vec2(10.0f, y + b + L);
                pulleyDef.initialize(body1, body2, groundAnchor1, groundAnchor2, anchor1, anchor2, 2.0f);

                m_joint1 = (PulleyJoint) getWorld().createJoint(pulleyDef);
            }
        }