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);
+ }
+}