Example usage for com.badlogic.gdx.graphics VertexAttributes equals

List of usage examples for com.badlogic.gdx.graphics VertexAttributes equals

Introduction

In this page you can find the example usage for com.badlogic.gdx.graphics VertexAttributes equals.

Prototype

@Override
    public boolean equals(final Object obj) 

Source Link

Usage

From source file:com.badlogic.gdx.tests.g3d.ModelCache.java

/** Finishes creating the cache, must be called after a call to {@link #begin()}, only after this call the cache will be valid
 * (until the next call to {@link #begin()}). Calling this method will process all renderables added using one of the add(...)
 * methods and will combine them if possible. */
public void end() {
    if (!building)
        throw new GdxRuntimeException("Call begin() prior to calling end()");
    building = false;/*w ww. jav a  2  s. c  o m*/

    if (items.size == 0)
        return;
    sorter.sort(null, items); // FIXME Perhaps pass the actual camera?

    int itemCount = items.size;
    int initCount = renderables.size;

    final Renderable first = items.get(0);
    VertexAttributes vertexAttributes = first.mesh.getVertexAttributes();
    Material material = first.material;
    int primitiveType = first.primitiveType;
    int offset = renderables.size;

    meshBuilder.begin(vertexAttributes);
    MeshPart part = meshBuilder.part("", primitiveType, meshPartPool.obtain());
    renderables.add(obtainRenderable(material, primitiveType));

    for (int i = 0, n = items.size; i < n; ++i) {
        final Renderable renderable = items.get(i);
        final VertexAttributes va = renderable.mesh.getVertexAttributes();
        final Material mat = renderable.material;
        final int pt = renderable.primitiveType;

        final boolean sameMesh = va.equals(vertexAttributes)
                && renderable.meshPartSize + meshBuilder.getNumVertices() < Short.MAX_VALUE; // comparing indices and vertices...
        final boolean samePart = sameMesh && pt == primitiveType && mat.same(material, true);

        if (!samePart) {
            if (!sameMesh) {
                final Mesh mesh = meshBuilder.end(meshPool.obtain(vertexAttributes,
                        meshBuilder.getNumVertices(), meshBuilder.getNumIndices()));
                while (offset < renderables.size)
                    renderables.get(offset++).mesh = mesh;
                meshBuilder.begin(vertexAttributes = va);
            }

            final MeshPart newPart = meshBuilder.part("", pt, meshPartPool.obtain());
            final Renderable previous = renderables.get(renderables.size - 1);
            previous.meshPartOffset = part.indexOffset;
            previous.meshPartSize = part.numVertices;
            part = newPart;

            renderables.add(obtainRenderable(material = mat, primitiveType = pt));
        }

        meshBuilder.setVertexTransform(renderable.worldTransform);
        meshBuilder.addMesh(renderable.mesh, renderable.meshPartOffset, renderable.meshPartSize);
    }

    final Mesh mesh = meshBuilder
            .end(meshPool.obtain(vertexAttributes, meshBuilder.getNumVertices(), meshBuilder.getNumIndices()));
    while (offset < renderables.size)
        renderables.get(offset++).mesh = mesh;

    final Renderable previous = renderables.get(renderables.size - 1);
    previous.meshPartOffset = part.indexOffset;
    previous.meshPartSize = part.numVertices;
}