Search in sources :

Example 1 with HullShapeComponent

use of org.terasology.physics.components.shapes.HullShapeComponent in project Terasology by MovingBlocks.

the class PlayerFactory method getHeightOf.

private float getHeightOf(ComponentContainer prefab) {
    BoxShapeComponent box = prefab.getComponent(BoxShapeComponent.class);
    if (box != null) {
        return box.extents.getY();
    }
    CylinderShapeComponent cylinder = prefab.getComponent(CylinderShapeComponent.class);
    if (cylinder != null) {
        return cylinder.height;
    }
    CapsuleShapeComponent capsule = prefab.getComponent(CapsuleShapeComponent.class);
    if (capsule != null) {
        return capsule.height;
    }
    SphereShapeComponent sphere = prefab.getComponent(SphereShapeComponent.class);
    if (sphere != null) {
        return sphere.radius * 2.0f;
    }
    HullShapeComponent hull = prefab.getComponent(HullShapeComponent.class);
    if (hull != null) {
        AABB aabb = hull.sourceMesh.getAABB();
        return aabb.maxY() - aabb.minY();
    }
    logger.warn("entity {} does not have any known extent specification - using default", prefab);
    return 1.0f;
}
Also used : SphereShapeComponent(org.terasology.physics.components.shapes.SphereShapeComponent) BoxShapeComponent(org.terasology.physics.components.shapes.BoxShapeComponent) CylinderShapeComponent(org.terasology.physics.components.shapes.CylinderShapeComponent) HullShapeComponent(org.terasology.physics.components.shapes.HullShapeComponent) AABB(org.terasology.math.AABB) CapsuleShapeComponent(org.terasology.physics.components.shapes.CapsuleShapeComponent)

Example 2 with HullShapeComponent

use of org.terasology.physics.components.shapes.HullShapeComponent in project Terasology by MovingBlocks.

the class BulletPhysics method getShapeFor.

/**
 * Returns the shape belonging to the given entity. It currently knows 4
 * different shapes: Sphere, Capsule, Cylinder or arbitrary.
 * The shape is determined based on the shape component of the given entity.
 * If the entity has somehow got multiple shapes, only one is picked. The
 * order of priority is: Sphere, Capsule, Cylinder, arbitrary.
 * <br><br>
 * TODO: Flyweight this (take scale as parameter)
 *
 * @param entity the entity to get the shape of.
 * @return the shape of the entity, ready to be used by Bullet.
 */
private ConvexShape getShapeFor(EntityRef entity) {
    BoxShapeComponent box = entity.getComponent(BoxShapeComponent.class);
    if (box != null) {
        Vector3f halfExtents = new Vector3f(VecMath.to(box.extents));
        halfExtents.scale(0.5f);
        return new BoxShape(halfExtents);
    }
    SphereShapeComponent sphere = entity.getComponent(SphereShapeComponent.class);
    if (sphere != null) {
        return new SphereShape(sphere.radius);
    }
    CapsuleShapeComponent capsule = entity.getComponent(CapsuleShapeComponent.class);
    if (capsule != null) {
        return new CapsuleShape(capsule.radius, capsule.height);
    }
    CylinderShapeComponent cylinder = entity.getComponent(CylinderShapeComponent.class);
    if (cylinder != null) {
        return new CylinderShape(new Vector3f(cylinder.radius, 0.5f * cylinder.height, cylinder.radius));
    }
    HullShapeComponent hull = entity.getComponent(HullShapeComponent.class);
    if (hull != null) {
        ObjectArrayList<Vector3f> verts = new ObjectArrayList<>();
        TFloatIterator iterator = hull.sourceMesh.getVertices().iterator();
        while (iterator.hasNext()) {
            Vector3f newVert = new Vector3f();
            newVert.x = iterator.next();
            newVert.y = iterator.next();
            newVert.z = iterator.next();
            verts.add(newVert);
        }
        return new ConvexHullShape(verts);
    }
    CharacterMovementComponent characterMovementComponent = entity.getComponent(CharacterMovementComponent.class);
    if (characterMovementComponent != null) {
        return new CapsuleShape(characterMovementComponent.radius, characterMovementComponent.height);
    }
    logger.error("Creating physics object that requires a ShapeComponent or CharacterMovementComponent, but has neither. Entity: {}", entity);
    throw new IllegalArgumentException("Creating physics object that requires a ShapeComponent or CharacterMovementComponent, but has neither. Entity: " + entity);
}
Also used : SphereShapeComponent(org.terasology.physics.components.shapes.SphereShapeComponent) ConvexHullShape(com.bulletphysics.collision.shapes.ConvexHullShape) CylinderShapeComponent(org.terasology.physics.components.shapes.CylinderShapeComponent) HullShapeComponent(org.terasology.physics.components.shapes.HullShapeComponent) CharacterMovementComponent(org.terasology.logic.characters.CharacterMovementComponent) CapsuleShapeComponent(org.terasology.physics.components.shapes.CapsuleShapeComponent) CylinderShape(com.bulletphysics.collision.shapes.CylinderShape) ObjectArrayList(com.bulletphysics.util.ObjectArrayList) Vector3f(javax.vecmath.Vector3f) TFloatIterator(gnu.trove.iterator.TFloatIterator) BoxShapeComponent(org.terasology.physics.components.shapes.BoxShapeComponent) SphereShape(com.bulletphysics.collision.shapes.SphereShape) BoxShape(com.bulletphysics.collision.shapes.BoxShape) CapsuleShape(com.bulletphysics.collision.shapes.CapsuleShape)

Aggregations

BoxShapeComponent (org.terasology.physics.components.shapes.BoxShapeComponent)2 CapsuleShapeComponent (org.terasology.physics.components.shapes.CapsuleShapeComponent)2 CylinderShapeComponent (org.terasology.physics.components.shapes.CylinderShapeComponent)2 HullShapeComponent (org.terasology.physics.components.shapes.HullShapeComponent)2 SphereShapeComponent (org.terasology.physics.components.shapes.SphereShapeComponent)2 BoxShape (com.bulletphysics.collision.shapes.BoxShape)1 CapsuleShape (com.bulletphysics.collision.shapes.CapsuleShape)1 ConvexHullShape (com.bulletphysics.collision.shapes.ConvexHullShape)1 CylinderShape (com.bulletphysics.collision.shapes.CylinderShape)1 SphereShape (com.bulletphysics.collision.shapes.SphereShape)1 ObjectArrayList (com.bulletphysics.util.ObjectArrayList)1 TFloatIterator (gnu.trove.iterator.TFloatIterator)1 Vector3f (javax.vecmath.Vector3f)1 CharacterMovementComponent (org.terasology.logic.characters.CharacterMovementComponent)1 AABB (org.terasology.math.AABB)1