package java3d; import java.nio.Buffer; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.FloatBuffer; import java.util.ArrayList; public abstract class GeometryArray extends Geometry { // public static final int ALLOW_COLOR_READ = 2; // public static final int ALLOW_COLOR_WRITE = 3; // public static final int ALLOW_COORDINATE_READ = 0; // public static final int ALLOW_COORDINATE_WRITE = 1; // public static final int ALLOW_COUNT_READ = 8; // public static final int ALLOW_COUNT_WRITE = 20; // public static final int ALLOW_FORMAT_READ = 17; // public static final int ALLOW_NORMAL_READ = 4; // public static final int ALLOW_NORMAL_WRITE = 5; // public static final int ALLOW_REF_DATA_READ = 21; // public static final int ALLOW_REF_DATA_WRITE = 19; // public static final int ALLOW_TEXCOORD_READ = 6; // public static final int ALLOW_TEXCOORD_WRITE = 7; public static final int BY_REFERENCE = 128; public static final int COLOR_3 = 4; public static final int COLOR_4 = 12; public static final int COORDINATES = 1; public static final int INTERLEAVED = 256; public static final int NORMALS = 2; public static final int TEXTURE_COORDINATE_2 = 32; public static final int TEXTURE_COORDINATE_3 = 64; public static final int TEXTURE_COORDINATE_4 = 1024; public static final int USE_COORD_INDEX_ONLY = 512; public static final int USE_NIO_BUFFER = 2048; protected int vertexCount; protected int vertexFormat; protected FloatBuffer vertexBuffer = null; protected FloatBuffer normalBuffer = null; protected FloatBuffer uvBuffer = null; // コンストラクタ public GeometryArray(int vertexCount, int vertexFormat) { this.vertexCount = vertexCount; this.vertexFormat = vertexFormat; ByteBuffer vbb = ByteBuffer.allocateDirect(vertexCount * 4 * 3); vbb.order(ByteOrder.nativeOrder()); vertexBuffer = vbb.asFloatBuffer(); if ((vertexFormat & NORMALS) != 0) { ByteBuffer vbb2 = ByteBuffer.allocateDirect(vertexCount * 4 * 3); vbb2.order(ByteOrder.nativeOrder()); normalBuffer = vbb2.asFloatBuffer(); } if ((vertexFormat & TEXTURE_COORDINATE_2) != 0) { ByteBuffer vbb3 = ByteBuffer.allocateDirect(vertexCount * 4 * 2); vbb3.order(ByteOrder.nativeOrder()); uvBuffer = vbb3.asFloatBuffer(); } else if ((vertexFormat & TEXTURE_COORDINATE_3) != 0) { ByteBuffer vbb3 = ByteBuffer.allocateDirect(vertexCount * 4 * 3); vbb3.order(ByteOrder.nativeOrder()); uvBuffer = vbb3.asFloatBuffer(); } else if ((vertexFormat & TEXTURE_COORDINATE_4) != 0) { ByteBuffer vbb3 = ByteBuffer.allocateDirect(vertexCount * 4 * 4); vbb3.order(ByteOrder.nativeOrder()); uvBuffer = vbb3.asFloatBuffer(); } // mVertexBuffer.put(vertices); // mVertexBuffer.position(0); } // public GeometryArray(int vertexCount, int vertexFormat, int texCoordSetCount, int[] texCoordSetMap) { // this.vertexCount = vertexCount; // this.vertexFormat = vertexFormat; // this.texCoordSetCount = texCoordSetCount; // this.texCoordSetMap = texCoordSetMap; // } /** オブジェクトの頂点数 */ public int getVertexCount() { return vertexCount; } public int getVertexFormat() { return vertexFormat; } /** indexの頂点の座標をpに新しく格納する */ public void getCoordinate(int index, float[] p) { vertexBuffer.position(index * 3); vertexBuffer.get(p); vertexBuffer.position(0); } /** indexの頂点の座標をpに新しく格納する */ public void getCoordinate(int index, double[] p) { p[0] = vertexBuffer.get(index * 3); p[1] = vertexBuffer.get(index * 3 + 1); p[2] = vertexBuffer.get(index * 3 + 2); } /** indexの頂点の座標をpに新しく格納する */ public void getCoordinate(int index, Point3d p) { p.x = vertexBuffer.get(index * 3); p.y = vertexBuffer.get(index * 3 + 1); p.z = vertexBuffer.get(index * 3 + 2); } public void getCoordinates(int index, double[] coordinates) { for (int n = 0; n < coordinates.length / 3 && n + index < vertexBuffer.capacity() / 3; n++) { coordinates[n * 3] = vertexBuffer.get((index + n) * 3); coordinates[n * 3 + 1] = vertexBuffer.get((index + n) * 3 + 1); coordinates[n * 3 + 2] = vertexBuffer.get((index + n) * 3 + 2); } } /** indexの頂点の法線をpに新しく格納する */ public void getNormal(int index, float[] p) { if (normalBuffer == null) return; normalBuffer .position(index * 3); normalBuffer.get(p); normalBuffer .position(0); } /** indexの頂点の法線をpに新しく格納する */ public void getNormal(int index, Vector3f p) { if (normalBuffer == null) return; p.x = normalBuffer.get(index * 3); p.y = normalBuffer.get(index * 3 + 1); p.z = normalBuffer.get(index * 3 + 2); } public void setCoordinate(int index, float[] p) { vertexBuffer.position(index * 3); vertexBuffer.put(p); vertexBuffer.position(0); } public void setCoordinate(int index, double[] p) { vertexBuffer.position(index * 3); vertexBuffer.put((float)p[0]); vertexBuffer.put((float)p[1]); vertexBuffer.put((float)p[2]); vertexBuffer.position(0); } public void setCoordinate(int index, Point3d p) { vertexBuffer.position(index * 3); vertexBuffer.put((float)p.x); vertexBuffer.put((float)p.y); vertexBuffer.put((float)p.z); vertexBuffer.position(0); } public void setCoordinates(int index, float[] p) { vertexBuffer.position(index * 3); vertexBuffer.put(p); vertexBuffer.position(0); } public void setCoordinates(int index, double[] p) { vertexBuffer.position(index * 3); for (int i = 0; i < p.length; i++) { vertexBuffer.put((float)p[i]); } vertexBuffer.position(0); } public void setNormal(int index, float[] n) { if (normalBuffer == null) return; normalBuffer .position(index * 3); normalBuffer.put(n); normalBuffer.position(0); } public void setNormal(int index, Vector3f n) { if (normalBuffer == null) return; normalBuffer.position(index * 3); normalBuffer.put(n.x); normalBuffer.put(n.y); normalBuffer.put(n.z); normalBuffer.position(0); } public void setTextureCoordinate(int index, float[] texCoord) { if ((vertexFormat & TEXTURE_COORDINATE_2) != 0) { uvBuffer.position(index * 2); uvBuffer.put(texCoord[0]); uvBuffer.put(texCoord[1]); } else if ((vertexFormat & TEXTURE_COORDINATE_3) != 0) { uvBuffer.position(index * 3); uvBuffer.put(texCoord[0]); uvBuffer.put(texCoord[1]); uvBuffer.put(texCoord[2]); } else if ((vertexFormat & TEXTURE_COORDINATE_4) != 0) { uvBuffer.position(index * 4); uvBuffer.put(texCoord[0]); uvBuffer.put(texCoord[1]); uvBuffer.put(texCoord[2]); uvBuffer.put(texCoord[3]); } uvBuffer.position(0); } public void setTextureCoordinates(int index, float[] texCoords) { if ((vertexFormat & TEXTURE_COORDINATE_2) != 0) { ByteBuffer vbb3 = ByteBuffer.allocateDirect((texCoords.length + index) * 4 * 2); vbb3.order(ByteOrder.nativeOrder()); uvBuffer = vbb3.asFloatBuffer(); uvBuffer.position(index * 2); } else if ((vertexFormat & TEXTURE_COORDINATE_3) != 0) { ByteBuffer vbb3 = ByteBuffer.allocateDirect((texCoords.length + index) * 4 * 3); vbb3.order(ByteOrder.nativeOrder()); uvBuffer = vbb3.asFloatBuffer(); uvBuffer.position(index * 3); } else if ((vertexFormat & TEXTURE_COORDINATE_4) != 0) { ByteBuffer vbb3 = ByteBuffer.allocateDirect((texCoords.length + index) * 4 * 4); vbb3.order(ByteOrder.nativeOrder()); uvBuffer = vbb3.asFloatBuffer(); uvBuffer.position(index * 4); } uvBuffer.put(texCoords); uvBuffer.position(0); } public FloatBuffer getVertexBuffer() { return vertexBuffer; } public FloatBuffer getNormalBuffer() { return normalBuffer; } public FloatBuffer getUVBuffer() { return uvBuffer; } }