Example usage for com.badlogic.gdx.graphics Mesh getNumIndices

List of usage examples for com.badlogic.gdx.graphics Mesh getNumIndices

Introduction

In this page you can find the example usage for com.badlogic.gdx.graphics Mesh getNumIndices.

Prototype

public int getNumIndices() 

Source Link

Usage

From source file:com.andgate.ikou.render.FloorRender.java

License:Open Source License

@Override
public void getRenderables(Array<Renderable> renderables, Pool<Renderable> pool) {
    for (int i = 0; i < sectorMeshes.length; i++) {
        for (int j = 0; j < sectorMeshes[i].length; j++) {
            Mesh mesh = sectorMeshes[i][j].getMesh();

            if (inFrustum(i, j) && (mesh != null)) {
                Renderable renderable = pool.obtain();
                renderable.material = TileStack.TILE_MATERIAL;
                renderable.meshPartOffset = 0;
                renderable.meshPartSize = mesh.getNumIndices();
                renderable.primitiveType = GL20.GL_TRIANGLES;
                renderable.mesh = mesh;//from ww w  .  jav a2s .c om
                renderables.add(renderable);

                renderable.worldTransform.set(floorTransform);
            }
        }
    }
}

From source file:com.badlogic.gdx.physics.bullet.demo.simulationobjects.MeshSimulationObject.java

public static btBvhTriangleMeshShape createTriangleMeshShape(Mesh mesh,
        AtomicReference<btTriangleMesh> triangleMesh) {
    final btTriangleMesh m = new btTriangleMesh();

    final ShortBuffer indices = mesh.getIndicesBuffer();
    indices.rewind();//from w ww  .  j a va 2s  . c om
    final FloatBuffer vertices = mesh.getVerticesBuffer();
    vertices.rewind();

    // Some meshes have vertices but no indices declared
    final boolean hasIndices = mesh.getNumIndices() != 0;
    final int vertexStride = mesh.getVertexSize() / 4;

    final Vector3 v0 = Pools.VECTOR3.obtain();
    final Vector3 v1 = Pools.VECTOR3.obtain();
    final Vector3 v2 = Pools.VECTOR3.obtain();

    // Set up a small array to keep the loop code simpler
    final Vector3[] vectors = new Vector3[] { v0, v1, v2 };
    short vectorIndex = 0;

    int i = -1;
    int verticesRead = 0;
    while (verticesRead < mesh.getNumVertices()) {
        if (hasIndices) {
            i = indices.get();
        } else {
            i++;
        }

        vectors[vectorIndex++].set(vertices.get(i * vertexStride), vertices.get(i * vertexStride + 1),
                vertices.get(i * vertexStride + 2));

        if (vectorIndex == vectors.length) {
            m.addTriangle(v0, v1, v2, true);
            vectorIndex = 0;
        }

        verticesRead++;
    }

    Pools.VECTOR3.free(v0);
    Pools.VECTOR3.free(v1);
    Pools.VECTOR3.free(v2);

    triangleMesh.set(m);
    return new btBvhTriangleMeshShape(m, true);
}

From source file:com.lyeeedar.Roguelike3D.Graphics.Models.Shapes.java

License:Open Source License

public static Mesh insertLight(Mesh mesh, LightManager lights, boolean bakeStatics, Matrix4 model_matrix) {
    VertexAttributes attributes = mesh.getVertexAttributes();
    final int vertCount = mesh.getNumVertices();
    final int vertexSize = attributes.vertexSize / 4;

    VertexAttribute[] newAttributes = new VertexAttribute[attributes.size() + 1];
    for (int i = 0; i < attributes.size(); i++) {
        newAttributes[i] = attributes.get(i);
    }/*  w  w  w . j a v a2  s. co m*/
    newAttributes[attributes.size()] = new VertexAttribute(Usage.Generic, 3, "a_baked_light");

    final int newVertexSize = vertexSize + 3;

    float[] verts = new float[vertexSize * vertCount];
    mesh.getVertices(verts);
    short[] indices = new short[mesh.getNumIndices()];
    mesh.getIndices(indices);
    float[] newVerts = new float[newVertexSize * vertCount];

    int positionOffset = attributes.getOffset(Usage.Position);
    int normalOffset = attributes.getOffset(Usage.Normal);

    Matrix4 normal_matrix = new Matrix4();
    normal_matrix.set(model_matrix);

    Vector3 position = new Vector3();

    for (int i = 0; i < vertCount; i++) {
        int j = 0;
        for (; j < vertexSize; j++) {
            newVerts[(i * newVertexSize) + j] = verts[(i * vertexSize) + j];
        }

        position.set(verts[(i * vertexSize) + positionOffset], verts[(i * vertexSize) + positionOffset + 1],
                verts[(i * vertexSize) + positionOffset + 2]).mul(model_matrix);

        Vector3 normal = new Vector3(verts[(i * vertexSize) + normalOffset],
                verts[(i * vertexSize) + normalOffset + 1], verts[(i * vertexSize) + normalOffset + 2]);
        normal.rot(normal_matrix).nor();

        Color light_colour = lights.calculateLightAtPoint(position, normal, bakeStatics);

        newVerts[(i * newVertexSize) + j + 0] = light_colour.r;
        newVerts[(i * newVertexSize) + j + 1] = light_colour.g;
        newVerts[(i * newVertexSize) + j + 2] = light_colour.b;
    }

    Mesh newMesh = new Mesh(true, mesh.getNumVertices(), mesh.getNumIndices(), newAttributes);
    newMesh.setVertices(newVerts);
    newMesh.setIndices(indices);

    return newMesh;
}

From source file:com.lyeeedar.Roguelike3D.Graphics.Models.Shapes.java

License:Open Source License

public static Mesh insertTangents(Mesh mesh) {
    VertexAttributes attributes = mesh.getVertexAttributes();
    final int vertCount = mesh.getNumVertices();
    final int vertexSize = attributes.vertexSize / 4;

    VertexAttribute[] newAttributes = new VertexAttribute[attributes.size() + 1];
    for (int i = 0; i < attributes.size(); i++) {
        newAttributes[i] = attributes.get(i);
    }/*from  www.  j  a  v a  2  s .c o m*/
    newAttributes[attributes.size()] = new VertexAttribute(Usage.Generic, 4, "a_tangent");

    final int newVertexSize = vertexSize + 4;

    float[] verts = new float[vertexSize * vertCount];
    mesh.getVertices(verts);
    short[] indices = new short[mesh.getNumIndices()];
    mesh.getIndices(indices);
    float[] newVerts = new float[newVertexSize * vertCount];

    int positionOffset = attributes.getOffset(Usage.Position);
    int normalOffset = attributes.getOffset(Usage.Normal);
    int textureOffset = attributes.getOffset(Usage.TextureCoordinates);

    int tangentOffset = 0;
    for (int i = 0; i < vertCount; i += 3) {
        int j = 0;
        for (; j < vertexSize; j++) {
            newVerts[(i * newVertexSize) + j] = verts[(i * vertexSize) + j];
            newVerts[((i + 1) * newVertexSize) + j] = verts[((i + 1) * vertexSize) + j];
            newVerts[((i + 2) * newVertexSize) + j] = verts[((i + 2) * vertexSize) + j];
        }
        tangentOffset = j;
    }
    for (int i = 0; i < mesh.getNumIndices(); i += 3) {
        int i1 = indices[i];
        int i2 = indices[i + 1];
        int i3 = indices[i + 2];

        Vector3 v1 = new Vector3(verts[(i1 * vertexSize) + positionOffset],
                verts[(i1 * vertexSize) + positionOffset] + 1, verts[(i1 * vertexSize) + positionOffset] + 2);
        Vector3 v2 = new Vector3(verts[(i2 * vertexSize) + positionOffset],
                verts[(i2 * vertexSize) + positionOffset] + 1, verts[(i2 * vertexSize) + positionOffset] + 2);
        Vector3 v3 = new Vector3(verts[(i3 * vertexSize) + positionOffset],
                verts[(i3 * vertexSize) + positionOffset] + 1, verts[(i3 * vertexSize) + positionOffset] + 2);

        float[] w1 = { verts[(i1 * vertexSize) + textureOffset], verts[(i1 * vertexSize) + textureOffset] + 1 };
        float[] w2 = { verts[(i2 * vertexSize) + textureOffset], verts[(i2 * vertexSize) + textureOffset] + 1 };
        float[] w3 = { verts[(i3 * vertexSize) + textureOffset], verts[(i3 * vertexSize) + textureOffset] + 1 };

        float x1 = v2.x - v1.x;
        float x2 = v3.x - v1.x;
        float y1 = v2.y - v1.y;
        float y2 = v3.y - v1.y;
        float z1 = v2.z - v1.z;
        float z2 = v3.z - v1.z;

        float s1 = w2[0] - w1[0];
        float s2 = w3[0] - w1[0];
        float t1 = w2[1] - w1[1];
        float t2 = w3[1] - w1[1];

        float div = s1 * t2 - s2 * t1;
        float r = div == 0.0f ? 0.0f : 1.0f / div;

        Vector3 t = new Vector3((t2 * x1 - t1 * x2) * r, (t2 * y1 - t1 * y2) * r, (t2 * z1 - t1 * z2) * r);
        Vector3 n = new Vector3(verts[(i1 * vertexSize) + normalOffset],
                verts[(i1 * vertexSize) + normalOffset] + 1, verts[(i1 * vertexSize) + normalOffset] + 2);

        //Vector3 tangent = t.cpy().sub(n).mul(n.tmp().dot(t)).nor();
        Vector3 tangent = orthoNormalize(n, t);

        System.out.println(t2);

        Vector3 tan2 = new Vector3((s1 * x2 - s2 * x1) * r, (s1 * y2 - s2 * y1) * r, (s1 * z2 - s2 * z1) * r);
        float handedness = (n.tmp().crs(t).dot(tan2) < 0.0f) ? -1.0f : 1.0f;

        Vector3 c1 = n.cpy().crs(0.0f, 0.0f, 1.0f);
        Vector3 c2 = n.cpy().crs(0.0f, 1.0f, 0.0f);

        if (c1.len2() > c2.len2()) {
            tangent = c1;
        } else {
            tangent = c2;
        }

        newVerts[(i1 * newVertexSize) + tangentOffset] = tangent.x;
        newVerts[(i1 * newVertexSize) + tangentOffset + 1] = tangent.y;
        newVerts[(i1 * newVertexSize) + tangentOffset + 2] = tangent.z;
        newVerts[(i1 * newVertexSize) + tangentOffset + 3] = handedness;

        newVerts[(i2 * newVertexSize) + tangentOffset] = tangent.x;
        newVerts[(i2 * newVertexSize) + tangentOffset + 1] = tangent.y;
        newVerts[(i2 * newVertexSize) + tangentOffset + 2] = tangent.z;
        newVerts[(i2 * newVertexSize) + tangentOffset + 3] = handedness;

        newVerts[(i3 * newVertexSize) + tangentOffset] = tangent.x;
        newVerts[(i3 * newVertexSize) + tangentOffset + 1] = tangent.y;
        newVerts[(i3 * newVertexSize) + tangentOffset + 2] = tangent.z;
        newVerts[(i3 * newVertexSize) + tangentOffset + 3] = handedness;
    }

    Mesh newMesh = new Mesh(true, mesh.getNumVertices(), mesh.getNumIndices(), newAttributes);
    newMesh.setVertices(newVerts);
    newMesh.setIndices(indices);

    return newMesh;
}

From source file:com.lyeeedar.Roguelike3D.Graphics.Models.Shapes.java

License:Open Source License

public static Mesh copyMesh(Mesh mesh) {
    VertexAttributes attributes = mesh.getVertexAttributes();
    final int vertCount = mesh.getNumVertices();
    final int vertexSize = attributes.vertexSize / 4;

    float[] verts = new float[vertexSize * vertCount];
    mesh.getVertices(verts);//from w w  w  .j  a  va  2 s. c  o m
    short[] indices = new short[mesh.getNumIndices()];
    mesh.getIndices(indices);

    Mesh newMesh = new Mesh(true, mesh.getNumVertices(), mesh.getNumIndices(), attributes);
    newMesh.setVertices(verts);
    newMesh.setIndices(indices);

    return newMesh;
}

From source file:com.mygdx.game.pathfinding.NavMeshGraph.java

License:Apache License

/**
 * Get an array of the vertex indices from the mesh. Any vertices which share the same position will be counted
 * as a single vertex and share the same index. That is, position duplicates will be filtered out.
 *
 * @param mesh/*w  ww  .  j  av  a2s . co  m*/
 * @return
 */
private static short[] getUniquePositionVertexIndices(Mesh mesh) {
    FloatBuffer verticesBuffer = mesh.getVerticesBuffer();
    int positionOffset = mesh.getVertexAttributes().findByUsage(VertexAttributes.Usage.Position).offset / 4;
    // Number of array elements which make up a vertex
    int vertexSize = mesh.getVertexSize() / 4;
    // The indices tell us which vertices are part of a triangle.
    short[] indices = new short[mesh.getNumIndices()];
    mesh.getIndices(indices);
    // Marks true if an index has already been compared to avoid unnecessary comparisons
    Bits handledIndices = new Bits(mesh.getNumIndices());

    for (int i = 0; i < indices.length; i++) {
        short indexI = indices[i];
        if (handledIndices.get(indexI)) {
            // Index handled in an earlier iteration
            continue;
        }
        int vBufIndexI = indexI * vertexSize + positionOffset;
        float xi = verticesBuffer.get(vBufIndexI++);
        float yi = verticesBuffer.get(vBufIndexI++);
        float zi = verticesBuffer.get(vBufIndexI++);
        for (int j = i + 1; j < indices.length; j++) {
            short indexJ = indices[j];
            int vBufIndexJ = indexJ * vertexSize + positionOffset;
            float xj = verticesBuffer.get(vBufIndexJ++);
            float yj = verticesBuffer.get(vBufIndexJ++);
            float zj = verticesBuffer.get(vBufIndexJ++);
            if (xi == xj && yi == yj && zi == zj) {
                indices[j] = indexI;
            }
        }
        handledIndices.set(indexI);
    }
    return indices;
}

From source file:com.mygdx.game.pathfinding.NavMeshGraph.java

License:Apache License

/**
 * Creates Vector3 objects from the vertices of the mesh. The resulting array follows the ordering of the provided
 * index array./*from w w  w.ja v a  2  s. c  o  m*/
 *
 * @param mesh
 * @param indices
 * @return
 */
private static Vector3[] createVertexVectors(Mesh mesh, short[] indices) {
    FloatBuffer verticesBuffer = mesh.getVerticesBuffer();
    int positionOffset = mesh.getVertexAttributes().findByUsage(VertexAttributes.Usage.Position).offset / 4;
    int vertexSize = mesh.getVertexSize() / 4;
    Vector3[] vertexVectors = new Vector3[mesh.getNumIndices()];
    for (int i = 0; i < indices.length; i++) {
        short index = indices[i];
        int a = index * vertexSize + positionOffset;
        float x = verticesBuffer.get(a++);
        float y = verticesBuffer.get(a++);
        float z = verticesBuffer.get(a);
        vertexVectors[index] = new Vector3(x, y, z);
    }
    return vertexVectors;
}

From source file:com.mygdx.game.simulation.Simulation.java

License:Apache License

private void populate() {
    ObjLoader objLoader = new ObjLoader();

    for (int i = 0; i < MAX_SHIPS; i++) {
        shipModels[i] = objLoader.loadModel(Gdx.files.internal("data/ship.obj"));
    }/*from  w w w. j av  a2s. c  o  m*/
    invaderModel = objLoader.loadModel(Gdx.files.internal("data/invader.obj"));
    blockModel = objLoader.loadModel(Gdx.files.internal("data/block.obj"));
    shotModel = objLoader.loadModel(Gdx.files.internal("data/shot.obj"));

    final Texture shipTexture = new Texture(Gdx.files.internal("data/ship.png"), Format.RGB565, true);
    shipTexture.setFilter(TextureFilter.MipMap, TextureFilter.Linear);
    final Texture shipTexture2 = new Texture(Gdx.files.internal("data/ship.png"), Format.RGB565, true);
    shipTexture2.setFilter(TextureFilter.MipMap, TextureFilter.Linear);
    final Texture invaderTexture = new Texture(Gdx.files.internal("data/invader.png"), Format.RGB565, true);
    invaderTexture.setFilter(TextureFilter.MipMap, TextureFilter.Linear);

    for (int i = 0; i < MAX_SHIPS; i++) {
        shipModels[i].materials.get(0).set(TextureAttribute.createDiffuse(shipTexture));
    }
    invaderModel.materials.get(0).set(TextureAttribute.createDiffuse(invaderTexture));

    ((ColorAttribute) blockModel.materials.get(0).get(ColorAttribute.Diffuse)).color.set(0, 0, 1, 0.5f);
    blockModel.materials.get(0).set(new BlendingAttribute(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA));

    shotModel.materials.get(0).set(ColorAttribute.createDiffuse(1, 1, 0, 1f));

    final Texture explosionTexture = new Texture(Gdx.files.internal("data/explode.png"), Format.RGBA4444, true);
    explosionTexture.setFilter(TextureFilter.MipMap, TextureFilter.Linear);

    final Mesh explosionMesh = new Mesh(true, 4 * 16, 6 * 16,
            new VertexAttribute(Usage.Position, 3, "a_position"),
            new VertexAttribute(Usage.TextureCoordinates, 2, "a_texCoord0"));

    float[] vertices = new float[4 * 16 * (3 + 2)];
    short[] indices = new short[6 * 16];
    int idx = 0;
    int index = 0;
    for (int row = 0; row < 4; row++) {
        for (int column = 0; column < 4; column++) {
            vertices[idx++] = 1;
            vertices[idx++] = 1;
            vertices[idx++] = 0;
            vertices[idx++] = 0.25f + column * 0.25f;
            vertices[idx++] = 0 + row * 0.25f;

            vertices[idx++] = -1;
            vertices[idx++] = 1;
            vertices[idx++] = 0;
            vertices[idx++] = 0 + column * 0.25f;
            vertices[idx++] = 0 + row * 0.25f;

            vertices[idx++] = -1;
            vertices[idx++] = -1;
            vertices[idx++] = 0;
            vertices[idx++] = 0f + column * 0.25f;
            vertices[idx++] = 0.25f + row * 0.25f;

            vertices[idx++] = 1;
            vertices[idx++] = -1;
            vertices[idx++] = 0;
            vertices[idx++] = 0.25f + column * 0.25f;
            vertices[idx++] = 0.25f + row * 0.25f;

            final int t = (4 * row + column) * 4;
            indices[index++] = (short) (t);
            indices[index++] = (short) (t + 1);
            indices[index++] = (short) (t + 2);
            indices[index++] = (short) (t);
            indices[index++] = (short) (t + 2);
            indices[index++] = (short) (t + 3);
        }
    }

    explosionMesh.setVertices(vertices);
    explosionMesh.setIndices(indices);

    Material explosionMeshMaterial = new Material(
            new BlendingAttribute(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA),
            TextureAttribute.createDiffuse(explosionTexture));
    explosionModel = new Model();
    MeshPart meshPart = new MeshPart();
    meshPart.id = "part1";
    meshPart.offset = 0;
    meshPart.size = explosionMesh.getNumIndices();
    meshPart.primitiveType = GL20.GL_TRIANGLES;
    meshPart.mesh = explosionMesh;

    NodePart partMaterial = new NodePart();
    partMaterial.material = explosionMeshMaterial;
    partMaterial.meshPart = meshPart;
    Node node = new Node();
    node.id = "node1";
    node.parts.add(partMaterial);

    explosionModel.meshes.add(explosionMesh);
    explosionModel.materials.add(explosionMeshMaterial);
    explosionModel.nodes.add(node);
    explosionModel.meshParts.add(meshPart);
    explosionModel.manageDisposable(explosionMesh);

    for (int i = 0; i < MAX_SHIPS; i++) {
        ships[i] = new Ship(shipModels[i]);
        ships[i].transform.rotate(1, 0, 0, 180);
    }

    for (int row = 0; row < 4; row++) {
        for (int column = 0; column < 8; column++) {
            Invader invader = new Invader(invaderModel, -PLAYFIELD_MAX_X / 2 + column * 2f, 0,
                    PLAYFIELD_MIN_Z + row * 2f);
            invaders.add(invader);
        }
    }

    for (int shield = 0; shield < 3; shield++) {
        blocks.add(new Block(blockModel, -10 + shield * 10 - 1, 0, -2));
        blocks.add(new Block(blockModel, -10 + shield * 10 - 1, 0, -3));
        blocks.add(new Block(blockModel, -10 + shield * 10 + 0, 0, -3));
        blocks.add(new Block(blockModel, -10 + shield * 10 + 1, 0, -3));
        blocks.add(new Block(blockModel, -10 + shield * 10 + 1, 0, -2));
    }
}

From source file:gaia.cu9.ari.gaiaorbit.util.g3d.ModelBuilder2.java

License:Apache License

/** Adds the specified mesh part to the current node. The Mesh will be managed by the model and disposed when the model is
 * disposed. The resources the Material might contain are not managed, use {@link #manage(Disposable)} to add those to the
 * model.//from w  w  w. j  a v  a2s.  c  o m
 * @return The added MeshPart. */
public MeshPart part(final String id, final Mesh mesh, int primitiveType, final Material material) {
    return part(id, mesh, primitiveType, 0, mesh.getNumIndices(), material);
}

From source file:gaia.cu9.ari.gaiaorbit.util.g3d.ModelBuilder2.java

License:Apache License

@Deprecated
public static Model createFromMesh(final Mesh mesh, int primitiveType, final Material material) {
    return createFromMesh(mesh, 0, mesh.getNumIndices(), primitiveType, material);
}