diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser index ee1e5f5..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 a5c220b..8d40625 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -21,14 +21,22 @@ } } buildToolsVersion '27.0.3' + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } } dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') implementation 'com.android.support:appcompat-v7:27.1.1' implementation 'com.android.support.constraint:constraint-layout:1.1.0' + implementation 'com.android.support:support-v4:27.1.1' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' + implementation group: 'net.arnx', name: 'jsonic', version: '1.3.10' + implementation 'com.android.support:cardview-v7:27.1.1' + implementation 'com.google.android.gms:play-services-maps:15.0.1' // implementation files('/Users/matsumotoayaju/AndroidStudioProjects/Cactus2/lib/jsonic-1.3.9/jsonic-1.3.9.jar') } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 161ac37..bd77dc5 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -3,6 +3,7 @@ package="org.ntlab.radishforandroidstudio"> + - - - + diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/connections/LoginFragmentConnection.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/connections/LoginFragmentConnection.java new file mode 100644 index 0000000..282c22a --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/connections/LoginFragmentConnection.java @@ -0,0 +1,11 @@ +package org.ntlab.radishforandroidstudio.cactusClient.connections; + +import org.ntlab.radishforandroidstudio.framework.network.HttpAsyncConnection; + +public class LoginFragmentConnection extends HttpAsyncConnection { + + public LoginFragmentConnection() { + super("http://nitta-lab-www2.is.konan-u.ac.jp:8080/CactusServer/rest/accounts"); + + } +} \ No newline at end of file diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/connections/SignUpFragmentConnection.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/connections/SignUpFragmentConnection.java new file mode 100644 index 0000000..790156d --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/connections/SignUpFragmentConnection.java @@ -0,0 +1,11 @@ +package org.ntlab.radishforandroidstudio.cactusClient.connections; + +import org.ntlab.radishforandroidstudio.framework.network.HttpAsyncConnection; + +public class SignUpFragmentConnection extends HttpAsyncConnection { + + public SignUpFragmentConnection() { + super("http://nitta-lab-www2.is.konan-u.ac.jp:8080/CactusServer/rest/accounts"); + + } +} \ No newline at end of file diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/AddressedEntity.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/AddressedEntity.java new file mode 100644 index 0000000..791dfda --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/AddressedEntity.java @@ -0,0 +1,26 @@ +package org.ntlab.radishforandroidstudio.cactusClient.models; + +/** + * �e���\�[�X��POST�ō쐬�����ۂ�, ���Y���\�[�X�̎��̂�URI���Ăяo�����ɕԂ��Ƃ��ɗp����N���X + * @author r-isitani + * + */ +public abstract class AddressedEntity { + private Entity body; + + protected AddressedEntity() { + // JSONDecode���̌Ăяo���p + } + + public AddressedEntity(Entity body) { + setBody(body); + } + + public Entity getBody() { + return body; + } + + public void setBody(Entity body) { + this.body = body; + } +} diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Entity.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Entity.java new file mode 100644 index 0000000..59e4eb0 --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Entity.java @@ -0,0 +1,10 @@ +package org.ntlab.radishforandroidstudio.cactusClient.models; + +/** + * AddressedEntity�N���X�ɂĈ������̂�\�����ۃN���X + * @author r-isitani + * + */ +public abstract class Entity { + +} diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/URIAddressedEntity.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/URIAddressedEntity.java new file mode 100644 index 0000000..fddd54d --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/URIAddressedEntity.java @@ -0,0 +1,30 @@ +package org.ntlab.radishforandroidstudio.cactusClient.models; + +import java.net.URI; + +public class URIAddressedEntity extends AddressedEntity { + private URI uri; + + private URIAddressedEntity() { + // JSONDecode時の呼び出し用 + } + + public URIAddressedEntity(URI uri, Entity body) { + super(body); + setUri(uri); + } + + public URIAddressedEntity(String str, Entity body) { + super(body); + setUri(URI.create(str)); + } + + public URI getUri() { + return uri; + } + + public void setUri(URI uri) { + this.uri = uri; + } + +} diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/test b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/test deleted file mode 100644 index e69de29..0000000 --- a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/test +++ /dev/null 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 new file mode 100644 index 0000000..24d5bad --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/tests/SampleActivity.java @@ -0,0 +1,24 @@ +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; + +import org.ntlab.radishforandroidstudio.R; + +public class SampleActivity extends AppCompatActivity { + + @Override + 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 new file mode 100644 index 0000000..b36586c --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/tests/SampleGame2Fragment.java @@ -0,0 +1,143 @@ +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; +import android.view.ViewGroup; + +import org.ntlab.radishforandroidstudio.R; +import org.ntlab.radishforandroidstudio.framework.animation.Animation3D; +import org.ntlab.radishforandroidstudio.framework.gameMain.OvergroundActor; +import org.ntlab.radishforandroidstudio.framework.gameMain.RealTime3DFragment; +import org.ntlab.radishforandroidstudio.framework.model3D.ModelFactory; +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.framework.physics.Velocity3D; +import org.ntlab.radishforandroidstudio.java3d.AmbientLight; +import org.ntlab.radishforandroidstudio.java3d.Appearance; +import org.ntlab.radishforandroidstudio.java3d.Color3f; +import org.ntlab.radishforandroidstudio.java3d.DirectionalLight; +import org.ntlab.radishforandroidstudio.java3d.Material; +import org.ntlab.radishforandroidstudio.java3d.Vector3f; + +public class SampleGame2Fragment extends RealTime3DFragment { + private OvergroundActor pocha; + private Ground stage; + private boolean isTouched = false; + private float touchX = 0.0f; + private float touchY = 0.0f; + + public SampleGame2Fragment() { + // Required empty public constructor + } + + @Override + public void onCreate(Bundle savedInstanceState) { + + super.onCreate(savedInstanceState); + //環境光 + AmbientLight amblight = new AmbientLight(new Color3f(1.0f, 1.0f, 1.0f)); + +// amblight.setInfluencingBounds(new BoundingSphere(new Point3d(), 10000.0)); + universe.placeLight(amblight); + + //平行光源 + DirectionalLight dirlight = new DirectionalLight( + new Color3f(1.0f, 1.0f, 1.0f), //光の色 + new Vector3f(0.0f, -1.0f, -0.5f) //光の方向ベクトル + ); +// dirlight.setInfluencingBounds(new BoundingSphere(new Point3d(), 10000.0)); + universe.placeLight(dirlight); + + Appearance ap1 = new Appearance(); + Material m = new Material(); + m.setDiffuseColor(0.0f, 0.3f, 1.0f); + m.setAmbientColor(0.0f, 0.0f, 0.0f); + m.setEmissiveColor(0.0f, 0.0f, 0.0f); + m.setSpecularColor(0.0f, 0.0f, 0.0f); + m.setShininess(5.0f); + ap1.setMaterial(m); + + Object3D pochaBody = null; + try { + pochaBody = ModelFactory.loadModel(getResources(), "pocha.stl", ap1).createObject(); + Animation3D pochaAnimation = null; //AnimationFactory.loadAnimation("data\\pocha\\walk.wrl"); + pocha = new OvergroundActor(pochaBody, pochaAnimation); + pocha.setPosition(new Position3D(0.0, -100.0, 250.0)); + universe.place(pocha); + } catch (Exception e) { + e.printStackTrace(); + } + + Appearance ap2 = new Appearance(); + Material m2 = new Material(); + m2.setDiffuseColor(0.1f, 0.0f, 0.02f); + m2.setAmbientColor(0.1f, 0.1f, 0.1f); + m2.setEmissiveColor(0.0f, 0.0f, 0.0f); + m2.setSpecularColor(0.2f, 0.2f, 0.2f); + m2.setShininess(5.0f); + ap2.setMaterial(m2); + + Object3D stageObj = null; + try { + stageObj = ModelFactory.loadModel(getResources(), "konan/konan.obj").createObject(); + stage = new Ground(stageObj); + universe.place(stage); + } catch (Exception e) { + e.printStackTrace(); + } + + camera.setViewPoint(pocha.getPosition().add(0.0, 1.5, 0.0)); + camera.setViewLine(pocha.getDirection()); + camera.setFieldOfView(1.5); + camera.setBackClipDistance(10000.0); + start(1000L, 50L, true); + } + + @Override + protected void progress(long interval) { + Velocity3D curV = pocha.getVelocity(); + if (isTouched) { + pocha.rotY(0.1 * (0.5f - touchX) * (double)(interval / 15.0)); + curV.setX(pocha.getDirection().getX() * 200.0 * (0.5f - touchY)); + curV.setZ(pocha.getDirection().getZ() * 200.0 * (0.5f - touchY)); + pocha.setVelocity(curV); + } else { + curV.setX(0.0); + curV.setZ(0.0); + pocha.setVelocity(curV); + } + camera.setViewPoint(pocha.getPosition().add(0.0, 15.0, 0.0)); + camera.setViewLine(pocha.getDirection()); + } + + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + // Inflate the layout for this fragment + View view = inflater.inflate(R.layout.fragment_sample_game2, container, false); + view.setOnTouchListener(new View.OnTouchListener() { + @Override + public boolean onTouch(View v, MotionEvent event) { + + if (event.getAction() == MotionEvent.ACTION_DOWN || event.getAction() == MotionEvent.ACTION_MOVE) { + isTouched = true; + float maxX = event.getDevice().getMotionRange(MotionEvent.AXIS_X).getMax(); + float minX = event.getDevice().getMotionRange(MotionEvent.AXIS_X).getMin(); + float maxY = event.getDevice().getMotionRange(MotionEvent.AXIS_Y).getMax(); + float minY = event.getDevice().getMotionRange(MotionEvent.AXIS_Y).getMin(); + touchX = (event.getX() - minX) / (maxX - minX); + touchY = (event.getY() - minY) / (maxY - minY); + } else if (event.getAction() == MotionEvent.ACTION_UP) { + isTouched = false; + } + return true; + } + }); + return view; + } +} \ No newline at end of file diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/tests/SampleGameFragment.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/tests/SampleGameFragment.java new file mode 100644 index 0000000..720a447 --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/tests/SampleGameFragment.java @@ -0,0 +1,122 @@ +package org.ntlab.radishforandroidstudio.cactusClient.tests; + + +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.view.LayoutInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; + +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.R; +import org.ntlab.radishforandroidstudio.java3d.Vector3f; + +public class SampleGameFragment 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); + +// final OvergroundActor oga = new OvergroundActor(obj1, null) { +// @Override +// public Force3D getGravity() { +// return new Force3D(0.0,0.0,0.0); +// } +// }; +// universe.place(oga); + + // カメラの設定 + camera.setViewPoint(new Position3D(0.0, 10.0, -20.0)); + camera.addTarget(actor); + + // フレームの間隔(ms) + start(20); + + //onCreateOptionMenuの呼び出し + setHasOptionsMenu(true); + } + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + return inflater.inflate(R.layout.fragment_sample_game, container, false); + } + + @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); + } +} \ No newline at end of file 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 new file mode 100644 index 0000000..b6668d5 --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/tests/StartFragment.java @@ -0,0 +1,40 @@ +package org.ntlab.radishforandroidstudio.cactusClient.tests; + + +import android.os.Bundle; +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.View; +import android.view.ViewGroup; +import android.widget.Button; + +import org.ntlab.radishforandroidstudio.R; + +public class StartFragment extends Fragment { + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + // Inflate the layout for this fragment + return inflater.inflate(R.layout.fragment_start, container, false); + } + + @Override + public void onStart() { + super.onStart(); + + Button button = getActivity().findViewById(R.id.start_button); + button.setOnClickListener(new View.OnClickListener(){ + @Override + public void onClick(View view) { + FragmentManager manager = getFragmentManager(); + FragmentTransaction transaction = manager.beginTransaction(); + transaction.replace(R.id.fragment_field,new SampleUiFragment()); + transaction.addToBackStack(null); + transaction.commit(); + } + }); + } +} diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/views/CharactersFragment.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/views/CharactersFragment.java new file mode 100644 index 0000000..100114b --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/views/CharactersFragment.java @@ -0,0 +1,37 @@ +package org.ntlab.radishforandroidstudio.cactusClient.views; + +import android.os.Bundle; +import android.support.v4.app.FragmentManager; +import android.support.v4.app.FragmentTransaction; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.support.v4.app.Fragment; +import android.widget.Button; + + +import org.ntlab.radishforandroidstudio.R; + +public class CharactersFragment extends Fragment { + + public void onStart() { + super.onStart(); + + Button button = (Button) getActivity().findViewById(R.id.chooseInstances); + //↓↓↓↓↓↓↓↓画面遷移↓↓↓↓↓↓↓↓ + button.setOnClickListener(new View.OnClickListener() { + + @Override + public void onClick(View v) { + //Toast.makeText(getActivity(), "hoge!", Toast.LENGTH_SHORT).show(); + + FragmentManager manager = getFragmentManager(); + FragmentTransaction transaction = manager.beginTransaction(); + + transaction.replace(R.id.fragment_place, new InstancesFragment()); + + transaction.commit(); + } + }); + } +} \ No newline at end of file diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/views/InstancesFragment.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/views/InstancesFragment.java new file mode 100644 index 0000000..3c678f2 --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/views/InstancesFragment.java @@ -0,0 +1,49 @@ +package org.ntlab.radishforandroidstudio.cactusClient.views; + + +import android.accounts.Account; +import android.os.Bundle; +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.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.EditText; +import android.widget.Toast; + + + +import org.ntlab.radishforandroidstudio.R; + +public class InstancesFragment extends Fragment { + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + // Inflate the layout for this fragment + return inflater.inflate(R.layout.instances_fragment, container, false); + } + + public void onStart() { + super.onStart(); + + Button button = (Button) getActivity().findViewById(R.id.Instance1); + //↓↓↓↓↓↓↓↓画面遷移↓↓↓↓↓↓↓↓ + button.setOnClickListener(new View.OnClickListener() { + + @Override + public void onClick(View v) { + //Toast.makeText(getActivity(), "hoge!", Toast.LENGTH_SHORT).show(); + + FragmentManager manager = getFragmentManager(); + FragmentTransaction transaction = manager.beginTransaction(); + + transaction.replace(R.id.fragment_place, new CharactersFragment()); + + transaction.commit(); + } + }); + } +} \ No newline at end of file diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/views/LoginFragment.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/views/LoginFragment.java index 8a6bb3f..4cc9675 100644 --- a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/views/LoginFragment.java +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/views/LoginFragment.java @@ -1,11 +1,11 @@ package org.ntlab.radishforandroidstudio.cactusClient.views; +import android.accounts.Account; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; -import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -13,10 +13,17 @@ import android.widget.EditText; import android.widget.Toast; +import net.arnx.jsonic.JSON; + import org.ntlab.radishforandroidstudio.R; +import org.ntlab.radishforandroidstudio.cactusClient.Cactus; +import org.ntlab.radishforandroidstudio.cactusClient.connections.LoginFragmentConnection; +import org.ntlab.radishforandroidstudio.cactusClient.views.InstancesFragment; +import org.ntlab.radishforandroidstudio.cactusClient.models.URIAddressedEntity; +import org.ntlab.radishforandroidstudio.framework.network.CallBack; public class LoginFragment extends Fragment { -// private URIAddressedEntity connection; + private LoginFragmentConnection connection; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, @@ -26,7 +33,6 @@ } - @Override public void onStart() { super.onStart(); @@ -42,6 +48,7 @@ FragmentManager manager = getFragmentManager(); FragmentTransaction transaction = manager.beginTransaction(); + transaction.addToBackStack(null); transaction.replace(R.id.fragment_place, new SignUpFragment()); transaction.commit(); @@ -56,42 +63,54 @@ EditText userName = (EditText)getActivity().findViewById(R.id.inputUserName); EditText passWord = (EditText)getActivity().findViewById(R.id.checkPassword); - CharSequence userNameText = userName.getText(); - CharSequence passWordText = passWord.getText(); + if (userName.getText().toString().isEmpty()) { + Toast.makeText(getActivity(), "ユーザー名が未記入です", Toast.LENGTH_SHORT).show(); + } else if(passWord.getText().toString().isEmpty()){ + Toast.makeText(getActivity(), "パスワードが未記入です", Toast.LENGTH_SHORT).show(); + } else { - Toast tp = Toast.makeText(getActivity(), passWordText, Toast.LENGTH_SHORT); - tp.setGravity(Gravity.BOTTOM, 0, 0); - tp.show(); + connection = new LoginFragmentConnection(); + connection.setCallBack(new CallBack() { + @Override + public void onResponse(String response) { + //通信した時の処理を書くのだよ + URIAddressedEntity lac = JSON.decode(response, URIAddressedEntity.class); + + System.out.println("///////////////////////////////////////////////"); + System.out.println(response); -// if (userName.getText().toString().isEmpty()) { -// Toast.makeText(getActivity(), "値が未記入です", Toast.LENGTH_SHORT).show(); -// } else { -// -// connection = new URIAddressedEntity(); -// -// connection.setCallBack(new CallBack() { -// @Override -// public void onResponse(String response) { -// //通信した時の処理を書くのだ -// } -// -// }); -// connection.addFormParam("userName", userName.getText().toString()); -// connection.doPost(); -// } + //Cactus.setMyAccount((Account)lac.getBody()); + if(response.contains("\"login\":true,")){ + Toast.makeText(getActivity(),"ログインに成功しました。", Toast.LENGTH_SHORT).show(); + FragmentManager manager = getFragmentManager(); + FragmentTransaction transaction = manager.beginTransaction(); + transaction.replace(R.id.fragment_place, new InstancesFragment()); + transaction.commit(); + + }else { + Toast.makeText(getActivity(),"ログインに失敗しました。", Toast.LENGTH_SHORT).show(); + } + + } + }); + connection.addFormParam("userID", userName.getText().toString()); + connection.addFormParam("userPass", passWord.getText().toString()); + connection.doPut(); + } } }); + } } diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/views/SignUpFragment.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/views/SignUpFragment.java index 84b31ad..4506291 100644 --- a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/views/SignUpFragment.java +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/views/SignUpFragment.java @@ -1,6 +1,5 @@ package org.ntlab.radishforandroidstudio.cactusClient.views; - import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; @@ -11,9 +10,14 @@ import android.widget.Button; import android.widget.EditText; import android.widget.Toast; +import net.arnx.jsonic.JSON; import org.ntlab.radishforandroidstudio.R; +import org.ntlab.radishforandroidstudio.cactusClient.connections.SignUpFragmentConnection; +import org.ntlab.radishforandroidstudio.cactusClient.models.URIAddressedEntity; +import org.ntlab.radishforandroidstudio.framework.network.CallBack; public class SignUpFragment extends Fragment { + private SignUpFragmentConnection connection; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, @@ -26,8 +30,10 @@ //↓↓↓↓↓↓↓↓画面遷移↓↓↓↓↓↓↓↓ @Override public void onStart() { + super.onStart(); + //ログインボタン Button button = (Button) getActivity().findViewById(R.id.LoginButton2); button.setOnClickListener(new View.OnClickListener() { @@ -38,6 +44,7 @@ FragmentManager manager = getFragmentManager(); FragmentTransaction transaction = manager.beginTransaction(); + transaction.addToBackStack(null); //transaction.replace(R.id.fragment_place, new LoginFragment()); transaction.replace(R.id.fragment_place, new LoginFragment()); @@ -45,35 +52,48 @@ } }); - Button sihnupButton = (Button) getActivity().findViewById(R.id.signUp2); - sihnupButton.setOnClickListener(new View.OnClickListener(){ + //サインアップ + Button signUpButton = (Button) getActivity().findViewById(R.id.signUp2); + signUpButton.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View view) { EditText inputPassword = (EditText)getActivity().findViewById(R.id.inputPassword2); EditText checkPassWord = (EditText)getActivity().findViewById(R.id.checkPassword); + EditText inputUserName = (EditText)getActivity().findViewById(R.id.inputUserName); + EditText inputUserID = (EditText)getActivity().findViewById(R.id.inputUserID); - String strInputPassword = EditTextChangeToString(inputPassword); - String strCheckPassWord = EditTextChangeToString(checkPassWord); - if (strInputPassword.isEmpty()) { + if(inputUserID.getText().toString().contains(" ") || inputUserID.getText().toString().contains(" ")){ + Toast.makeText(getActivity(), "空白の含むIDは登録できません", Toast.LENGTH_SHORT).show(); + }else if (inputPassword.getText().toString().isEmpty()) { Toast.makeText(getActivity(), "パスワードを入力してください", Toast.LENGTH_SHORT).show(); - } else if (strCheckPassWord.isEmpty()) { + } else if (checkPassWord.getText().toString().isEmpty()) { Toast.makeText(getActivity(), "確認用パスワードを入力してください", Toast.LENGTH_SHORT).show(); - } else if (!strInputPassword.equals(strCheckPassWord )) { + } else if (!inputPassword.getText().toString().equals(checkPassWord.getText().toString() )) { Toast.makeText(getActivity(), "パスワードが一致しません", Toast.LENGTH_SHORT).show(); }else{ - Toast.makeText(getActivity(), "アカウント作成に成功しましたね", Toast.LENGTH_SHORT).show(); + + connection = new SignUpFragmentConnection(); + connection.setCallBack(new CallBack() { + @Override + public void onResponse(String response) { + //通信した時の処理を書くのだよ + URIAddressedEntity ac = JSON.decode(response, URIAddressedEntity.class); + System.out.println(ac.getUri()); + System.out.println(response); + Toast.makeText(getActivity(),response, Toast.LENGTH_SHORT).show(); + } + }); + + connection.addFormParam("userID", inputUserID.getText().toString()); + connection.addFormParam("userPass", inputPassword.getText().toString()); + connection.addFormParam("userName", inputUserName.getText().toString()); + connection.doPost(); + } } }); } - private static String EditTextChangeToString(EditText text){ - CharSequence CharSequenceText = text.getText(); - - String str = CharSequenceText.toString(); - - return str; - } } \ No newline at end of file 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/RealTime3DActivity.java b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/gameMain/RealTime3DActivity.java index 2bb5dd7..c5e84eb 100644 --- a/app/src/main/java/org/ntlab/radishforandroidstudio/framework/gameMain/RealTime3DActivity.java +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/gameMain/RealTime3DActivity.java @@ -1,27 +1,32 @@ package org.ntlab.radishforandroidstudio.framework.gameMain; import android.os.Bundle; +import android.widget.LinearLayout; import org.ntlab.radishforandroidstudio.framework.RWT.RWTSurfaceView; import org.ntlab.radishforandroidstudio.framework.model3D.Universe; import org.ntlab.radishforandroidstudio.framework.view3D.Camera3D; +//addcontentViewのサンプルとして作成 public abstract class RealTime3DActivity extends RealTimeActivity { protected Universe universe; protected Camera3D camera; protected RWTSurfaceView view; - + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + universe = new Universe(); - + camera = new Camera3D(universe); - + view = new RWTSurfaceView(this); view.setRenderMode(RWTSurfaceView.RENDERMODE_WHEN_DIRTY); view.attachCamera(camera); - setContentView(view); + + addContentView(view,new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT)); + } protected void update(long interval) { @@ -30,6 +35,6 @@ camera.adjust(interval); view.requestRender(); } - + abstract protected void progress(long interval); } 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 new file mode 100644 index 0000000..67c6d5b --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/gameMain/RealTime3DFragment.java @@ -0,0 +1,46 @@ +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 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; + +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); + } + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + return inflater.inflate(R.layout.fragment_real_time_3d, container, false); + } + + @Override + protected void update(long interval) { + progress(interval); + universe.update(interval); + camera.adjust(interval); + view.requestRender(); + } + + protected void progress(long interval) { + + } +} + diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/framework/gameMain/RealTimeActivity.java b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/gameMain/RealTimeActivity.java index 29025ca..0a85e18 100644 --- a/app/src/main/java/org/ntlab/radishforandroidstudio/framework/gameMain/RealTimeActivity.java +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/gameMain/RealTimeActivity.java @@ -10,38 +10,38 @@ //インターバル確認用変数 private long interval = 15L; private long prevTime = 0L; - + private ScheduledThreadPoolExecutor schedule = new ScheduledThreadPoolExecutor(1); private boolean fixedInterval; - + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - } - + } + protected void start(long interval){ this.interval = interval; this.fixedInterval = false; schedule.scheduleWithFixedDelay(this, interval, interval, TimeUnit.MILLISECONDS); } - + protected void start(long delay, long interval){ this.interval = interval; this.fixedInterval = false; schedule.scheduleWithFixedDelay(this, delay, interval, TimeUnit.MILLISECONDS); } - + protected void start(long delay, long interval, boolean fixedInterval){ this.interval = interval; this.fixedInterval = fixedInterval; schedule.scheduleWithFixedDelay(this, delay, interval, TimeUnit.MILLISECONDS); } - + protected void stop() { schedule.shutdown(); } - + //繰り返し実行される部分 public void run(){ long interval; @@ -55,7 +55,7 @@ } update(interval); } - + //intervalミリ秒のインターバルをおいて定期実行 protected abstract void update(long interval); } diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/framework/gameMain/RealTimeFragment.java b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/gameMain/RealTimeFragment.java new file mode 100644 index 0000000..6fa410f --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/gameMain/RealTimeFragment.java @@ -0,0 +1,74 @@ +package org.ntlab.radishforandroidstudio.framework.gameMain; + +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import org.ntlab.radishforandroidstudio.R; + +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +public abstract class RealTimeFragment extends Fragment implements Runnable{ + //インターバル確認用変数 + private long interval = 15L; + private long prevTime = 0L; + + private ScheduledThreadPoolExecutor schedule = new ScheduledThreadPoolExecutor(1); + private boolean fixedInterval; + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + } + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + return inflater.inflate(R.layout.fragment_real_time, container, false); + } + + protected void start(long interval){ + this.interval = interval; + this.fixedInterval = false; + schedule.scheduleWithFixedDelay(this, interval, interval, TimeUnit.MILLISECONDS); + } + + protected void start(long delay, long interval){ + this.interval = interval; + this.fixedInterval = false; + schedule.scheduleWithFixedDelay(this, delay, interval, TimeUnit.MILLISECONDS); + } + + protected void start(long delay, long interval, boolean fixedInterval){ + this.interval = interval; + this.fixedInterval = fixedInterval; + schedule.scheduleWithFixedDelay(this, delay, interval, TimeUnit.MILLISECONDS); + } + + + protected void stop() { + schedule.shutdown(); + } + + //繰り返し実行される部分 + public void run(){ + long interval; + if (prevTime == 0L || fixedInterval) { + interval = this.interval; + prevTime = System.currentTimeMillis(); + } else { + long curTime = System.currentTimeMillis(); + interval = curTime - prevTime; + prevTime = curTime; + } + update(interval); + } + //intervalミリ秒のインターバルをおいて定期実行 + protected abstract void update(long interval); + +} 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/java/org/ntlab/radishforandroidstudio/sample/SampleActivity.java b/app/src/main/java/org/ntlab/radishforandroidstudio/sample/SampleActivity.java new file mode 100644 index 0000000..76f1430 --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/sample/SampleActivity.java @@ -0,0 +1,178 @@ +package org.ntlab.radishforandroidstudio.sample; + +import android.annotation.SuppressLint; +import android.support.v7.app.AppCompatActivity; +import android.os.Bundle; +import android.view.MotionEvent; +import android.view.View; +import android.widget.Button; +import android.widget.LinearLayout; + +import org.ntlab.radishforandroidstudio.R; +import org.ntlab.radishforandroidstudio.framework.animation.Animation3D; +import org.ntlab.radishforandroidstudio.framework.gameMain.OvergroundActor; +import org.ntlab.radishforandroidstudio.framework.gameMain.RealTime3DActivity; +import org.ntlab.radishforandroidstudio.framework.model3D.ModelFactory; +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.framework.physics.Velocity3D; +import org.ntlab.radishforandroidstudio.java3d.AmbientLight; +import org.ntlab.radishforandroidstudio.java3d.Appearance; +import org.ntlab.radishforandroidstudio.java3d.Color3f; +import org.ntlab.radishforandroidstudio.java3d.DirectionalLight; +import org.ntlab.radishforandroidstudio.java3d.Material; +import org.ntlab.radishforandroidstudio.java3d.Vector3f; + +//addContentViewの追加のためにSampleを作成 +public class SampleActivity extends RealTime3DActivity { + + private OvergroundActor pocha; + private Ground stage; + private boolean isTouched = false; + private float touchX = 0.0f; + private float touchY = 0.0f; + + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + //ボタンの重ね合わせ + View view1 = getLayoutInflater().inflate(R.layout.button_layout, null); + addContentView(view1, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT)); + + //環境光 + AmbientLight amblight = new AmbientLight(new Color3f(1.0f, 1.0f, 1.0f)); + +// amblight.setInfluencingBounds(new BoundingSphere(new Point3d(), 10000.0)); + universe.placeLight(amblight); + + //平行光源 + + DirectionalLight dirlight = new DirectionalLight( + new Color3f(1.0f, 1.0f, 1.0f), //光の色 + new Vector3f(0.0f, -1.0f, -0.5f) //光の方向ベクトル + ); +// dirlight.setInfluencingBounds(new BoundingSphere(new Point3d(), 10000.0)); + universe.placeLight(dirlight); + + Appearance ap1 = new Appearance(); + Material m = new Material(); + m.setDiffuseColor(0.0f, 0.3f, 1.0f); + m.setAmbientColor(0.0f, 0.0f, 0.0f); + m.setEmissiveColor(0.0f, 0.0f, 0.0f); + m.setSpecularColor(0.0f, 0.0f, 0.0f); + m.setShininess(5.0f); + ap1.setMaterial(m); + + Object3D pochaBody = null; + try { + pochaBody = ModelFactory.loadModel(getResources(), "pocha.stl", ap1).createObject(); + Animation3D pochaAnimation = null; //AnimationFactory.loadAnimation("data\\pocha\\walk.wrl"); + pocha = new OvergroundActor(pochaBody, pochaAnimation); + pocha.setPosition(new Position3D(0.0, -100.0, 250.0)); + universe.place(pocha); + } catch (Exception e) { + e.printStackTrace(); + } + + Appearance ap2 = new Appearance(); + Material m2 = new Material(); + m2.setDiffuseColor(0.1f, 0.0f, 0.02f); + m2.setAmbientColor(0.1f, 0.1f, 0.1f); + m2.setEmissiveColor(0.0f, 0.0f, 0.0f); + m2.setSpecularColor(0.2f, 0.2f, 0.2f); + m2.setShininess(5.0f); + ap2.setMaterial(m2); + + Object3D stageObj = null; + try { + stageObj = ModelFactory.loadModel(getResources(), "konan/konan.obj").createObject(); + stage = new Ground(stageObj); + universe.place(stage); + } catch (Exception e) { + e.printStackTrace(); + } + + camera.setViewPoint(pocha.getPosition().add(0.0, 1.5, 0.0)); + camera.setViewLine(pocha.getDirection()); + camera.setFieldOfView(1.5); + camera.setBackClipDistance(10000.0); + start(1000L, 50L, true); + + + //top-button操作 + Button top_button = findViewById(R.id.top_button); + top_button.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + System.out.println("top-button"); + } + }); + //down-button操作 + Button down_button = findViewById(R.id.down_button); + down_button.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + System.out.println("down-button"); + } + }); + //left_button操作 + Button left_button = findViewById(R.id.left_button); + left_button.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + System.out.println("left_button"); + } + }); + //right_button操作 + Button right_button = findViewById(R.id.right_button); + right_button.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + System.out.println("right_button"); + } + }); + } + + @Override + public void progress(long interval) { + Velocity3D curV = pocha.getVelocity(); + if (isTouched) { + pocha.rotY(0.1 * (0.5f - touchX) * (double)(interval / 15.0)); + curV.setX(pocha.getDirection().getX() * 200.0 * (0.5f - touchY)); + curV.setZ(pocha.getDirection().getZ() * 200.0 * (0.5f - touchY)); + pocha.setVelocity(curV); + } else { + curV.setX(0.0); + curV.setZ(0.0); + pocha.setVelocity(curV); + } + camera.setViewPoint(pocha.getPosition().add(0.0, 15.0, 0.0)); + camera.setViewLine(pocha.getDirection()); + } + + @SuppressLint("NewApi") + @Override + public boolean onTouchEvent(MotionEvent event){ + super.onTouchEvent(event); + + //ACTION_MOVE:タッチしたまま移動,ACTION_DOWN:タッチダウン + if (event.getAction() == MotionEvent.ACTION_DOWN || event.getAction() == MotionEvent.ACTION_MOVE) { + isTouched = true; + float maxX = event.getDevice().getMotionRange(MotionEvent.AXIS_X).getMax(); + float minX = event.getDevice().getMotionRange(MotionEvent.AXIS_X).getMin(); + float maxY = event.getDevice().getMotionRange(MotionEvent.AXIS_Y).getMax(); + float minY = event.getDevice().getMotionRange(MotionEvent.AXIS_Y).getMin(); + touchX = (event.getX() - minX) / (maxX - minX); + touchY = (event.getY() - minY) / (maxY - minY); + System.out.println("touch"); + } else if (event.getAction() == MotionEvent.ACTION_UP) { + isTouched = false; + System.out.println("Not-touch"); + } + return true; + } +} diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/sample/SampleGameActivity.java b/app/src/main/java/org/ntlab/radishforandroidstudio/sample/SampleGameActivity.java index 3a61419..fe6d53a 100644 --- a/app/src/main/java/org/ntlab/radishforandroidstudio/sample/SampleGameActivity.java +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/sample/SampleGameActivity.java @@ -30,7 +30,6 @@ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - //環境光 AmbientLight amblight = new AmbientLight(new Color3f(1.0f, 1.0f, 1.0f)); 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 new file mode 100644 index 0000000..ac0f24f --- /dev/null +++ b/app/src/main/res/layout/activity_sample.xml @@ -0,0 +1,26 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/button_layout.xml b/app/src/main/res/layout/button_layout.xml new file mode 100644 index 0000000..cb143fa --- /dev/null +++ b/app/src/main/res/layout/button_layout.xml @@ -0,0 +1,67 @@ + + + +