Android ShortBuffer Create createShortIndicesBuffer( final int capacity, final ShortBuffer previous)

Here you can find the source of createShortIndicesBuffer( final int capacity, final ShortBuffer previous)

Description

create Short Indices Buffer

License

Apache License

Declaration

public static final ShortBuffer createShortIndicesBuffer(
            final int capacity, final ShortBuffer previous) 

Method Source Code

//package com.java2s;
/*/*  w  w w  .jav  a 2s.co m*/
 * Copyright (C) 2010 Lance Nanek
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import java.nio.ByteBuffer;
import java.nio.ByteOrder;

import java.nio.ShortBuffer;

public class Main {
    public static final int VERTS_PER_QUAD = 4;
    public static final int BYTES_PER_SHORT = Short.SIZE / Byte.SIZE;
    public static final int INDICES_PER_QUAD = 6;

    public static final ShortBuffer createShortIndicesBuffer(
            final int capacity) {
        final ShortBuffer indices = createDirectShortBuffer(capacity);

        /* TODO investigate if generating the indices causes any appreciable
         * load time and generate them at before packaging if so.
         */
        fillIndices(indices, 0, capacity);

        return indices;
    }

    public static final ShortBuffer createShortIndicesBuffer(
            final int capacity, final ShortBuffer previous) {
        if (null == previous) {
            return createShortIndicesBuffer(capacity);
        }

        final int oldPosition = previous.position();

        //The index buffer is always completely filled out.
        previous.position(previous.capacity());
        final ShortBuffer created = createDirectShortBuffer(capacity,
                previous);

        fillIndices(created, previous.capacity(), capacity);

        created.position(oldPosition);

        return created;
    }

    public static final ShortBuffer createDirectShortBuffer(
            final int capacity) {
        return createDirectByteBuffer(capacity * BYTES_PER_SHORT)
                .asShortBuffer();
    }

    public static final ShortBuffer createDirectShortBuffer(
            final int capacity, final ShortBuffer previous) {
        final ShortBuffer created = createDirectShortBuffer(capacity);

        if (null != previous) {
            previous.flip();
            created.put(previous);
        }

        return created;
    }

    private static final void fillIndices(final ShortBuffer indices,
            final int start, final int limit) {
        final int capacity = limit - start;

        //Benchmarks show filling array, then filling buffer is faster than 
        //filling buffer 1 at a time.
        final short[] indicesArray = new short[capacity];

        short vertexNumber = (short) (start * VERTS_PER_QUAD / INDICES_PER_QUAD);
        for (int i = 0; i < capacity; i += INDICES_PER_QUAD) {

            //Top left corner, only used once, part of first triangle.
            indicesArray[i] = vertexNumber++;//Index 0, vertex 0, for sprite.

            //Bottom left corner, used for both triangles.
            indicesArray[i + 1] = vertexNumber;//Index 1, vertex 1, for sprite.
            indicesArray[i + 4] = vertexNumber++;//Index 4, vertex 1, for sprite.

            //Top right corner, used for both triangles.
            indicesArray[i + 2] = vertexNumber;//Index 2, vertex 2, for sprite.
            indicesArray[i + 3] = vertexNumber++;//Index 3, vertex 2, for sprite.

            //Bottom right corner, only used once, part of second triangle.
            indicesArray[i + 5] = vertexNumber++;//Index 5, vertex 3, for sprite.
        }

        indices.position(start);
        indices.put(indicesArray);
        indices.rewind();
    }

    public static final ByteBuffer createDirectByteBuffer(final int capacity) {
        return ByteBuffer.allocateDirect(capacity).order(
                ByteOrder.nativeOrder());
    }

    public static final ByteBuffer createDirectByteBuffer(
            final int capacity, final ByteBuffer previous) {
        final ByteBuffer created = createDirectByteBuffer(capacity);

        if (null != previous) {
            previous.flip();
            created.put(previous);
        }

        return created;
    }
}

Related

  1. createShortBuffer(int size)
  2. createShortBuffer(int size)
  3. createShortBuffer(short[] data)
  4. createShortBuffer(short[] shortData)
  5. createShortIndicesBuffer( final int capacity)
  6. newShortBuffer(int numShorts)
  7. newShortBuffer(int numShorts)
  8. newShortBuffer(int paramInt)
  9. makeShortBuffer(int size)