テクスチャを再読込する部分で詰まったので質問させていただきます。
テクスチャの読み込みと描画はできています。
しかし、アクティビティがポーズ状態になった際にテクスチャは自動的に開放されるようで、再読み込みを行いたいのですがうまくいきません。
アクティビティの再開時に下のクラスのreloadTextureメソッドを呼び出してテクスチャを再読み込みしようとしたのですがうまくいきません。
テクスチャはHashMap型のtexMapで管理しています。keyを画像のリソースIDにし、valueをテクスチャナンバーにして描画時drawメソッドにリソースIDを渡して、それに応じたテクスチャをバインドするようにしています。リソースIDは一度だけですが実験の結果アクティビティのポーズ前後で変化がなかったので、texMapのKey(リソースID)をfor文の中でloadTextureの引数に与えて全て再度読み込みすればいいと考えたのですがうまくいきません。
アドバイスお願いします。
テクスチャの読み込みと描画用クラス(一部略)
package glView;
import java.io.IOException;
import java.io.InputStream;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import java.util.HashMap;
import java.util.Map;
import javax.microedition.khronos.opengles.GL10;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.opengl.GLUtils;
public class TexbyArray {
//テクスチャNo
public int textureNo;
//表示位置
float pos_x;
float pos_y;
float pos_z;
//テクスチャ(画像)の位置とサイズ
int texX;
int texY;
int texWidth;
int texHeight;
float width;
float height;
//表示倍率
final int DEFAULT_SCALE = 1;
int scale = 1;
//テクスチャ用連想配列。
static HashMap<Integer,Integer> texMap = new HashMap<Integer,Integer>();//(ResorceID,glTextureID)
float uv[] = {
0.0f, 0.0f,// !< 左上
0.0f, 1.0f,// !< 左下
1.0f, 0.0f,// !< 右上
1.0f, 1.0f,// !< 右下
};
public void reloadTexture(GL10 gl ,Resources res){//ハッシュマップに読みこまれたテクスチャ再読み込み
for (Map.Entry entry : texMap.entrySet()) {// entry.getKey() => キー // entry.getValue() => 値
loadTexture(gl,res,(Integer)entry.getKey());
}
}
Bitmap loadTexture(GL10 gl, Resources res, int id){
InputStream is = res.openRawResource(id);
Bitmap bitmap;
try{
bitmap = BitmapFactory.decodeStream(is);
}
finally{
try{
is.close();
}
catch(IOException e){ }
}
gl.glEnable(GL10.GL_ALPHA_TEST);
gl.glEnable(GL10.GL_BLEND);
gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
gl.glTexEnvf(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE, GL10.GL_MODULATE);
//テクスチャIDを割り当てる
int[] textureID = new int[1];
gl.glGenTextures(1, textureID, 0);
textureNo = textureID[0];//↓ 連想配列化して管理
texMap.put(id, textureNo);
//テクスチャIDのバインド
gl.glBindTexture(GL10.GL_TEXTURE_2D, textureNo);//textureNo
//OpenGL ES用のメモリ領域に画像データを渡す。上でバインドされたテクスチャIDと結び付けられる。
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);
//テクスチャ座標が1.0fを超えたときの、テクスチャを繰り返す設定
gl.glTexParameterx(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_WRAP_S, GL10.GL_REPEAT );
gl.glTexParameterx(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_WRAP_T, GL10.GL_REPEAT );
//テクスチャを元のサイズから拡大、縮小して使用したときの色の使い方を設定
gl.glTexParameterx(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_NEAREST );
gl.glTexParameterx(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST );
return bitmap;
}
public void setTexture( GL10 gl, Resources res, int id ){
setTexPosition(loadTexture(gl, res, id));
}
void setTexPosition(Bitmap bitmap){
texX = 0;
texY = bitmap.getHeight();
pos_x = 0;
pos_y = 0;
pos_z = 0;
texWidth = bitmap.getWidth();
texHeight = bitmap.getHeight();
width = bitmap.getWidth();
height = bitmap.getHeight();
}
public void draw( GL10 gl, int id ){
gl.glBindTexture(GL10.GL_TEXTURE_2D, texMap.get(id));
//-------------------------------------------------------------
//テクスチャ座標の位置とデータを指定
// 位置情報 uvは左上が(0,0)
// ※本当は左下が(0,0)だが画像が上下ひっくり返る為、左上が(0,0)と考える
ByteBuffer bbuv = ByteBuffer.allocateDirect(uv.length * 4);
bbuv.order(ByteOrder.nativeOrder());
FloatBuffer fbuv = bbuv.asFloatBuffer();
fbuv.put(uv);
fbuv.position(0);
// テクスチャバッファの成分を有効にする。
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
// 1.要素数uv 2つ
// 2.Bufferが格納されている型の指定
// 3.第一引数を読み込んだ後、読み込みをスキップする数
// 4.値が格納されているバッファの指定
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, fbuv);
//-------------------------------------------------------------
// ! 位置情報
float positions[] = {
pos_x ,pos_y ,0,
pos_x ,pos_y+(height*scale) ,0,
pos_x+(width*scale) ,pos_y ,0,
pos_x+(width*scale) ,pos_y+(height*scale) ,0
};
// ! OpenGLはビッグエンディアンではなく、CPUごとの
//ネイティブエンディアンで数値を伝える必要がある。
// ! そのためJavaヒープを直接的には扱えず、
//java.nio配下のクラスへ一度値を格納する必要がある。
ByteBuffer bb = ByteBuffer.allocateDirect(positions.length * 4);
bb.order(ByteOrder.nativeOrder());
FloatBuffer fb = bb.asFloatBuffer();
fb.put(positions);
fb.position(0);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, fb);
// 1.モード(GL_TRIANGLE_STRIP:連続した三角形)
// 2.何番目の頂点から描画を行なうかを指定
// 3.いくつの頂点を利用するかを指定
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
//-------------------------------------------------------------
//1776 1080
}
public void draw( GL10 gl, int id ,float _x, float _y ){
setPosition(_x, _y);
draw(gl, id);
}
}