package java3d; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.ShortBuffer; public abstract class IndexedGeometryArray extends GeometryArray { protected int indexCount; protected ShortBuffer coordinateIndexBuffer = null; protected ShortBuffer texCoordinateIndexBuffer = null; protected ShortBuffer normalIndexBuffer = null; // コンストラクタ public IndexedGeometryArray(int vertexCount, int vertexFormat, int indexCount) { super(vertexCount, vertexFormat); this.indexCount = indexCount; ByteBuffer vbb = ByteBuffer.allocateDirect(indexCount * 2); vbb.order(ByteOrder.nativeOrder()); coordinateIndexBuffer = vbb.asShortBuffer(); if ((vertexFormat & TEXTURE_COORDINATE_2) != 0 || (vertexFormat & TEXTURE_COORDINATE_3) != 0 || (vertexFormat & TEXTURE_COORDINATE_4) != 0) { ByteBuffer vbb2 = ByteBuffer.allocateDirect(indexCount * 2); vbb2.order(ByteOrder.nativeOrder()); texCoordinateIndexBuffer = vbb2.asShortBuffer(); } if ((vertexFormat & NORMALS) != 0) { ByteBuffer vbb3 = ByteBuffer.allocateDirect(indexCount * 2); vbb3.order(ByteOrder.nativeOrder()); normalIndexBuffer = vbb3.asShortBuffer(); } } /** オブジェクトのインデックス数を取得する */ public int getIndexCount() { return indexCount; } public int getCoordinateIndex(int index) { return coordinateIndexBuffer.get(index); } public void getCoordinateIndices(int index, int[] coordinateIndicies) { for (int i = 0; i < coordinateIndicies.length && index + i < coordinateIndexBuffer.limit(); i++) { coordinateIndicies[i] = coordinateIndexBuffer.get(index + i); } } public void setCoordinateIndex(int index, int coordinateIndex) { coordinateIndexBuffer.put(index, (short)coordinateIndex); } public void setCoordinateIndices(int index, int[] coordinateIndicies) { coordinateIndexBuffer.position(index); for (int i = 0; i < coordinateIndicies.length; i++) { coordinateIndexBuffer.put((short)coordinateIndicies[i]); } coordinateIndexBuffer.position(0); } public int getTextureCoordinateIndex(int index) { return texCoordinateIndexBuffer.get(index); } public void setTextureCoordinateIndex(int index, int texCoordIndex) { coordinateIndexBuffer.put(index, (short)texCoordIndex); } public int getNormalIndex(int index) { return normalIndexBuffer.get(index); } public void setNormalIndex(int index, int normalIndex) { normalIndexBuffer.put(index, (short)normalIndex); } public ShortBuffer getCoordinateIndexBuffer() { return coordinateIndexBuffer; } public ShortBuffer getTextureCoordinateIndexBuffer() { return texCoordinateIndexBuffer; } public ShortBuffer getNormalIndexBuffer() { return normalIndexBuffer; } }