頂点配列、UV配列をモデルのファイルから読み込んで管理するために、Subsetクラスを作ってます。
モデルデータをパースする際、頂点数などが先に分かっている場合はいいのですが、それが明記されてないファイル形式も多々あるので、可変長にせざるを得ない。 でも可変長だからといって、単純にArrayList
ので、FloatArrayListなんつーものも作ってあります。
package com.dividebyzero.KszGameBase; /** * 勝手に作ったFloat型のArrayList * ArrayListでも悪くはないけど、オートボクシングがかかって内部でfloat→new Float()がかかってると考えると耐えられないので * 作ってみた。効果は不明。 * @author ksz * */ class FloatArrayList { private int lastIndex; private float[] array; private static final float[] emptyArray = new float[0]; public FloatArrayList() { this(0); } public FloatArrayList(int capacity) { lastIndex = 0; try { array = newElementArray(capacity); } catch (NegativeArraySizeException e) { throw new IllegalArgumentException(); } } private float[] newElementArray(int size) { if (size == 0) { return emptyArray; } return new float[size]; } public boolean add(float object) { if (lastIndex == array.length) { //いっぱいになっちゃった int size = size(); int increment = size / 2; if (increment < 12) { increment = 12; } float[] newArray = newElementArray(size + increment); if (size > 0) { System.arraycopy(array, 0, newArray, 0, size); lastIndex = size; } array = newArray; } array[lastIndex++] = object; return true; } public float[] toArray() { int size = size(); float[] result = new float[size]; System.arraycopy(array, 0, result, 0, size); return result; } public float[] getFloatArray() { return array; } public int size() { return lastIndex; } }
そして、↑を使ってSubsetクラス。
ただデータを貯めこむのと、そこからVBOを作れるだけ。
/**
* Meshを作る前段階のクラス。 必要かどうかよくわかんなくなってきた
* @author ksz
*
*/
public class Subset {
private FloatArrayList vertexList = new FloatArrayList();
private FloatArrayList uvList = new FloatArrayList();
private Texture tex;
private int vCnt, uvCnt;
public float r, g, b, a, diffuse, ambient;
public Texture getTex() {
return tex;
}
public int getVCnt() {
return vCnt;
}
public int getUVCnt() {
return uvCnt;
}
/**
* 頂点を格納していく
* @param x
* @param y
* @param z
*/
public void addVertex(float x, float y, float z) {
vertexList.add(x);
vertexList.add(y);
vertexList.add(z);
vCnt++;
}
/**
* UV座標の格納
* @param u
* @param v
*/
public void addUV(float u, float v) {
uvList.add(u);
uvList.add(v);
uvCnt++;
}
/**
* 仕様しているテクスチャのセット
* @param tex
*/
public void addTexture(Texture tex) {
this.tex = tex;
}
/**
* セットされた頂点、UVからVBOを作成して返す
* @return 作成されたVBO
*/
public Vbo makeVBO() {
Vbo retVBO = new Vbo();
retVBO.makeBuffer(vertexList.getFloatArray(), vertexList.size(), uvList.getFloatArray(), uvList.size());
retVBO.r = r;
retVBO.g = g;
retVBO.b = b;
retVBO.diffuse = diffuse;
retVBO.ambient = ambient;
return retVBO;
}
}
ところどころメンバ変数がpublicなのは単純に面倒だったのと、これを直接いじる人もおらんだろうという想像から。 加えて言うならこれをセッターゲッターにしたときのオーバーヘッドを減らしたかった・・・という欺瞞もありで。
0 件のコメント:
コメントを投稿