diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser
index 6522ee3..a446cd7 100644
--- a/.idea/caches/build_file_checksums.ser
+++ b/.idea/caches/build_file_checksums.ser
Binary files differ
diff --git a/app/build.gradle b/app/build.gradle
index c80cd96..c6da7ce 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -21,6 +21,10 @@
}
}
buildToolsVersion '27.0.3'
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
}
dependencies {
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 3e28d89..73bde58 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -21,30 +21,6 @@
android:supportsRtl="true"
android:theme="@style/AppTheme">
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/tests/SampleActivity.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/tests/SampleActivity.java
index 66a0711..24d5bad 100644
--- a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/tests/SampleActivity.java
+++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/tests/SampleActivity.java
@@ -1,5 +1,7 @@
package org.ntlab.radishforandroidstudio.cactusClient.tests;
+import android.support.v4.app.FragmentManager;
+import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
@@ -11,5 +13,12 @@
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sample);
+
+ FragmentManager manager = getSupportFragmentManager();
+ FragmentTransaction transaction = manager.beginTransaction();
+ transaction.add(R.id.fragment_field, new StartFragment());
+ transaction.addToBackStack(null);
+ transaction.commit();
}
+
}
\ No newline at end of file
diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/tests/SampleGame2Fragment.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/tests/SampleGame2Fragment.java
index 5c9b210..b36586c 100644
--- a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/tests/SampleGame2Fragment.java
+++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/tests/SampleGame2Fragment.java
@@ -1,6 +1,7 @@
package org.ntlab.radishforandroidstudio.cactusClient.tests;
import android.os.Bundle;
+import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
@@ -113,6 +114,7 @@
camera.setViewLine(pocha.getDirection());
}
+ @Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/tests/SampleUiFragment.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/tests/SampleUiFragment.java
new file mode 100644
index 0000000..3bf12b0
--- /dev/null
+++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/tests/SampleUiFragment.java
@@ -0,0 +1,141 @@
+package org.ntlab.radishforandroidstudio.cactusClient.tests;
+
+
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentManager;
+import android.support.v4.app.FragmentTransaction;
+import android.view.LayoutInflater;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.FrameLayout;
+import android.widget.LinearLayout;
+
+import org.ntlab.radishforandroidstudio.R;
+import org.ntlab.radishforandroidstudio.framework.RWT.RWTSurfaceView;
+import org.ntlab.radishforandroidstudio.framework.RWT.RWTUIFragment;
+import org.ntlab.radishforandroidstudio.framework.gameMain.OvergroundActor;
+import org.ntlab.radishforandroidstudio.framework.gameMain.RealTime3DFragment;
+import org.ntlab.radishforandroidstudio.framework.model3D.BaseObject3D;
+import org.ntlab.radishforandroidstudio.framework.model3D.Object3D;
+import org.ntlab.radishforandroidstudio.framework.model3D.Position3D;
+import org.ntlab.radishforandroidstudio.framework.physics.Ground;
+import org.ntlab.radishforandroidstudio.java3d.Appearance;
+import org.ntlab.radishforandroidstudio.java3d.Box;
+import org.ntlab.radishforandroidstudio.java3d.IndexedTriangleArray;
+import org.ntlab.radishforandroidstudio.java3d.Material;
+import org.ntlab.radishforandroidstudio.java3d.Point3d;
+import org.ntlab.radishforandroidstudio.java3d.TextureCubeMap;
+import org.ntlab.radishforandroidstudio.java3d.TextureLoader;
+import org.ntlab.radishforandroidstudio.java3d.Vector3f;
+
+public class SampleUiFragment extends RealTime3DFragment {
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ // 3Dモデルの作成
+
+ // サイコロの作成
+ Appearance ap1 = new Appearance();
+ Material m = new Material();
+ m.setDiffuseColor(1.0f, 1.0f, 1.0f);
+ ap1.setMaterial(m);
+ 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);
+ Box b1 = new Box(1.0f, 1.0f, 1.0f, ap1);
+ final Object3D obj1 = new Object3D("box", b1);
+ obj1.scale(2.0, 2.0, 2.0);
+ obj1.apply(new Position3D(0.0 , 30.0, 0.0), false);
+ OvergroundActor actor = new OvergroundActor(obj1, null);
+ universe.place(actor);
+
+ // 地面の作成
+ IndexedTriangleArray groundGeometry = new IndexedTriangleArray(4,
+ IndexedTriangleArray.COORDINATES | IndexedTriangleArray.NORMALS, 6);
+ groundGeometry.setCoordinate(0, new Point3d(-20.0, 0.0, -20.0));
+ groundGeometry.setCoordinate(1, new Point3d(20.0, 0.0, -20.0));
+ groundGeometry.setCoordinate(2, new Point3d(20.0, 0.0, 20.0));
+ groundGeometry.setCoordinate(3, new Point3d(-20.0, 0.0, 20.0));
+ groundGeometry.setNormal(0, new Vector3f(0.0f, 1.0f, 0.0f));
+ groundGeometry.setNormal(1, new Vector3f(0.0f, 1.0f, 0.0f));
+ groundGeometry.setNormal(2, new Vector3f(0.0f, 1.0f, 0.0f));
+ groundGeometry.setNormal(3, new Vector3f(0.0f, 1.0f, 0.0f));
+ groundGeometry.setCoordinateIndices(0, new int[]{0, 3, 2});
+ groundGeometry.setCoordinateIndices(3, new int[]{0, 2, 1});
+ Appearance ap2 = new Appearance();
+ Material m2 = new Material();
+ m2.setDiffuseColor(0.5f, 1.0f, 0.2f);
+ ap2.setMaterial(m2);
+ Ground ground = new Ground(new BaseObject3D(groundGeometry, ap2));
+ universe.place(ground);
+
+ // カメラの設定
+ camera.setViewPoint(new Position3D(0.0, 10.0, -20.0));
+ camera.addTarget(actor);
+
+ // フレームの間隔(ms)
+ start(16);
+
+ //onCreateOptionMenuの呼び出し
+ setHasOptionsMenu(true);
+ }
+
+ @Nullable
+ @Override
+ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+ parentView = inflater.inflate(R.layout.fragment_real_time_3d, container, false);
+ initGameWindowView();
+ return parentView;
+ }
+
+ @Override
+ public void onDestroy() {
+
+ super.onDestroy();
+ }
+
+ public boolean onOptionsItemSelected(MenuItem item){
+ int id = item.getItemId();
+
+ if(id == R.id.action_settings){
+ return true;
+
+ }
+ return super.onOptionsItemSelected(item);
+ }
+
+ public void initGameWindowView() {
+ // 画面との関連付け
+ view = new RWTSurfaceView(this.getActivity());
+ view.setRenderMode(RWTSurfaceView.RENDERMODE_WHEN_DIRTY);
+ view.attachCamera(camera);
+ FrameLayout l = parentView.findViewById(R.id.game_layout);
+ l.addView(view, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT));
+
+ FragmentManager fragmentManager = getFragmentManager();
+ FragmentTransaction transaction = fragmentManager.beginTransaction();
+ Fragment f = new RWTUIFragment();
+
+ View uiLayout = parentView.findViewById(R.id.ui_layout);
+ uiLayout.setOnTouchListener((RWTUIFragment)f);
+ transaction.add(R.id.ui_layout, f);
+ transaction.commit();
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/tests/StartFragment.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/tests/StartFragment.java
index 04cc646..b6668d5 100644
--- a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/tests/StartFragment.java
+++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/tests/StartFragment.java
@@ -31,7 +31,7 @@
public void onClick(View view) {
FragmentManager manager = getFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
- transaction.replace(R.id.fragment_field,new SampleGame2Fragment());
+ transaction.replace(R.id.fragment_field,new SampleUiFragment());
transaction.addToBackStack(null);
transaction.commit();
}
diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTCameraController.java b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTCameraController.java
new file mode 100644
index 0000000..cbf951e
--- /dev/null
+++ b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTCameraController.java
@@ -0,0 +1,34 @@
+package org.ntlab.radishforandroidstudio.framework.RWT;
+
+import android.content.Context;
+import android.support.annotation.Nullable;
+import android.util.AttributeSet;
+import android.view.MotionEvent;
+
+import org.ntlab.radishforandroidstudio.framework.listener.PadListener;
+import org.ntlab.radishforandroidstudio.framework.subject.PadSubject;
+
+public class RWTCameraController extends RWTView {
+ public RWTCameraController(Context context) {
+ super(context);
+ }
+
+ public RWTCameraController(Context context, @Nullable AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public RWTCameraController(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ }
+
+ @Override
+ public boolean onTouchEvent(MotionEvent event) {
+
+
+ return true;
+ }
+
+ public void addListener(PadListener listener) {
+ PadSubject.getInstance().addListener(listener);
+ }
+}
diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTDrawable.java b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTDrawable.java
new file mode 100644
index 0000000..7fcc412
--- /dev/null
+++ b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTDrawable.java
@@ -0,0 +1,34 @@
+package org.ntlab.radishforandroidstudio.framework.RWT;
+
+import org.ntlab.radishforandroidstudio.java3d.GraphicsContext3D;
+
+/**
+ * 描画可能な要素を示すインタフェース
+ *
+ * @author s.iwatani
+ */
+public interface RWTDrawable {
+ /**
+ * 描画を行う
+ *
+ * @author s.iwatani
+ * @param gc3D
+ */
+ public void draw(GraphicsContext3D gc3D);
+
+ /**
+ * 描画するかしないかをセット
+ *
+ * @author s.iwatani
+ * @param isDraw trueで描画する
+ */
+ public void setIsDraw(boolean isDraw);
+
+ /**
+ * 描画するかしないかを取得
+ *
+ * @author s.iwatani
+ * @return boolean
+ */
+ public boolean getIsDraw();
+}
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..b571577
--- /dev/null
+++ b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTImageLoader.java
@@ -0,0 +1,100 @@
+package org.ntlab.radishforandroidstudio.framework.RWT;
+
+import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.util.DisplayMetrics;
+
+import org.ntlab.radishforandroidstudio.framework.model3D.Position3D;
+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;
+ private Position3D size = null;
+
+ 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);
+ }
+
+ size = new Position3D(bitmap.getWidth(), bitmap.getHeight(), 0.0);
+ return new ImageComponent2D(format, bitmap);
+ }
+
+ public Position3D getSize() {
+ return size;
+ }
+
+ 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/RWTPad.java b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTPad.java
new file mode 100644
index 0000000..d232c13
--- /dev/null
+++ b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTPad.java
@@ -0,0 +1,124 @@
+package org.ntlab.radishforandroidstudio.framework.RWT;
+
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.graphics.Point;
+import android.util.AttributeSet;
+import android.view.MotionEvent;
+
+import org.ntlab.radishforandroidstudio.framework.event.PadEvent;
+import org.ntlab.radishforandroidstudio.framework.listener.PadListener;
+import org.ntlab.radishforandroidstudio.framework.listener.SamplePadListener;
+import org.ntlab.radishforandroidstudio.framework.subject.PadSubject;
+
+/**
+ * Padクラス
+ * Android Viewに貼り付けているもの
+ *
+ * @author s.iwatani
+ */
+
+public class RWTPad extends RWTView {
+ private MotionEvent touchInfo = null;
+ private Point circlePos = null;
+
+ public RWTPad(Context context) {
+ super(context);
+ }
+
+ public RWTPad(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public RWTPad(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ }
+
+ /**
+ * 状態を初期化する
+ */
+ @Override
+ public void init() {
+ super.init();
+ // Listenerサンプル
+ addListener(new SamplePadListener());
+ }
+
+ /**
+ * canvasに描画を行う
+ *
+ * @param canvas
+ */
+ // TODO: 見た目の調整
+ @Override
+ public void onDraw(Canvas canvas) {
+ // super.onDraw(canvas);
+ Paint paint = this.createRedPaint();
+ canvas.drawCircle(getSize().x / 2, getSize().x / 2, getSize().x / 2, paint);
+
+ // TODO: あとでいい感じになるように修正
+ // このクラス内の他の部分も同様
+ paint.setColor(Color.BLUE);
+ if (circlePos == null) {
+ circlePos = new Point(getSize().x / 2, getSize().y / 2);
+ }
+ canvas.drawCircle(circlePos.x, circlePos.y, getSize().x / 6, paint);
+ }
+
+ private Paint createRedPaint() {
+ Paint paint = new Paint();
+ paint.setAntiAlias(true);
+ paint.setColor(Color.RED);
+ // 以下の値が小さいと点が見えない可能性があります
+ paint.setStrokeWidth(10);
+ return paint;
+ }
+
+ /**
+ * Padをタッチしたときのイベント
+ *
+ * @param event
+ * @return
+ */
+ @Override
+ public boolean onTouchEvent(MotionEvent event) {
+ // 中央からの距離を取得
+ float dx = event.getX() - getSize().x / 2;
+ float dy = event.getY() - getSize().y / 2;
+ float rawLen = (float)Math.sqrt(dx*dx + dy*dy);
+ float angle = (float)Math.atan2(dy, dx);
+ float maxLen = getSize().x / 2;
+ float len = rawLen / maxLen;
+ float fixLen = Math.max(Math.min(1.f, len), -1.f);
+
+ circlePos.x = (int)event.getX();
+ circlePos.y = (int)event.getY();
+
+ if (len > 1) {
+ circlePos.x = (int)(fixLen * Math.cos(angle) * maxLen + maxLen);
+ circlePos.y = (int)(fixLen * Math.sin(angle) * maxLen + maxLen);
+ }
+
+ touchInfo = event;
+ PadEvent padEvent = new PadEvent(event, fixLen, angle);
+ PadSubject.getInstance().notifyListeners(padEvent);
+
+ if (event.getAction() == MotionEvent.ACTION_UP) {
+ circlePos.x = getSize().x / 2;
+ circlePos.y = getSize().y / 2;
+ }
+
+ invalidate();
+ return true;
+ }
+
+ /**
+ * Pad操作時に発生するイベントのリスナを追加する
+ * @param listener
+ */
+ public void addListener(PadListener listener) {
+ PadSubject.getInstance().addListener(listener);
+ }
+}
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..ca2a4c7 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,26 +1,27 @@
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 GL10 gl;
public RWTRenderer() {
super();
}
-
+
public void attachCamera(Camera3D camera) {
// onSurfaceCreated()より先に呼ばれる
this.camera = camera;
@@ -29,6 +30,7 @@
@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++){
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..ffebc9e
--- /dev/null
+++ b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTSprite.java
@@ -0,0 +1,156 @@
+package org.ntlab.radishforandroidstudio.framework.RWT;
+
+import android.content.res.Resources;
+import android.opengl.GLUtils;
+import android.util.Log;
+import android.view.View;
+import android.widget.Button;
+import android.widget.TableLayout;
+
+import org.ntlab.radishforandroidstudio.framework.model3D.Position3D;
+import org.ntlab.radishforandroidstudio.java3d.GraphicsContext3D;
+import org.ntlab.radishforandroidstudio.java3d.ImageComponent2D;
+import org.ntlab.radishforandroidstudio.java3d.Texture;
+import org.ntlab.radishforandroidstudio.java3d.TextureLoader;
+
+import java.util.ArrayList;
+
+/**
+ * 画像管理クラス
+ * 座標は左下が原点であることに注意(DirectXは左上のため)
+ *
+ * @author s.iwatani
+ */
+public class RWTSprite implements RWTDrawable {
+ private int[] textureId = null;
+ private ImageComponent2D image = null;
+ private boolean isDraw = true;
+
+ // 表示座標
+ 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() {
+ }
+
+ /**
+ * 表示する座標を取得
+ *
+ * @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) {
+ RWTImageLoader texLoader = new RWTImageLoader(res, id,
+ TextureLoader.BY_REFERENCE | TextureLoader.Y_UP,
+ isEnableAlpha ? ImageComponent2D.FORMAT_RGBA : ImageComponent2D.FORMAT_RGB);
+ image = texLoader.getImage();
+ Texture tex = texLoader.getTexture();
+ Log.v("moji", "faaa");
+ Log.v("moji", ((Double)(texLoader.getSize().getX())).toString() + ", " + ((Double)(texLoader.getSize().getY())).toString());
+ Log.v("moji", "faaa");
+
+ 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 gc3D GL10
+ */
+ public void draw(GraphicsContext3D gc3D) {
+ if (!getIsDraw()) {
+ return;
+ }
+
+ if (textureId == null) {
+ textureId = new int[1];
+ textureId[0] = gc3D.loadImage(image);
+ }
+ gc3D.draw(textureId[0], pos, texPos, texSize, viewSize);
+ }
+
+ /**
+ * 描画するかしないかをセット
+ *
+ * @author s.iwatani
+ * @param isDraw trueで描画する
+ */
+ @Override
+ public void setIsDraw(boolean isDraw) {
+ this.isDraw = isDraw;
+ }
+
+ /**
+ * 描画するかしないかを取得
+ *
+ * @author s.iwatani
+ * @return boolean
+ */
+ @Override
+ public boolean getIsDraw() {
+ return isDraw;
+ }
+}
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..aa7b742 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
@@ -11,18 +11,17 @@
public RWTSurfaceView(Context context) {
this(context, true);
}
-
+
public RWTSurfaceView(Context context, boolean bInitRenderer) {
super(context);
if (bInitRenderer) {
renderer = new RWTRenderer();
setEGLConfigChooser(8, 8, 8, 8, 16, 0);
- this.setRenderer(renderer);
+ this.setRenderer(renderer);
}
}
public void attachCamera(Camera3D camera) {
renderer.attachCamera(camera);
}
-
}
diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTUIFragment.java b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTUIFragment.java
new file mode 100644
index 0000000..e528f91
--- /dev/null
+++ b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTUIFragment.java
@@ -0,0 +1,35 @@
+package org.ntlab.radishforandroidstudio.framework.RWT;
+
+import android.support.annotation.NonNull;
+import android.support.v4.app.Fragment;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+
+import org.ntlab.radishforandroidstudio.R;
+
+import static android.view.View.*;
+
+public class RWTUIFragment extends Fragment implements OnTouchListener {
+ public RWTUIFragment() {}
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ }
+
+ @Override
+ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ return inflater.inflate(R.layout.ui_fragment, container, false);
+ }
+
+ @Override
+ public boolean onTouch(View v, MotionEvent event) {
+ System.out.println("RWTUIFragment touch");
+ v.performClick();
+ return false;
+ }
+}
diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTView.java b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTView.java
new file mode 100644
index 0000000..6037cb1
--- /dev/null
+++ b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTView.java
@@ -0,0 +1,68 @@
+package org.ntlab.radishforandroidstudio.framework.RWT;
+
+import android.content.Context;
+import android.graphics.Point;
+import android.support.annotation.Nullable;
+import android.util.AttributeSet;
+import android.view.View;
+
+/**
+ * ゲームに使用するViewの基底クラス
+ *
+ * @author s.iwatani
+ */
+public abstract class RWTView extends View {
+ private float dp = 1;
+ private Point size = null;
+ private Point pos = null;
+
+ public RWTView(Context context) {
+ super(context);
+ init();
+ }
+
+ public RWTView(Context context, @Nullable AttributeSet attrs) {
+ super(context, attrs);
+ init();
+ }
+
+ public RWTView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ init();
+ }
+
+ public void init() {
+ dp = getResources().getDisplayMetrics().density;
+ }
+
+ /**
+ * 画面上に表示されるサイズを取得
+ * @return Point
+ */
+ public Point getSize() {
+ if (size == null) {
+ size = new Point(getWidth(), getHeight());
+ }
+ return size;
+ }
+
+ /**
+ * 画面上に表示される左上の座標を取得
+ * @return Point
+ */
+ public Point getPosition() {
+ if (pos == null) {
+ pos = new Point(getLeft(), getTop());
+ }
+ return pos;
+ }
+
+ /**
+ * DPを乗算する
+ * @param a
+ * @return int
+ */
+ public int applyDp(int a) {
+ return (int)(a * dp);
+ }
+}
diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/framework/event/MyEvent.java b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/event/MyEvent.java
new file mode 100644
index 0000000..37c04b4
--- /dev/null
+++ b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/event/MyEvent.java
@@ -0,0 +1,15 @@
+package org.ntlab.radishforandroidstudio.framework.event;
+
+import android.view.MotionEvent;
+
+public class MyEvent {
+ MotionEvent e;
+
+ public MyEvent(MotionEvent e) {
+ this.e = e;
+ }
+
+ public final MotionEvent getMotionEvent() {
+ return e;
+ }
+}
diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/framework/event/PadEvent.java b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/event/PadEvent.java
new file mode 100644
index 0000000..8e5d25e
--- /dev/null
+++ b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/event/PadEvent.java
@@ -0,0 +1,33 @@
+package org.ntlab.radishforandroidstudio.framework.event;
+
+import android.view.MotionEvent;
+
+public class PadEvent extends MyEvent{
+ private MotionEvent e;
+
+ /**
+ * パッドを倒した距離
+ * 範囲は 0<=length<=1
+ */
+ private float length;
+
+ /**
+ * パッドを倒した方向
+ * 単位radian
+ */
+ private float angle;
+
+ public PadEvent(MotionEvent e, float length, float angle) {
+ super(e);
+ this.length = length;
+ this.angle = angle;
+ }
+
+ public final float getLength() {
+ return length;
+ }
+
+ public final float getAngle() {
+ return angle;
+ }
+}
diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/framework/gameMain/RealTime3DFragment.java b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/gameMain/RealTime3DFragment.java
index 9b4024d..67c6d5b 100644
--- a/app/src/main/java/org/ntlab/radishforandroidstudio/framework/gameMain/RealTime3DFragment.java
+++ b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/gameMain/RealTime3DFragment.java
@@ -1,41 +1,33 @@
package org.ntlab.radishforandroidstudio.framework.gameMain;
-
import android.os.Bundle;
+import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
-import android.widget.LinearLayout;
import org.ntlab.radishforandroidstudio.R;
import org.ntlab.radishforandroidstudio.framework.RWT.RWTSurfaceView;
import org.ntlab.radishforandroidstudio.framework.model3D.Universe;
import org.ntlab.radishforandroidstudio.framework.view3D.Camera3D;
-import static android.content.ContentValues.TAG;
-
public class RealTime3DFragment extends RealTimeFragment{
protected Universe universe;
protected Camera3D camera;
protected RWTSurfaceView view;
+ protected View parentView = null;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
universe = new Universe();
-
camera = new Camera3D(universe);
-
- view = new RWTSurfaceView(this.getActivity());
- view.setRenderMode(RWTSurfaceView.RENDERMODE_WHEN_DIRTY);
- view.attachCamera(camera);
-
- getActivity().addContentView(view,new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT));
}
+ @Nullable
@Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_real_time_3d, container, false);
}
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..64943d5
--- /dev/null
+++ b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/listener/MyListener.java
@@ -0,0 +1,19 @@
+package org.ntlab.radishforandroidstudio.framework.listener;
+
+import org.ntlab.radishforandroidstudio.framework.event.MyEvent;
+
+/**
+ * 全リスナの基底クラス
+ *
+ * @author s.iwatani
+ * @param イベントの型
+ */
+public interface MyListener {
+ /**
+ * イベント発生時に実行するメソッド
+ *
+ * @param event イベントの情報
+ * @return
+ */
+ boolean onEvent(EventType event);
+}
diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/framework/listener/PadListener.java b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/listener/PadListener.java
new file mode 100644
index 0000000..577fce2
--- /dev/null
+++ b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/listener/PadListener.java
@@ -0,0 +1,10 @@
+package org.ntlab.radishforandroidstudio.framework.listener;
+
+import org.ntlab.radishforandroidstudio.framework.event.PadEvent;
+
+/**
+ * Padのリスナ
+ *
+ * @author s.iwatani
+ */
+public interface PadListener extends MyListener {}
diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/framework/listener/SamplePadListener.java b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/listener/SamplePadListener.java
new file mode 100644
index 0000000..c7d4751
--- /dev/null
+++ b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/listener/SamplePadListener.java
@@ -0,0 +1,11 @@
+package org.ntlab.radishforandroidstudio.framework.listener;
+
+import org.ntlab.radishforandroidstudio.framework.event.PadEvent;
+
+public class SamplePadListener implements PadListener {
+ @Override
+ public boolean onEvent(PadEvent event) {
+ System.out.println("PadListener Length:" + event.getLength() + " angle:" + event.getAngle());
+ return false;
+ }
+}
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..2ec1f31
--- /dev/null
+++ b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/subject/MySubject.java
@@ -0,0 +1,59 @@
+package org.ntlab.radishforandroidstudio.framework.subject;
+
+import android.view.InputEvent;
+
+import java.util.Set;
+import java.util.concurrent.CopyOnWriteArraySet;
+
+import org.ntlab.radishforandroidstudio.framework.event.MyEvent;
+import org.ntlab.radishforandroidstudio.framework.listener.MyListener;
+
+/**
+ * Listenerへイベントを通知するクラス
+ *
+ * @author s.iwatani
+ * @param リスナの型
+ * @param イベントを保存する型
+ */
+public abstract class MySubject {
+ protected Set listenerSet = new CopyOnWriteArraySet<>();
+
+ public MySubject() {}
+
+ /**
+ * リスナを追加する
+ *
+ * @author s.iwatani
+ * @param listener
+ */
+ public void addListener(ListenerType listener) {
+ listenerSet.add(listener);
+ }
+
+ /**
+ * 指定したリスナを削除する
+ *
+ * @author s.iwatani
+ * @param listener
+ */
+ public void removeListener(ListenerType listener) { listenerSet.remove(listener); };
+
+ /**
+ * リスナをすべて削除する
+ *
+ * @author s.iwatani
+ */
+ public void clearListener() { listenerSet.clear(); };
+
+ /**
+ * イベントを通知する
+ *
+ * @author s.iwatani
+ * @param event イベントの情報を保存したもの
+ */
+ public void notifyListeners(EventType event) {
+ for (ListenerType listener : listenerSet) {
+ listener.onEvent(event);
+ }
+ }
+}
diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/framework/subject/PadSubject.java b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/subject/PadSubject.java
new file mode 100644
index 0000000..441dad9
--- /dev/null
+++ b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/subject/PadSubject.java
@@ -0,0 +1,16 @@
+package org.ntlab.radishforandroidstudio.framework.subject;
+
+import org.ntlab.radishforandroidstudio.framework.event.PadEvent;
+import org.ntlab.radishforandroidstudio.framework.listener.PadListener;
+
+// 実装いらない説
+// Listener側と同じようにC++のテンプレート特殊化的なことだけして中身なしにするかも
+public class PadSubject extends MySubject {
+ public final static PadSubject own = new PadSubject();
+
+ private PadSubject() { super(); }
+
+ public static PadSubject getInstance() {
+ return own;
+ }
+}
diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/java3d/GraphicsContext3D.java b/app/src/main/java/org/ntlab/radishforandroidstudio/java3d/GraphicsContext3D.java
index cb0fe2e..cd13e19 100644
--- a/app/src/main/java/org/ntlab/radishforandroidstudio/java3d/GraphicsContext3D.java
+++ b/app/src/main/java/org/ntlab/radishforandroidstudio/java3d/GraphicsContext3D.java
@@ -1,5 +1,6 @@
package org.ntlab.radishforandroidstudio.java3d;
+import android.graphics.Bitmap;
import android.opengl.GLU;
import android.opengl.GLUtils;
@@ -10,6 +11,8 @@
import java.util.HashMap;
import javax.microedition.khronos.opengles.GL10;
+import javax.microedition.khronos.opengles.GL11;
+import javax.microedition.khronos.opengles.GL11Ext;
public class GraphicsContext3D {
private GL10 gl;
@@ -348,6 +351,72 @@
}
}
+ /**
+ * 画像を流し込む
+ *
+ * @author s.iwatani
+ * @param image ImageComponent2D
+ * @return int textureId
+ */
+ public int loadImage(ImageComponent2D image) {
+ int[] textureId = new int[1];
+ gl.glGenTextures(1, textureId, 0);
+ //テクスチャIDに対応するテクスチャをバインドする
+ gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId[0]);
+
+ // 初回のみ画像を流し込む
+ GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, image.getBitmap(), 0);
+ return textureId[0];
+ }
+
+ /**
+ * Bitmap描画
+ *
+ * @author s.iwatani
+ * @param textureId
+ * @param pos
+ * @param texPos
+ * @param texSize
+ * @param viewSize
+ */
+ public void draw(int textureId, Position3D pos, Position3D texPos, Position3D texSize, Position3D viewSize) {
+ //テクスチャIDに対応するテクスチャをバインドする
+ gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId);
+
+ // 拡大縮小のアルゴリズム指定
+ 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());
+ }
+
+ public void startDrawImage() {
+ // なんかやってる
+ 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);
+ }
+
+ public void endDrawImage() {
+ gl.glEnable(GL10.GL_DEPTH_TEST);
+ gl.glEnable(GL10.GL_DITHER);
+ gl.glEnable(GL10.GL_LIGHTING);
+ gl.glDisable(GL10.GL_ALPHA);
+ }
+
private void setTextureAttributes(TextureAttributes ta) {
int textureMode = ta.getTextureMode();
switch (textureMode) {
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
diff --git a/app/src/main/res/layout/activity_sample.xml b/app/src/main/res/layout/activity_sample.xml
index 6883ce2..ac0f24f 100644
--- a/app/src/main/res/layout/activity_sample.xml
+++ b/app/src/main/res/layout/activity_sample.xml
@@ -7,11 +7,10 @@
android:layout_height="match_parent"
tools:context=".cactusClient.tests.SampleActivity">
-
+ app:layout_constraintTop_toTopOf="parent">
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_real_time_3d.xml b/app/src/main/res/layout/fragment_real_time_3d.xml
index bb6264a..99fb49b 100644
--- a/app/src/main/res/layout/fragment_real_time_3d.xml
+++ b/app/src/main/res/layout/fragment_real_time_3d.xml
@@ -7,10 +7,18 @@
-
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_sample_game.xml b/app/src/main/res/layout/fragment_sample_game.xml
index 03fd74f..5a00b52 100644
--- a/app/src/main/res/layout/fragment_sample_game.xml
+++ b/app/src/main/res/layout/fragment_sample_game.xml
@@ -5,4 +5,5 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".cactusClient.tests.SampleGameFragment">
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/test_activity.xml b/app/src/main/res/layout/test_activity.xml
new file mode 100644
index 0000000..b514099
--- /dev/null
+++ b/app/src/main/res/layout/test_activity.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/ui_fragment.xml b/app/src/main/res/layout/ui_fragment.xml
new file mode 100644
index 0000000..6a89e34
--- /dev/null
+++ b/app/src/main/res/layout/ui_fragment.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
index 741b9e8..22d7231 100644
--- a/build.gradle
+++ b/build.gradle
@@ -7,7 +7,7 @@
jcenter()
}
dependencies {
- classpath 'com.android.tools.build:gradle:3.1.2'
+ classpath 'com.android.tools.build:gradle:3.1.3'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}