Android examples for java.nio:ShortBuffer
create ShortBuffer
/*//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; } }