create ShortBuffer - Android java.nio

Android examples for java.nio:ShortBuffer

Description

create ShortBuffer

Demo Code

/*//w w  w . ja  v  a2  s .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.
 */
//package com.book2s;
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 Tutorials