Search in sources :

Example 6 with AABB

use of org.jbox2d.collision.AABB in project libgdx by libgdx.

the class DynamicTreeFlatNodes method drawTree.

public void drawTree(DebugDraw argDraw, int node, int spot, int height) {
    AABB a = m_aabb[node];
    a.getVertices(drawVecs);
    color.set(1, (height - spot) * 1f / height, (height - spot) * 1f / height);
    argDraw.drawPolygon(drawVecs, 4, color);
    argDraw.getViewportTranform().getWorldToScreen(a.upperBound, textVec);
    argDraw.drawString(textVec.x, textVec.y, node + "-" + (spot + 1) + "/" + height, color);
    int c1 = m_child1[node];
    int c2 = m_child2[node];
    if (c1 != NULL_NODE) {
        drawTree(argDraw, c1, spot + 1, height);
    }
    if (c2 != NULL_NODE) {
        drawTree(argDraw, c2, spot + 1, height);
    }
}
Also used : AABB(org.jbox2d.collision.AABB)

Example 7 with AABB

use of org.jbox2d.collision.AABB in project libgdx by libgdx.

the class ParticleSystem method createParticleGroup.

public ParticleGroup createParticleGroup(ParticleGroupDef groupDef) {
    float stride = getParticleStride();
    final Transform identity = tempTransform;
    identity.setIdentity();
    Transform transform = tempTransform2;
    transform.setIdentity();
    int firstIndex = m_count;
    if (groupDef.shape != null) {
        final ParticleDef particleDef = tempParticleDef;
        particleDef.flags = groupDef.flags;
        particleDef.color = groupDef.color;
        particleDef.userData = groupDef.userData;
        Shape shape = groupDef.shape;
        transform.set(groupDef.position, groupDef.angle);
        AABB aabb = temp;
        int childCount = shape.getChildCount();
        for (int childIndex = 0; childIndex < childCount; childIndex++) {
            if (childIndex == 0) {
                shape.computeAABB(aabb, identity, childIndex);
            } else {
                AABB childAABB = temp2;
                shape.computeAABB(childAABB, identity, childIndex);
                aabb.combine(childAABB);
            }
        }
        final float upperBoundY = aabb.upperBound.y;
        final float upperBoundX = aabb.upperBound.x;
        for (float y = MathUtils.floor(aabb.lowerBound.y / stride) * stride; y < upperBoundY; y += stride) {
            for (float x = MathUtils.floor(aabb.lowerBound.x / stride) * stride; x < upperBoundX; x += stride) {
                Vec2 p = tempVec;
                p.x = x;
                p.y = y;
                if (shape.testPoint(identity, p)) {
                    Transform.mulToOut(transform, p, p);
                    particleDef.position.x = p.x;
                    particleDef.position.y = p.y;
                    p.subLocal(groupDef.position);
                    Vec2.crossToOutUnsafe(groupDef.angularVelocity, p, particleDef.velocity);
                    particleDef.velocity.addLocal(groupDef.linearVelocity);
                    createParticle(particleDef);
                }
            }
        }
    }
    int lastIndex = m_count;
    ParticleGroup group = new ParticleGroup();
    group.m_system = this;
    group.m_firstIndex = firstIndex;
    group.m_lastIndex = lastIndex;
    group.m_groupFlags = groupDef.groupFlags;
    group.m_strength = groupDef.strength;
    group.m_userData = groupDef.userData;
    group.m_transform.set(transform);
    group.m_destroyAutomatically = groupDef.destroyAutomatically;
    group.m_prev = null;
    group.m_next = m_groupList;
    if (m_groupList != null) {
        m_groupList.m_prev = group;
    }
    m_groupList = group;
    ++m_groupCount;
    for (int i = firstIndex; i < lastIndex; i++) {
        m_groupBuffer[i] = group;
    }
    updateContacts(true);
    if ((groupDef.flags & k_pairFlags) != 0) {
        for (int k = 0; k < m_contactCount; k++) {
            ParticleContact contact = m_contactBuffer[k];
            int a = contact.indexA;
            int b = contact.indexB;
            if (a > b) {
                int temp = a;
                a = b;
                b = temp;
            }
            if (firstIndex <= a && b < lastIndex) {
                if (m_pairCount >= m_pairCapacity) {
                    int oldCapacity = m_pairCapacity;
                    int newCapacity = m_pairCount != 0 ? 2 * m_pairCount : Settings.minParticleBufferCapacity;
                    m_pairBuffer = BufferUtils.reallocateBuffer(Pair.class, m_pairBuffer, oldCapacity, newCapacity);
                    m_pairCapacity = newCapacity;
                }
                Pair pair = m_pairBuffer[m_pairCount];
                pair.indexA = a;
                pair.indexB = b;
                pair.flags = contact.flags;
                pair.strength = groupDef.strength;
                pair.distance = MathUtils.distance(m_positionBuffer.data[a], m_positionBuffer.data[b]);
                m_pairCount++;
            }
        }
    }
    if ((groupDef.flags & k_triadFlags) != 0) {
        VoronoiDiagram diagram = new VoronoiDiagram(lastIndex - firstIndex);
        for (int i = firstIndex; i < lastIndex; i++) {
            diagram.addGenerator(m_positionBuffer.data[i], i);
        }
        diagram.generate(stride / 2);
        createParticleGroupCallback.system = this;
        createParticleGroupCallback.def = groupDef;
        createParticleGroupCallback.firstIndex = firstIndex;
        diagram.getNodes(createParticleGroupCallback);
    }
    if ((groupDef.groupFlags & ParticleGroupType.b2_solidParticleGroup) != 0) {
        computeDepthForGroup(group);
    }
    return group;
}
Also used : Shape(org.jbox2d.collision.shapes.Shape) Vec2(org.jbox2d.common.Vec2) Transform(org.jbox2d.common.Transform) AABB(org.jbox2d.collision.AABB)

Example 8 with AABB

use of org.jbox2d.collision.AABB in project libgdx by libgdx.

the class ParticleSystem method solveCollision.

public void solveCollision(TimeStep step) {
    final AABB aabb = temp;
    final Vec2 lowerBound = aabb.lowerBound;
    final Vec2 upperBound = aabb.upperBound;
    lowerBound.x = Float.MAX_VALUE;
    lowerBound.y = Float.MAX_VALUE;
    upperBound.x = -Float.MAX_VALUE;
    upperBound.y = -Float.MAX_VALUE;
    for (int i = 0; i < m_count; i++) {
        final Vec2 v = m_velocityBuffer.data[i];
        final Vec2 p1 = m_positionBuffer.data[i];
        final float p1x = p1.x;
        final float p1y = p1.y;
        final float p2x = p1x + step.dt * v.x;
        final float p2y = p1y + step.dt * v.y;
        final float bx = p1x < p2x ? p1x : p2x;
        final float by = p1y < p2y ? p1y : p2y;
        lowerBound.x = lowerBound.x < bx ? lowerBound.x : bx;
        lowerBound.y = lowerBound.y < by ? lowerBound.y : by;
        final float b1x = p1x > p2x ? p1x : p2x;
        final float b1y = p1y > p2y ? p1y : p2y;
        upperBound.x = upperBound.x > b1x ? upperBound.x : b1x;
        upperBound.y = upperBound.y > b1y ? upperBound.y : b1y;
    }
    sccallback.step = step;
    sccallback.system = this;
    m_world.queryAABB(sccallback, aabb);
}
Also used : Vec2(org.jbox2d.common.Vec2) AABB(org.jbox2d.collision.AABB)

Example 9 with AABB

use of org.jbox2d.collision.AABB in project libgdx by libgdx.

the class Fixture method synchronize.

/**
   * Internal method
   * 
   * @param broadPhase
   * @param xf1
   * @param xf2
   */
protected void synchronize(BroadPhase broadPhase, final Transform transform1, final Transform transform2) {
    if (m_proxyCount == 0) {
        return;
    }
    for (int i = 0; i < m_proxyCount; ++i) {
        FixtureProxy proxy = m_proxies[i];
        // Compute an AABB that covers the swept shape (may miss some rotation effect).
        final AABB aabb1 = pool1;
        final AABB aab = pool2;
        m_shape.computeAABB(aabb1, transform1, proxy.childIndex);
        m_shape.computeAABB(aab, transform2, proxy.childIndex);
        proxy.aabb.lowerBound.x = aabb1.lowerBound.x < aab.lowerBound.x ? aabb1.lowerBound.x : aab.lowerBound.x;
        proxy.aabb.lowerBound.y = aabb1.lowerBound.y < aab.lowerBound.y ? aabb1.lowerBound.y : aab.lowerBound.y;
        proxy.aabb.upperBound.x = aabb1.upperBound.x > aab.upperBound.x ? aabb1.upperBound.x : aab.upperBound.x;
        proxy.aabb.upperBound.y = aabb1.upperBound.y > aab.upperBound.y ? aabb1.upperBound.y : aab.upperBound.y;
        displacement.x = transform2.p.x - transform1.p.x;
        displacement.y = transform2.p.y - transform1.p.y;
        broadPhase.moveProxy(proxy.proxyId, proxy.aabb, displacement);
    }
}
Also used : AABB(org.jbox2d.collision.AABB)

Example 10 with AABB

use of org.jbox2d.collision.AABB in project libgdx by libgdx.

the class WorldRayCastWrapper method drawDebugData.

/**
   * Call this to draw shapes and other debug draw data.
   */
public void drawDebugData() {
    if (m_debugDraw == null) {
        return;
    }
    int flags = m_debugDraw.getFlags();
    boolean wireframe = (flags & DebugDraw.e_wireframeDrawingBit) != 0;
    if ((flags & DebugDraw.e_shapeBit) != 0) {
        for (Body b = m_bodyList; b != null; b = b.getNext()) {
            xf.set(b.getTransform());
            for (Fixture f = b.getFixtureList(); f != null; f = f.getNext()) {
                if (b.isActive() == false) {
                    color.set(0.5f, 0.5f, 0.3f);
                    drawShape(f, xf, color, wireframe);
                } else if (b.getType() == BodyType.STATIC) {
                    color.set(0.5f, 0.9f, 0.3f);
                    drawShape(f, xf, color, wireframe);
                } else if (b.getType() == BodyType.KINEMATIC) {
                    color.set(0.5f, 0.5f, 0.9f);
                    drawShape(f, xf, color, wireframe);
                } else if (b.isAwake() == false) {
                    color.set(0.5f, 0.5f, 0.5f);
                    drawShape(f, xf, color, wireframe);
                } else {
                    color.set(0.9f, 0.7f, 0.7f);
                    drawShape(f, xf, color, wireframe);
                }
            }
        }
        drawParticleSystem(m_particleSystem);
    }
    if ((flags & DebugDraw.e_jointBit) != 0) {
        for (Joint j = m_jointList; j != null; j = j.getNext()) {
            drawJoint(j);
        }
    }
    if ((flags & DebugDraw.e_pairBit) != 0) {
        color.set(0.3f, 0.9f, 0.9f);
        for (Contact c = m_contactManager.m_contactList; c != null; c = c.getNext()) {
            Fixture fixtureA = c.getFixtureA();
            Fixture fixtureB = c.getFixtureB();
            fixtureA.getAABB(c.getChildIndexA()).getCenterToOut(cA);
            fixtureB.getAABB(c.getChildIndexB()).getCenterToOut(cB);
            m_debugDraw.drawSegment(cA, cB, color);
        }
    }
    if ((flags & DebugDraw.e_aabbBit) != 0) {
        color.set(0.9f, 0.3f, 0.9f);
        for (Body b = m_bodyList; b != null; b = b.getNext()) {
            if (b.isActive() == false) {
                continue;
            }
            for (Fixture f = b.getFixtureList(); f != null; f = f.getNext()) {
                for (int i = 0; i < f.m_proxyCount; ++i) {
                    FixtureProxy proxy = f.m_proxies[i];
                    AABB aabb = m_contactManager.m_broadPhase.getFatAABB(proxy.proxyId);
                    if (aabb != null) {
                        Vec2[] vs = avs.get(4);
                        vs[0].set(aabb.lowerBound.x, aabb.lowerBound.y);
                        vs[1].set(aabb.upperBound.x, aabb.lowerBound.y);
                        vs[2].set(aabb.upperBound.x, aabb.upperBound.y);
                        vs[3].set(aabb.lowerBound.x, aabb.upperBound.y);
                        m_debugDraw.drawPolygon(vs, 4, color);
                    }
                }
            }
        }
    }
    if ((flags & DebugDraw.e_centerOfMassBit) != 0) {
        for (Body b = m_bodyList; b != null; b = b.getNext()) {
            xf.set(b.getTransform());
            xf.p.set(b.getWorldCenter());
            m_debugDraw.drawTransform(xf);
        }
    }
    if ((flags & DebugDraw.e_dynamicTreeBit) != 0) {
        m_contactManager.m_broadPhase.drawTree(m_debugDraw);
    }
    m_debugDraw.flush();
}
Also used : Vec2(org.jbox2d.common.Vec2) Joint(org.jbox2d.dynamics.joints.Joint) PulleyJoint(org.jbox2d.dynamics.joints.PulleyJoint) Joint(org.jbox2d.dynamics.joints.Joint) PulleyJoint(org.jbox2d.dynamics.joints.PulleyJoint) AABB(org.jbox2d.collision.AABB) ParticleContact(org.jbox2d.particle.ParticleContact) Contact(org.jbox2d.dynamics.contacts.Contact) ParticleBodyContact(org.jbox2d.particle.ParticleBodyContact)

Aggregations

AABB (org.jbox2d.collision.AABB)21 Vec2 (org.jbox2d.common.Vec2)8 DynamicTree (org.jbox2d.collision.broadphase.DynamicTree)1 Shape (org.jbox2d.collision.shapes.Shape)1 Transform (org.jbox2d.common.Transform)1 Contact (org.jbox2d.dynamics.contacts.Contact)1 Joint (org.jbox2d.dynamics.joints.Joint)1 PulleyJoint (org.jbox2d.dynamics.joints.PulleyJoint)1 ParticleBodyContact (org.jbox2d.particle.ParticleBodyContact)1 ParticleContact (org.jbox2d.particle.ParticleContact)1 Test (org.junit.Test)1