diff --git a/.gitignore b/.gitignore index 5b82029..c699e48 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ /.idea/libraries /.idea/modules.xml /.idea/workspace.xml +/.idea/cache .DS_Store /build /captures diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser index bd5fd19..7ce4ae2 100644 --- a/.idea/caches/build_file_checksums.ser +++ b/.idea/caches/build_file_checksums.ser Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e329a11..7c3c703 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -43,6 +43,16 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTButton.java b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTButton.java new file mode 100644 index 0000000..a208c76 --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTButton.java @@ -0,0 +1,36 @@ +package org.ntlab.radishforandroidstudio.framework.RWT; + +import android.view.InputEvent; + +import org.ntlab.radishforandroidstudio.framework.listener.TouchListener; + +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 + 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/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTImageLoader.java b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTImageLoader.java new file mode 100644 index 0000000..3c5afc1 --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTImageLoader.java @@ -0,0 +1,91 @@ +package org.ntlab.radishforandroidstudio.framework.RWT; + +import android.content.res.Resources; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; + +import org.ntlab.radishforandroidstudio.java3d.ImageComponent2D; +import org.ntlab.radishforandroidstudio.java3d.Texture; +import org.ntlab.radishforandroidstudio.java3d.Texture2D; + +import java.io.InputStream; + +/** + * 画像ローダー + * 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); + } + if (format == ImageComponent2D.FORMAT_RGBA) { + bitmap.setHasAlpha(true); + } + 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/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTRenderer.java b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTRenderer.java index 8213ff5..9c8a9d5 100644 --- a/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTRenderer.java +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTRenderer.java @@ -1,34 +1,45 @@ package org.ntlab.radishforandroidstudio.framework.RWT; -import android.opengl.GLSurfaceView.Renderer; - -import java.util.ArrayList; - import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10; +import android.opengl.GLSurfaceView.Renderer; + import org.ntlab.radishforandroidstudio.framework.view3D.Camera3D; import org.ntlab.radishforandroidstudio.framework.view3D.Viewer3D; import org.ntlab.radishforandroidstudio.java3d.GraphicsContext3D; import org.ntlab.radishforandroidstudio.java3d.Light; +import java.util.ArrayList; + public class RWTRenderer implements Renderer { protected Viewer3D viewer; protected Camera3D camera; protected GraphicsContext3D gc3D = null; + protected RWTSprites sprites = new RWTSprites(); + protected GL10 gl; public RWTRenderer() { super(); } - + public void attachCamera(Camera3D camera) { // onSurfaceCreated()より先に呼ばれる this.camera = camera; 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/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTSprite.java b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTSprite.java new file mode 100644 index 0000000..ab4cb5f --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTSprite.java @@ -0,0 +1,139 @@ +package org.ntlab.radishforandroidstudio.framework.RWT; + +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.opengl.GLUtils; + +import org.ntlab.radishforandroidstudio.framework.model3D.Position3D; +import org.ntlab.radishforandroidstudio.java3d.ImageComponent2D; +import org.ntlab.radishforandroidstudio.java3d.Texture; +import org.ntlab.radishforandroidstudio.java3d.TextureLoader; + +/** + * 画像管理クラス + * 座標は左下が原点であることに注意(DirectXは左上のため) + * + * @author s.iwatani + */ +public class RWTSprite { + 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); + 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 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 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, boolean isEnableAlpha) { + texLoader = new RWTImageLoader(res, id, + TextureLoader.BY_REFERENCE | TextureLoader.Y_UP, + isEnableAlpha ? ImageComponent2D.FORMAT_RGBA : ImageComponent2D.FORMAT_RGB); + 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.set(0.0, 0.0, 0.0); + viewSize.setX((float)image.getBitmap().getWidth()); + viewSize.setY((float)image.getBitmap().getHeight()); + } + + /** + * 画像を描画する + * + * @author s.iwatani + * @param gl GL10 + */ + public void draw(GL10 gl) { + boolean isNullTextureId = textureId == null; + if (isNullTextureId) { + textureId = new int[1]; + gl.glGenTextures(1, textureId, 0); + } + //テクスチャIDに対応するテクスチャをバインドする + 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(), (int)pos.getZ(), (int)viewSize.getX(), (int)viewSize.getY()); + } +} diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTSprites.java b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTSprites.java new file mode 100644 index 0000000..209b4dd --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTSprites.java @@ -0,0 +1,69 @@ +package org.ntlab.radishforandroidstudio.framework.RWT; + +import javax.microedition.khronos.opengles.GL10; +import java.util.ArrayList; + +/** + * スプライト管理クラス + * + * @author s.iwatani + */ +public class RWTSprites { + private ArrayList sprites = new ArrayList<>(); + + public RWTSprites() {} + + /** + * スプライトの追加 + * + * @author s,iwatani + * @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.glDisable(GL10.GL_LIGHTING); + +// gl.glEnable(GL10.GL_ALPHA_TEST); + // アルファ値を適用するための一連 + gl.glEnable(GL10.GL_ALPHA); // GL_INVALID_ENUMが出るけどちゃんと動いてる.謎 + gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA); + gl.glEnable(GL10.GL_BLEND); + + 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); + gl.glEnable(GL10.GL_LIGHTING); + gl.glDisable(GL10.GL_ALPHA); + } +} diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTSurfaceView.java b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTSurfaceView.java index 2aa9093..7b1451b 100644 --- a/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTSurfaceView.java +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTSurfaceView.java @@ -5,19 +5,23 @@ import org.ntlab.radishforandroidstudio.framework.view3D.Camera3D; +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); + this.setRenderer(renderer); } } @@ -25,4 +29,11 @@ renderer.attachCamera(camera); } + public void addSprite(RWTSprite sprite) { + sprites.addSprite(sprite); + } + + public void removeSprite(RWTSprite sprite) { + sprites.removeSprite(sprite); + } } diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/framework/listener/MyListener.java b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/listener/MyListener.java new file mode 100644 index 0000000..921be0f --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/listener/MyListener.java @@ -0,0 +1,7 @@ +package org.ntlab.radishforandroidstudio.framework.listener; + +import android.view.InputEvent; + +public interface MyListener { + public boolean onEvent(InputEvent event); +} diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/framework/listener/TouchListener.java b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/listener/TouchListener.java new file mode 100644 index 0000000..b8a49a8 --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/listener/TouchListener.java @@ -0,0 +1,13 @@ +package org.ntlab.radishforandroidstudio.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/app/src/main/java/org/ntlab/radishforandroidstudio/framework/subject/MySubject.java b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/subject/MySubject.java new file mode 100644 index 0000000..d93fc72 --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/subject/MySubject.java @@ -0,0 +1,22 @@ +package org.ntlab.radishforandroidstudio.framework.subject; + +import android.view.InputEvent; + +import java.util.Set; +import java.util.concurrent.CopyOnWriteArraySet; + +import org.ntlab.radishforandroidstudio.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/app/src/main/java/org/ntlab/radishforandroidstudio/spriteTest/TestActivity.java b/app/src/main/java/org/ntlab/radishforandroidstudio/spriteTest/TestActivity.java new file mode 100644 index 0000000..b7affa1 --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/spriteTest/TestActivity.java @@ -0,0 +1,150 @@ +package org.ntlab.radishforandroidstudio.spriteTest; + +import android.os.Bundle; +import android.util.Log; +import android.view.Menu; +import android.view.MenuItem; +import android.view.MotionEvent; + +import org.ntlab.radishforandroidstudio.R; +import org.ntlab.radishforandroidstudio.framework.RWT.RWTSprite; +import org.ntlab.radishforandroidstudio.framework.RWT.RWTSurfaceView; +import org.ntlab.radishforandroidstudio.framework.gameMain.RealTimeActivity; +import org.ntlab.radishforandroidstudio.framework.model3D.Object3D; +import org.ntlab.radishforandroidstudio.framework.model3D.Position3D; +import org.ntlab.radishforandroidstudio.framework.model3D.Universe; +import org.ntlab.radishforandroidstudio.framework.physics.AngularVelocity3D; +import org.ntlab.radishforandroidstudio.framework.physics.Force3D; +import org.ntlab.radishforandroidstudio.framework.physics.PhysicalSystem; +import org.ntlab.radishforandroidstudio.framework.physics.Solid3D; +import org.ntlab.radishforandroidstudio.framework.physics.Velocity3D; +import org.ntlab.radishforandroidstudio.framework.view3D.Camera3D; +import org.ntlab.radishforandroidstudio.java3d.Appearance; +import org.ntlab.radishforandroidstudio.java3d.Box; +import org.ntlab.radishforandroidstudio.java3d.Material; +import org.ntlab.radishforandroidstudio.java3d.TextureCubeMap; +import org.ntlab.radishforandroidstudio.java3d.TextureLoader; +import org.ntlab.radishforandroidstudio.java3d.Transform3D; + +public class TestActivity extends RealTimeActivity { + private PhysicalSystem physicalSystem; + private Object3D groundObj; + private Solid3D ground; + private Transform3D initTrans; + private Solid3D diceObj; + + private RWTSprite[] sprite = new RWTSprite[3]; + + @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[0] = new RWTSprite(view); + sprite[0].setTexture(getResources(), R.drawable.dice_6, false); + + sprite[1] = new RWTSprite(view); + sprite[1].setTexture(getResources(), R.drawable.wadahand, true); + sprite[1].setPosition(100, 100); + + sprite[2] = new RWTSprite(view); + sprite[2].setTexture(getResources(), R.drawable.tss_thumb, true); + sprite[2].setPosition(100, 100); + 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); + } +} diff --git a/app/src/main/res/drawable/tss_thumb.png b/app/src/main/res/drawable/tss_thumb.png new file mode 100644 index 0000000..18e0ca2 --- /dev/null +++ b/app/src/main/res/drawable/tss_thumb.png Binary files differ diff --git a/app/src/main/res/drawable/wadahand.png b/app/src/main/res/drawable/wadahand.png new file mode 100644 index 0000000..7294a18 --- /dev/null +++ b/app/src/main/res/drawable/wadahand.png Binary files differ