diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 010dfa3..1b6254b 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -31,6 +31,15 @@ + + + + + + + diff --git a/src/framework/RWT/RWTButton.java b/src/framework/RWT/RWTButton.java new file mode 100644 index 0000000..96b6952 --- /dev/null +++ b/src/framework/RWT/RWTButton.java @@ -0,0 +1,32 @@ +package framework.RWT; + +import android.view.InputEvent; + +import framework.listener.TouchListener; + +public class RWTButton extends RWTSprite implements TouchListener { + + public RWTButton(final RWTSurfaceView surface) { + super(surface); + } + + @Override + public boolean onEvent(InputEvent event) { + return false; + } + + @Override + public boolean onTouch(InputEvent event) { + return false; + } + + @Override + public boolean onLongPress(InputEvent event) { + return false; + } + + @Override + public boolean onRelease(InputEvent event) { + return false; + } +} diff --git a/src/framework/RWT/RWTRenderer.java b/src/framework/RWT/RWTRenderer.java index 70025a2..086b751 100644 --- a/src/framework/RWT/RWTRenderer.java +++ b/src/framework/RWT/RWTRenderer.java @@ -16,6 +16,8 @@ protected Viewer3D viewer; protected Camera3D camera; protected GraphicsContext3D gc3D = null; + protected RWTSprites sprites = new RWTSprites(); + protected GL10 gl; public RWTRenderer() { super(); @@ -27,8 +29,17 @@ viewer = new Viewer3D(camera); } + public void attachSprites(RWTSprites sprites) { + this.sprites = sprites; + } + + public GL10 getGl() { + return gl; + } + @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { + this.gl = gl; gc3D = new GraphicsContext3D(gl); ArrayList lights = camera.getUniverse().getLights(); for (int i = 0; i < lights.size(); i++){ @@ -63,5 +74,8 @@ gc3D.pushMatrix(); camera.getUniverse().render(viewer); gc3D.popMatrix(); + + // UI, HUDのレンダリング + sprites.draw(gl); } } diff --git a/src/framework/RWT/RWTSprite.java b/src/framework/RWT/RWTSprite.java index 90b36f2..c04818d 100644 --- a/src/framework/RWT/RWTSprite.java +++ b/src/framework/RWT/RWTSprite.java @@ -1,11 +1,81 @@ package framework.RWT; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; -import myLibrary.Position; +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; +import java3d.ImageComponent2D; +import java3d.Texture; +import java3d.TextureLoader; public class RWTSprite { - private int textureNo; + private int[] textureNo = null; + private TextureLoader texLoader; + private Texture tex; // 表示座標 - private Position pos; + private Position3D pos = new Position3D(0.f, 0.f, 0.f); + private Position3D texSize = new Position3D(0.f, 0.f, 0.f); + 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); + } + + final public Position3D getPosition() { + return pos; + } + + final public Position3D getViewSize() { + return viewSize; + } + + final public Position3D getTextureSize() { + return texSize; + } + + /** + * テクスチャ設定 + * + * @author s.iwatani + * @param res + * @param id + */ + public void setTexture(Resources res, int id, int flags, GL10 gl) { + texLoader = new TextureLoader(res, id, flags); + ImageComponent2D image = texLoader.getImage(); + tex = texLoader.getTexture(); + texPos.setX(0.f); + texPos.setY(image.getBitmap().getHeight()); + texSize.setX(image.getBitmap().getWidth()); + texSize.setY(-image.getBitmap().getHeight()); + pos.setX(0.f); + pos.setY(0.f); + pos.setZ(0.f); + viewSize.setX((float)image.getBitmap().getWidth()); + viewSize.setY((float)image.getBitmap().getHeight()); + } + + public void draw(GL10 gl) { + int[] 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()}; + ((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()); + } } diff --git a/src/framework/RWT/RWTSprites.java b/src/framework/RWT/RWTSprites.java new file mode 100644 index 0000000..7c27db5 --- /dev/null +++ b/src/framework/RWT/RWTSprites.java @@ -0,0 +1,40 @@ +package framework.RWT; + +import javax.microedition.khronos.opengles.GL10; +import java.util.ArrayList; + +public class RWTSprites { + private ArrayList sprites = new ArrayList(); + + public RWTSprites() {} + + /** + * スプライトの追加 + * + * @author s,iwatani + * @param sprite RWTSprite + */ + public void addSprite(RWTSprite sprite) { + sprites.add(sprite); + } + + public void removeSprite(RWTSprite sprite) { + sprites.remove(sprite); + } + + public void draw(GL10 gl) { + gl.glDisable(GL10.GL_DEPTH_TEST); + gl.glDisable(GL10.GL_DITHER); + gl.glEnable(GL10.GL_TEXTURE_2D); + + //テクスチャ0番をアクティブにする + gl.glActiveTexture(GL10.GL_TEXTURE0); + + for (RWTSprite sprite : sprites){ + sprite.draw(gl); + } + + gl.glEnable(GL10.GL_DEPTH_TEST); + gl.glEnable(GL10.GL_DITHER); + } +} diff --git a/src/framework/RWT/RWTSurfaceView.java b/src/framework/RWT/RWTSurfaceView.java index b092828..06924e5 100644 --- a/src/framework/RWT/RWTSurfaceView.java +++ b/src/framework/RWT/RWTSurfaceView.java @@ -4,24 +4,39 @@ import android.content.Context; import android.opengl.GLSurfaceView; +import javax.microedition.khronos.opengles.GL10; + public class RWTSurfaceView extends GLSurfaceView { protected RWTRenderer renderer; + protected RWTSprites sprites = new RWTSprites(); public RWTSurfaceView(Context context) { this(context, true); } - + public RWTSurfaceView(Context context, boolean bInitRenderer) { super(context); if (bInitRenderer) { renderer = new RWTRenderer(); + renderer.attachSprites(sprites); setEGLConfigChooser(8, 8, 8, 8, 16, 0); this.setRenderer(renderer); } } + public GL10 getGl() { + return renderer.getGl(); + } + public void attachCamera(Camera3D camera) { renderer.attachCamera(camera); } + public void addSprite(RWTSprite sprite) { + sprites.addSprite(sprite); + } + + public void removeSprite(RWTSprite sprite) { + sprites.removeSprite(sprite); + } } diff --git a/src/framework/listener/MyListener.java b/src/framework/listener/MyListener.java new file mode 100644 index 0000000..5037520 --- /dev/null +++ b/src/framework/listener/MyListener.java @@ -0,0 +1,7 @@ +package framework.listener; + +import android.view.InputEvent; + +public interface MyListener { + public boolean onEvent(InputEvent event); +} diff --git a/src/framework/listener/TouchListener.java b/src/framework/listener/TouchListener.java new file mode 100644 index 0000000..9485a61 --- /dev/null +++ b/src/framework/listener/TouchListener.java @@ -0,0 +1,13 @@ +package framework.listener; + +import android.view.InputEvent; + +public interface TouchListener extends MyListener { + + @Override + public boolean onEvent(InputEvent event); + + public boolean onTouch(InputEvent event); + public boolean onLongPress(InputEvent event); + public boolean onRelease(InputEvent event); +} diff --git a/src/framework/subject/MySubject.java b/src/framework/subject/MySubject.java new file mode 100644 index 0000000..7ad4662 --- /dev/null +++ b/src/framework/subject/MySubject.java @@ -0,0 +1,22 @@ +package framework.subject; + +import android.view.InputEvent; + +import java.util.Set; +import java.util.concurrent.CopyOnWriteArraySet; + +import framework.listener.MyListener; + +public abstract class MySubject { + protected Set listenerSet = new CopyOnWriteArraySet(); + + public void addListener(MyListener listener) { + listenerSet.add(listener); + } + + protected void notifyListeners(InputEvent event) { + for (MyListener listener : listenerSet) { + listener.onEvent(event); + } + } +} diff --git a/src/java3d/TextureLoader.java b/src/java3d/TextureLoader.java index 8d047e5..ef1a0e1 100644 --- a/src/java3d/TextureLoader.java +++ b/src/java3d/TextureLoader.java @@ -40,4 +40,7 @@ return tex; } + public Bitmap getBitmap() { + return bitmap; + } } diff --git a/src/myLibrary/Position.java b/src/myLibrary/Position.java deleted file mode 100644 index fbff896..0000000 --- a/src/myLibrary/Position.java +++ /dev/null @@ -1,78 +0,0 @@ -package myLibrary; - -/** - * 2,3次元座標を管理するクラス - * - * @author s.iwatani - * @param 数値型 - */ -public class Position implements Cloneable { - public T x, y, z; - - public Position() { - x = null; - y = null; - z = null; - } - - /** - * コンストラクタ - * - * @author s.iwatani - * @param x x座標 - * @param y y座標 - */ - public Position(T x, T y) { - this.x = x; - this.y = y; - z = null; - } - - /** - * コンストラクタ - * - * @author s.iwatani - * @param x x座標 - * @param y y座標 - * @param z z座標 - */ - public Position(T x, T y, T z) { - this.x = x; - this.y = y; - this.z = z; - } - - /** - * 2つのPositionを入れ替える - * - * @author s.iwatani - * @param t position - */ - // TODO: 動作確認 - public void swap(Position t){ - Position tmp = this.clone(); - x = t.x; - y = t.y; - z = t.z; - t = tmp; - } - - /** - * clone - * - * @author s.iwatani - * @return 新しいPosition - */ - // TODO: 動作確認 - @SuppressWarnings("unchecked") - @Override - public Position clone(){ - Position p = new Position(); - try { - p = (Position)super.clone(); - } catch (CloneNotSupportedException e) { - e.printStackTrace(); - } - return p; - } -} diff --git a/src/spriteTest/TestActivity.java b/src/spriteTest/TestActivity.java new file mode 100644 index 0000000..b528a08 --- /dev/null +++ b/src/spriteTest/TestActivity.java @@ -0,0 +1,147 @@ +package spriteTest; + +import framework.RWT.RWTRenderer; +import framework.RWT.RWTSprite; +import java3d.Appearance; +import java3d.Box; +import java3d.Material; +import java3d.Texture; +import java3d.TextureCubeMap; +import java3d.TextureLoader; +import java3d.Transform3D; + +import radish.framework.R; +import android.app.Activity; +import android.content.res.Resources; +import android.os.Bundle; +import android.util.Log; +import android.view.Menu; +import android.view.MenuItem; +import android.view.MotionEvent; +import framework.RWT.RWTSurfaceView; +import framework.gameMain.RealTimeActivity; +import framework.model3D.Object3D; +import framework.model3D.Position3D; +import framework.model3D.Universe; +import framework.physics.AngularVelocity3D; +import framework.physics.Force3D; +import framework.physics.PhysicalSystem; +import framework.physics.Solid3D; +import framework.physics.Velocity3D; +import framework.view3D.Camera3D; + +public class TestActivity extends RealTimeActivity { + private PhysicalSystem physicalSystem; + private Object3D groundObj; + private Solid3D ground; + private Transform3D initTrans; + private Solid3D diceObj; + + private RWTSprite sprite; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + // 3Dモデルの作成 + Universe universe = new Universe(); + + // サイコロの作成 + Appearance ap1 = new Appearance(); + TextureCubeMap tex1 = new TextureCubeMap(TextureCubeMap.BASE_LEVEL, TextureCubeMap.RGB, 0); + TextureLoader loader = new TextureLoader(getResources(), R.drawable.dice_1, TextureLoader.BY_REFERENCE | TextureLoader.Y_UP); + tex1.setImage(0, TextureCubeMap.POSITIVE_Z, loader.getImage()); + loader = new TextureLoader(getResources(), R.drawable.dice_6, TextureLoader.BY_REFERENCE | TextureLoader.Y_UP); + tex1.setImage(0, TextureCubeMap.NEGATIVE_Z, loader.getImage()); + loader = new TextureLoader(getResources(), R.drawable.dice_4, TextureLoader.BY_REFERENCE | TextureLoader.Y_UP); + tex1.setImage(0, TextureCubeMap.POSITIVE_X, loader.getImage()); + loader = new TextureLoader(getResources(), R.drawable.dice_3, TextureLoader.BY_REFERENCE | TextureLoader.Y_UP); + tex1.setImage(0, TextureCubeMap.NEGATIVE_X, loader.getImage()); + loader = new TextureLoader(getResources(), R.drawable.dice_5, TextureLoader.BY_REFERENCE | TextureLoader.Y_UP); + tex1.setImage(0, TextureCubeMap.POSITIVE_Y, loader.getImage()); + loader = new TextureLoader(getResources(), R.drawable.dice_2, TextureLoader.BY_REFERENCE | TextureLoader.Y_UP); + tex1.setImage(0, TextureCubeMap.NEGATIVE_Y, loader.getImage()); + ap1.setTexture(tex1); + physicalSystem = new PhysicalSystem(); + Box b1 = new Box(1.0f, 1.0f, 1.0f, ap1); + Object3D obj1 = new Object3D("box", b1); + obj1.apply(new Position3D(0.0 , 30.0, 0.0), false); + diceObj = new Solid3D(obj1); + diceObj.scale(2.0, 2.0, 2.0); + diceObj.apply(new AngularVelocity3D(-0.4, 0.0, -0.6), false); + universe.place(diceObj); + physicalSystem.add(diceObj); + initTrans = new Transform3D(); + obj1.rot.getTransform(initTrans); + + // 地面の作成 + Appearance ap2 = new Appearance(); + Material m = new Material(); + m.setDiffuseColor(1.0f, 1.0f, 1.0f); + m.setAmbientColor(0.5f, 0.5f, 0.5f); + m.setSpecularColor(0.0f, 0.0f, 0.0f); + m.setShininess(1.0f); + ap2.setMaterial(m); + + Box b2 = new Box(1.0f, 1.0f, 1.0f, ap1); + groundObj = new Object3D("ground", b2); + groundObj.apply(new Position3D(0.0, -3.0, 0.0), false); + groundObj.scale(100.0, 3.0, -50.0); + ground = new Solid3D(groundObj); + ground.setMass(100000000); + universe.place(ground); + physicalSystem.add(ground); + + // カメラの作成 + Camera3D camera = new Camera3D(universe); + camera.setViewPoint(new Position3D(0.0, 30, -30.0)); + camera.addTarget(diceObj); + + // 画面との関連付け + RWTSurfaceView view = new RWTSurfaceView(this); + view.attachCamera(camera); + setContentView(view); + + sprite = new RWTSprite(view); + sprite.setTexture(getResources(), R.drawable.dice_6, TextureLoader.BY_REFERENCE | TextureLoader.Y_UP, view.getGl()); + + start(10); + } + + @Override + protected void update(long interval) { + ground.apply(new Position3D(0.0, -3.0, 0.0), false); + ground.apply(new Velocity3D(), false); + groundObj.rot.setTransform(initTrans); + + long newTime = System.nanoTime(); + physicalSystem.motion(0, 10, Force3D.ZERO, physicalSystem.objects.get(0).getGravityCenter(), null); + Log.v("moji", "" + ((System.nanoTime()-newTime)/1000.0)); + } + + @Override + public void onDestroy() { + super.onDestroy(); + } + + @Override + public boolean onTouchEvent(MotionEvent event){ + physicalSystem.objects.get(0).setPosition(new Position3D(0.0 , 30.0, 0.0)); + return true; + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.main, menu); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + int id = item.getItemId(); + if (id == R.id.action_settings) { + return true; + } + return super.onOptionsItemSelected(item); + } +}