Search in sources :

Example 1 with TFloatIterator

use of gnu.trove.iterator.TFloatIterator in project Terasology by MovingBlocks.

the class OpenGLMesh method buildMesh.

private void buildMesh(MeshData newData) {
    this.data = newData;
    List<TFloatIterator> parts = Lists.newArrayList();
    TIntList partSizes = new TIntArrayList();
    int vertexCount = newData.getVertices().size() / VERTEX_SIZE;
    int vertexSize = VERTEX_SIZE;
    parts.add(newData.getVertices().iterator());
    partSizes.add(VERTEX_SIZE);
    if (newData.getTexCoord0() != null && newData.getTexCoord0().size() / TEX_COORD_0_SIZE == vertexCount) {
        parts.add(newData.getTexCoord0().iterator());
        partSizes.add(TEX_COORD_0_SIZE);
        texCoord0Offset = vertexSize * FLOAT_SIZE;
        vertexSize += TEX_COORD_0_SIZE;
        hasTexCoord0 = true;
    }
    if (newData.getTexCoord1() != null && newData.getTexCoord1().size() / TEX_COORD_1_SIZE == vertexCount) {
        parts.add(newData.getTexCoord1().iterator());
        partSizes.add(TEX_COORD_1_SIZE);
        texCoord1Offset = vertexSize * FLOAT_SIZE;
        vertexSize += TEX_COORD_1_SIZE;
        hasTexCoord1 = true;
    }
    if (newData.getNormals() != null && newData.getNormals().size() / NORMAL_SIZE == vertexCount) {
        parts.add(newData.getNormals().iterator());
        partSizes.add(NORMAL_SIZE);
        normalOffset = vertexSize * FLOAT_SIZE;
        vertexSize += NORMAL_SIZE;
        hasNormal = true;
    }
    if (newData.getColors() != null && newData.getColors().size() / COLOR_SIZE == vertexCount) {
        parts.add(newData.getColors().iterator());
        partSizes.add(COLOR_SIZE);
        colorOffset = vertexSize * FLOAT_SIZE;
        vertexSize += COLOR_SIZE;
        hasColor = true;
    }
    stride = vertexSize * FLOAT_SIZE;
    indexCount = newData.getIndices().size();
    createVertexBuffer(parts, partSizes, vertexCount, vertexSize);
    createIndexBuffer(newData.getIndices());
    aabb = AABB.createEncompasing(newData.getVertices());
}
Also used : TFloatIterator(gnu.trove.iterator.TFloatIterator) TIntList(gnu.trove.list.TIntList) TIntArrayList(gnu.trove.list.array.TIntArrayList)

Example 2 with TFloatIterator

use of gnu.trove.iterator.TFloatIterator in project Terasology by MovingBlocks.

the class HealthAuthoritySystem method calculateTotal.

private int calculateTotal(int base, TFloatList multipliers, TIntList modifiers) {
    // For now, add all modifiers and multiply by all multipliers. Negative modifiers cap to zero, but negative
    // multipliers remain (so damage can be flipped to healing)
    float total = base;
    TIntIterator modifierIter = modifiers.iterator();
    while (modifierIter.hasNext()) {
        total += modifierIter.next();
    }
    total = Math.max(0, total);
    if (total == 0) {
        return 0;
    }
    TFloatIterator multiplierIter = multipliers.iterator();
    while (multiplierIter.hasNext()) {
        total *= multiplierIter.next();
    }
    return TeraMath.floorToInt(total);
}
Also used : TIntIterator(gnu.trove.iterator.TIntIterator) TFloatIterator(gnu.trove.iterator.TFloatIterator)

Example 3 with TFloatIterator

use of gnu.trove.iterator.TFloatIterator in project Terasology by MovingBlocks.

the class AbstractValueModifiableEvent method getResultValue.

public float getResultValue() {
    // For now, add all modifiers and multiply by all multipliers. Negative modifiers cap to zero, but negative
    // multipliers remain.
    float result = baseValue;
    TFloatIterator modifierIter = modifiers.iterator();
    while (modifierIter.hasNext()) {
        result += modifierIter.next();
    }
    result = Math.max(0, result);
    TFloatIterator multiplierIter = multipliers.iterator();
    while (multiplierIter.hasNext()) {
        result *= multiplierIter.next();
    }
    final TFloatIterator postModifierIter = postModifiers.iterator();
    while (postModifierIter.hasNext()) {
        result += postModifierIter.next();
    }
    return result;
}
Also used : TFloatIterator(gnu.trove.iterator.TFloatIterator)

Example 4 with TFloatIterator

use of gnu.trove.iterator.TFloatIterator in project Terasology by MovingBlocks.

the class OpenGLMesh method createVertexBuffer.

private void createVertexBuffer(List<TFloatIterator> parts, TIntList partSizes, int vertexCount, int vertexSize) {
    FloatBuffer vertexBuffer = BufferUtils.createFloatBuffer(vertexSize * vertexCount);
    for (int v = 0; v < vertexCount; ++v) {
        for (int partIndex = 0; partIndex < parts.size(); ++partIndex) {
            TFloatIterator part = parts.get(partIndex);
            for (int i = 0; i < partSizes.get(partIndex); ++i) {
                vertexBuffer.put(part.next());
            }
        }
    }
    vertexBuffer.flip();
    if (disposalAction.vboVertexBuffer == 0) {
        disposalAction.vboVertexBuffer = disposalAction.bufferPool.get(getUrn().toString());
    }
    VertexBufferObjectUtil.bufferVboData(disposalAction.vboVertexBuffer, vertexBuffer, GL15.GL_STATIC_DRAW);
    vertexBuffer.flip();
}
Also used : TFloatIterator(gnu.trove.iterator.TFloatIterator) FloatBuffer(java.nio.FloatBuffer)

Example 5 with TFloatIterator

use of gnu.trove.iterator.TFloatIterator 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

TFloatIterator (gnu.trove.iterator.TFloatIterator)5 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 TIntIterator (gnu.trove.iterator.TIntIterator)1 TIntList (gnu.trove.list.TIntList)1 TIntArrayList (gnu.trove.list.array.TIntArrayList)1 FloatBuffer (java.nio.FloatBuffer)1 Vector3f (javax.vecmath.Vector3f)1 CharacterMovementComponent (org.terasology.logic.characters.CharacterMovementComponent)1 BoxShapeComponent (org.terasology.physics.components.shapes.BoxShapeComponent)1 CapsuleShapeComponent (org.terasology.physics.components.shapes.CapsuleShapeComponent)1 CylinderShapeComponent (org.terasology.physics.components.shapes.CylinderShapeComponent)1 HullShapeComponent (org.terasology.physics.components.shapes.HullShapeComponent)1 SphereShapeComponent (org.terasology.physics.components.shapes.SphereShapeComponent)1