頂点配列、UV配列をモデルのファイルから読み込んで管理するために、Subsetクラスを作ってます。
モデルデータをパースする際、頂点数などが先に分かっている場合はいいのですが、それが明記されてないファイル形式も多々あるので、可変長にせざるを得ない。 でも可変長だからといって、単純にArrayList
ので、FloatArrayListなんつーものも作ってあります。
- package com.dividebyzero.KszGameBase;
- /**
- * 勝手に作ったFloat型のArrayList
- * ArrayList<float>でも悪くはないけど、オートボクシングがかかって内部で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;
- }
- }
- </float>
そして、↑を使って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 件のコメント:
コメントを投稿