def create_polygon(vertices, world):
    body = world.CreateBody(Box2D.b2BodyDef())

    box = Box2D.b2ChainShape(vertices_loop=vertices)

    fixture = Box2D.b2FixtureDef()
    fixture.shape = box
    fixture.density = 2
    fixture.friction = .3
    fixture.restitution = .5
    fixture = body.CreateFixture(fixture)
    return body, [fixture]
Beispiel #2
0
def add_fixture(b2_world_body, jsw, jsw_fixture):
    """add a fixture to a body

    :param b2_world_body: a body
    :type b2_world_body: b2Body

    :param jsw: dictionary defining all the gropups of data
                in the json file
    :type jsw: dict(sting: variant)

    :param jsw_fixture: a fixture
    :type jsw_fixture: b2Fixture

    """

    # create and fill fixture definition
    fixtureDef = b2.b2FixtureDef()

    # Done with issues:
    ### missing pybox2d "filter" b2BodyDef property

    # special case for rube documentation of
    # "filter-categoryBits": 1, //if not present, interpret as 1
    if "filter-categoryBits" in list(jsw_fixture.keys()):
        setAttr(jsw_fixture, "filter-categoryBits", fixtureDef, "categoryBits")
    else:
        fixtureDef.categoryBits = 1

    # special case for Rube Json property
    # "filter-maskBits": 1, //if not present, interpret as 65535
    if "filter-maskBits" in list(jsw_fixture.keys()):
        setAttr(jsw_fixture, "filter-maskBits", fixtureDef, "maskBits")
    else:
        fixtureDef.maskBits = 65535

    setAttr(jsw_fixture, "density", fixtureDef)
    setAttr(jsw_fixture, "group_index", fixtureDef, "groupIndex")
    setAttr(jsw_fixture, "friction", fixtureDef)
    setAttr(jsw_fixture, "sensor", fixtureDef, "isSensor")
    setAttr(jsw_fixture, "restitution", fixtureDef)

    # fixture has one shape that is
    # polygon, circle or chain in json
    # chain may be open or loop, or edge in pyBox2D
    if "circle" in list(jsw_fixture.keys()):  # works ok
        if jsw_fixture["circle"]["center"] == 0:
            center_b2Vec2 = b2.b2Vec2(0, 0)
        else:
            center_b2Vec2 = rubeVecToB2Vec2(jsw_fixture["circle"]["center"])
        fixtureDef.shape = b2.b2CircleShape(
            pos=center_b2Vec2,
            radius=jsw_fixture["circle"]["radius"],
        )

    if "polygon" in list(jsw_fixture.keys()):  # works ok
        polygon_vertices = rubeVecArrToB2Vec2Arr(
            jsw_fixture["polygon"]["vertices"])
        fixtureDef.shape = b2.b2PolygonShape(vertices=polygon_vertices)

    if "chain" in list(jsw_fixture.keys()):  # works ok
        chain_vertices = rubeVecArrToB2Vec2Arr(
            jsw_fixture["chain"]["vertices"])

        if len(chain_vertices) >= 3:
            # closed-loop b2LoopShape
            # Done
            if "hasNextVertex" in list(jsw_fixture["chain"].keys()):

                # del last vertice to prevent crash from first and last
                # vertices being to close
                del chain_vertices[-1]

                fixtureDef.shape = b2.b2LoopShape(
                    vertices_loop=chain_vertices,
                    count=len(chain_vertices),
                )

                setAttr(
                    jsw_fixture["chain"],
                    "hasNextVertex",
                    fixtureDef.shape,
                    "m_hasNextVertex",
                )
                setB2Vec2Attr(
                    jsw_fixture["chain"],
                    "nextVertex",
                    fixtureDef,
                    "m_nextVertex",
                )

                setAttr(
                    jsw_fixture["chain"],
                    "hasPrevVertex",
                    fixtureDef.shape,
                    "m_hasPrevVertex",
                )
                setB2Vec2Attr(jsw_fixture["chain"], "prevVertex",
                              fixtureDef.shape, "m_prevVertex")

            else:  # open-ended ChainShape
                # Done
                fixtureDef.shape = b2.b2ChainShape(
                    vertices_chain=chain_vertices,
                    count=len(chain_vertices),
                )

        # json chain is b2EdgeShape
        # Done
        if len(chain_vertices) < 3:
            fixtureDef.shape = b2.b2EdgeShape(vertices=chain_vertices, )

    # create fixture
    b2_world_body.CreateFixture(fixtureDef)
def add_fixture(
        b2_world_body,
        jsw,
        jsw_fixture,
        ):
     # create and fill fixture definition
    fixtureDef = b2.b2FixtureDef()

    # Done with issues:
    ### missing pybox2d "filter" b2BodyDef property

    # special case for rube documentation of
    #"filter-categoryBits": 1, //if not present, interpret as 1
    if "filter-categoryBits" in jsw_fixture.keys():
        setAttr(jsw_fixture, "filter-categoryBits", fixtureDef, "categoryBits")
    else:
        fixtureDef.categoryBits = 1

    # special case for Rube Json property
    #"filter-maskBits": 1, //if not present, interpret as 65535
    if "filter-maskBits" in jsw_fixture.keys():
        setAttr(jsw_fixture, "filter-maskBits", fixtureDef, "maskBits")
    else:
        fixtureDef.maskBits = 65535

    setAttr(jsw_fixture, "density", fixtureDef)
    setAttr(jsw_fixture, "filter-groupIndex", fixtureDef, "groupIndex")
    setAttr(jsw_fixture, "friction", fixtureDef)
    setAttr(jsw_fixture, "sensor", fixtureDef, "isSensor")
    setAttr(jsw_fixture, "restitution", fixtureDef)

    # fixture has one shape that is
    # polygon, circle or chain in json
    # chain may be open or loop, or edge in pyBox2D
    if "circle" in jsw_fixture.keys():  # works ok
        if jsw_fixture["circle"]["center"] == 0:
            center_b2Vec2 = b2.b2Vec2(0, 0)
        else:
            center_b2Vec2 = rubeVecToB2Vec2(
                jsw_fixture["circle"]["center"]
                )
        fixtureDef.shape = b2.b2CircleShape(
            pos=center_b2Vec2,
            radius=jsw_fixture["circle"]["radius"],
            )

    if "polygon" in jsw_fixture.keys():  # works ok
        polygon_vertices = rubeVecArrToB2Vec2Arr(
            jsw_fixture["polygon"]["vertices"]
            )
        fixtureDef.shape = b2.b2PolygonShape(vertices=polygon_vertices)

    if "chain" in jsw_fixture.keys():  # works ok
        chain_vertices = rubeVecArrToB2Vec2Arr(
            jsw_fixture["chain"]["vertices"]
            )

        if len(chain_vertices) >= 3:
            # closed-loop b2LoopShape
            # Done
            if "hasNextVertex" in jsw_fixture["chain"].keys():

                # del last vertice to prevent crash from first and last
                # vertices being to close
                del chain_vertices[-1]

                fixtureDef.shape = b2.b2LoopShape(
                    vertices_loop=chain_vertices,
                    count=len(chain_vertices),
                    )

                setAttr(
                    jsw_fixture["chain"],
                    "hasNextVertex",
                    fixtureDef.shape,
                    "m_hasNextVertex",
                    )
                setB2Vec2Attr(
                    jsw_fixture["chain"],
                    "nextVertex",
                    fixtureDef,
                    "m_nextVertex",
                    )

                setAttr(
                    jsw_fixture["chain"],
                    "hasPrevVertex",
                    fixtureDef.shape,
                    "m_hasPrevVertex",
                    )
                setB2Vec2Attr(
                    jsw_fixture["chain"],
                    "prevVertex",
                    fixtureDef.shape,
                    "m_prevVertex"
                    )

            else:  # open-ended ChainShape
                # Done
                fixtureDef.shape = b2.b2ChainShape(
                    vertices_chain=chain_vertices,
                    count=len(chain_vertices),
                    )

        # json chain is b2EdgeShape
        # Done
        if len(chain_vertices) < 3:
            fixtureDef.shape = b2.b2EdgeShape(
                vertices=chain_vertices,
                )

    # create fixture
    b2_world_body.CreateFixture(fixtureDef)