diff --git a/src/framework/RWT/RWTButton.java b/src/framework/RWT/RWTButton.java index 96b6952..cdcd79d 100644 --- a/src/framework/RWT/RWTButton.java +++ b/src/framework/RWT/RWTButton.java @@ -4,10 +4,14 @@ import framework.listener.TouchListener; -public class RWTButton extends RWTSprite implements TouchListener { - - public RWTButton(final RWTSurfaceView surface) { - super(surface); +public class RWTButton implements TouchListener { + private RWTSprite[] sprite = null; + RWTSurfaceView view; + public RWTButton(final RWTSurfaceView view) { + this.view = view; + sprite = new RWTSprite[2]; + sprite[0] = new RWTSprite(view); + sprite[1] = new RWTSprite(view); } @Override diff --git a/src/framework/RWT/RWTImageLoader.java b/src/framework/RWT/RWTImageLoader.java new file mode 100644 index 0000000..7861ca2 --- /dev/null +++ b/src/framework/RWT/RWTImageLoader.java @@ -0,0 +1,88 @@ +package framework.RWT; + +import android.content.res.Resources; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; + +import java.io.InputStream; + +import java3d.ImageComponent2D; +import java3d.Texture; +import java3d.Texture2D; + +/** + * 画像ローダー + * java3d.TextureLoaderから取ってきた + * 物体に貼り付けるテクスチャとかには使えないと思われる + * RWTSprite用 + * + * @author s.iwatani + */ +public class RWTImageLoader { + public static final int BY_REFERENCE = 2; + public static final int Y_UP = 4; + private InputStream in = null; + private Resources res = null; + private int id = 0; + private Bitmap bitmap; + private int format, texFormat; + + public RWTImageLoader(InputStream in, int flags) { + this.in = in; + } + + public RWTImageLoader(Resources res, int id, int flags) { + this(res, id, flags, ImageComponent2D.FORMAT_RGB); + } + + /** + * TextureLoaderコンストラクタ + * + * @author s.iwatani + * @param res Resources + * @param id リソースID + * @param flags 知らん + * @param format 画像がRGBかRGBAか ImageComponent2D.FORMAT_RGBまたはImageComponent2D.FORMAT_RGBA + */ + public RWTImageLoader(Resources res, int id, int flags, int format) { + this.res = res; + this.id = id; + setFormat(format); + } + + /** + * 画像がRGBかRGBAかをセット + * + * @param format ImageComponent2D.FORMAT_RGBまたはImageComponent2D.FORMAT_RGBA + */ + public void setFormat(int format) { + this.format = format; + if (this.format == ImageComponent2D.FORMAT_RGB) { + texFormat = Texture.RGB; + } + else { + texFormat = Texture.RGBA; + } + } + + public ImageComponent2D getImage() { + if (in != null) { + bitmap = BitmapFactory.decodeStream(in); + } else if (res != null) { + bitmap = BitmapFactory.decodeResource(res, id); + } + return new ImageComponent2D(format, bitmap); + } + + public ImageComponent2D setImage(Bitmap bitmap) { + this.bitmap = bitmap; + return new ImageComponent2D(format, this.bitmap); + } + + public Texture getTexture() { + ImageComponent2D ic2 = getImage(); + Texture tex = new Texture2D(Texture.BASE_LEVEL, texFormat, bitmap.getWidth(), bitmap.getHeight()); + tex.setImage(0, ic2); + return tex; + } +} diff --git a/src/framework/RWT/RWTSprite.java b/src/framework/RWT/RWTSprite.java index c04818d..01555be 100644 --- a/src/framework/RWT/RWTSprite.java +++ b/src/framework/RWT/RWTSprite.java @@ -1,17 +1,9 @@ package framework.RWT; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; - import javax.microedition.khronos.opengles.GL10; import javax.microedition.khronos.opengles.GL11; import javax.microedition.khronos.opengles.GL11Ext; import android.content.res.Resources; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.opengl.GLES20; -import android.opengl.GLSurfaceView; import android.opengl.GLUtils; import framework.model3D.Position3D; @@ -19,10 +11,17 @@ import java3d.Texture; import java3d.TextureLoader; +/** + * 画像管理クラス + * 座標は左下が原点であることに注意(DirectXは左上のため) + * + * @author s.iwatani + */ public class RWTSprite { - private int[] textureNo = null; - private TextureLoader texLoader; + private int[] textureId = null; + private RWTImageLoader texLoader; private Texture tex; + private ImageComponent2D image = null; // 表示座標 private Position3D pos = new Position3D(0.f, 0.f, 0.f); @@ -30,32 +29,73 @@ private Position3D texPos = new Position3D(0.f, 0.f, 0.f); private Position3D viewSize = new Position3D(0.f, 0.f, 0.f); - public RWTSprite(final RWTSurfaceView surface) { - surface.addSprite(this); + public RWTSprite(final RWTSurfaceView view) { + view.addSprite(this); } + /** + * 表示する座標を取得 + * + * @author s.iwatani + * @return Position3D + */ final public Position3D getPosition() { return pos; } + /** + * 表示サイズを取得 + * + * @author s.iwatani + * @return Position3D + */ final public Position3D getViewSize() { return viewSize; } + /** + * 画像サイズを取得 + * + * @author s.iwatani + * @return Position3D + */ final public Position3D getTextureSize() { return texSize; } /** - * テクスチャ設定 + * 描画する座標をセット * * @author s.iwatani - * @param res - * @param id + * @param x x座標 + * @param y y座標 + */ + public void setPosition(float x, float y) { + pos.setX(x); + pos.setY(y); + } + + /** + * 描画する座標をセット + * @param pos Position3D + */ + public void setPosition(Position3D pos) { + setPosition((float)pos.getX(), (float)pos.getY()); + } + + /** + * テクスチャをセット + * + * @author s.iwatani + * @param res Resources + * @param id リソースのID R.drawable.なんちゃらみたいなやつ + * + * TODO: 画像サイズが元と違うため,そのサイズが元のものになるようにする + * Bitmap.createScaledBitmap(robot, 100, 100, false);のやつ */ public void setTexture(Resources res, int id, int flags, GL10 gl) { - texLoader = new TextureLoader(res, id, flags); - ImageComponent2D image = texLoader.getImage(); + texLoader = new RWTImageLoader(res, id, flags); + image = texLoader.getImage(); tex = texLoader.getTexture(); texPos.setX(0.f); texPos.setY(image.getBitmap().getHeight()); @@ -68,14 +108,31 @@ viewSize.setY((float)image.getBitmap().getHeight()); } + /** + * 画像を描画する + * + * @author s.iwatani + * @param gl GL10 + */ public void draw(GL10 gl) { - int[] textureId = new int[1]; - gl.glGenTextures(1, textureId, 0); + boolean isNullTextureId = textureId == null; + if (isNullTextureId) { + textureId = new int[1]; + gl.glGenTextures(1, textureId, 0); + } //テクスチャIDに対応するテクスチャをバインドする - gl.glBindTexture(GL10.GL_TEXTURE_2D, textureNo[0]); - //テクスチャの座標と幅と高さを指定 - int rect[] = {(int)texPos.getX(), (int)texPos.getY(), (int)texSize.getX(), (int)texSize.getY()}; + gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId[0]); + + // 初回のみ画像を流し込む + if (isNullTextureId) { + GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, image.getBitmap(), 0); + } + + // 拡大縮小のアルゴリズム指定 + gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST); + gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_NEAREST); + int rect[] = { (int)texPos.getX(), (int)texPos.getY(), (int)texSize.getX(), (int)texSize.getY()}; ((GL11) gl).glTexParameteriv(GL10.GL_TEXTURE_2D,GL11Ext.GL_TEXTURE_CROP_RECT_OES, rect, 0); - ((GL11Ext) gl).glDrawTexfOES((int)pos.getX(), (int)pos.getY(), 0, (int)viewSize.getX(), (int)viewSize.getY()); + ((GL11Ext) gl).glDrawTexfOES((int)pos.getX(), (int)pos.getY(), (int)pos.getZ(), (int)viewSize.getX(), (int)viewSize.getY()); } } diff --git a/src/framework/RWT/RWTSprites.java b/src/framework/RWT/RWTSprites.java index 7c27db5..4da374a 100644 --- a/src/framework/RWT/RWTSprites.java +++ b/src/framework/RWT/RWTSprites.java @@ -3,6 +3,11 @@ import javax.microedition.khronos.opengles.GL10; import java.util.ArrayList; +/** + * スプライト管理クラス + * + * @author s.iwatani + */ public class RWTSprites { private ArrayList sprites = new ArrayList(); @@ -12,22 +17,35 @@ * スプライトの追加 * * @author s,iwatani - * @param sprite RWTSprite + * @param sprite 追加したいRWTSprite */ public void addSprite(RWTSprite sprite) { sprites.add(sprite); } + /** + * スプライトの削除 + * + * @author s.iwatani + * @param sprite 削除したいRWTSprite + */ public void removeSprite(RWTSprite sprite) { sprites.remove(sprite); } + /** + * 登録されたスプライトの描画 + * + * @param gl GL10 + */ public void draw(GL10 gl) { + // なんかやってる gl.glDisable(GL10.GL_DEPTH_TEST); gl.glDisable(GL10.GL_DITHER); + gl.glEnable(GL10.GL_ALPHA_TEST); gl.glEnable(GL10.GL_TEXTURE_2D); - //テクスチャ0番をアクティブにする + //テクスチャ0番をアクティブにする(よくわからん) gl.glActiveTexture(GL10.GL_TEXTURE0); for (RWTSprite sprite : sprites){ diff --git a/src/spriteTest/TestActivity.java b/src/spriteTest/TestActivity.java index b528a08..72a214c 100644 --- a/src/spriteTest/TestActivity.java +++ b/src/spriteTest/TestActivity.java @@ -37,7 +37,7 @@ private Transform3D initTrans; private Solid3D diceObj; - private RWTSprite sprite; + private RWTSprite sprite, sprite2; @Override protected void onCreate(Bundle savedInstanceState) { @@ -105,6 +105,10 @@ sprite = new RWTSprite(view); sprite.setTexture(getResources(), R.drawable.dice_6, TextureLoader.BY_REFERENCE | TextureLoader.Y_UP, view.getGl()); + sprite2 = new RWTSprite(view); + sprite2.setTexture(getResources(), R.drawable.dice_1, TextureLoader.BY_REFERENCE | TextureLoader.Y_UP, view.getGl()); + sprite2.setPosition(100, 300); + start(10); }