diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/connections/ObjectsConnection.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/connections/ObjectsConnection.java index e175902..fc6e111 100644 --- a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/connections/ObjectsConnection.java +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/connections/ObjectsConnection.java @@ -3,7 +3,7 @@ import org.ntlab.radishforandroidstudio.framework.network.HttpAsyncConnection; public class ObjectsConnection extends HttpAsyncConnection { - public ObjectsConnection() { - super("http://nitta-lab-www.is.konan-u.ac.jp:8080/CactusServer/rest/instances/objects"); + public ObjectsConnection(String instanceId) { + super("http://nitta-lab-www.is.konan-u.ac.jp:8080/CactusServer/rest/instances/" + instanceId + "/objects"); } } diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Instance.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Instance.java index 564e380..2ec03c6 100644 --- a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Instance.java +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Instance.java @@ -7,11 +7,11 @@ import org.ntlab.radishforandroidstudio.framework.model3D.Position3D; import org.ntlab.radishforandroidstudio.framework.model3D.Quaternion3D; import org.ntlab.radishforandroidstudio.framework.model3D.Universe; -import org.ntlab.radishforandroidstudio.framework.physics.AngularVelocity3D; import org.ntlab.radishforandroidstudio.framework.physics.Ground; -import org.ntlab.radishforandroidstudio.framework.physics.Velocity3D; import net.arnx.jsonic.JSONHint; +import org.ntlab.radishforandroidstudio.cactusClient.models.Area.Allowed; + /** * インスタンス @@ -27,7 +27,7 @@ private Universe universe; private Ground stage; private HashMap areaMap = new HashMap<>(); - private HashMap objMap = new HashMap<>(); + private HashMap objMap = new HashMap<>(); private HashMap characterMap = new HashMap<>(); @JSONHint(ignore = true) public static final int UNIQUE_ID_LENGTH = 12; @@ -40,7 +40,7 @@ setName(name); setState(Instance.State.AVAILABLE); setStageID(stageID); - // initUniverse(); + initUniverse(); } private void initUniverse() { @@ -78,11 +78,11 @@ } @JSONHint(ignore = true) - public HashMap getObjects() { + public HashMap getObjects() { return objMap; } - public Object getObject(String objId) { + public MovableObject getObject(String objId) { return objMap.get(objId); } @@ -91,10 +91,26 @@ return characterMap; } + public HashMap getCharacters(String accountID) { + if (accountID == null || accountID.isEmpty()) { + return getCharacters(); + } + HashMap returnedMap = new HashMap<>(); + for (String id : characterMap.keySet()) { + Character character = characterMap.get(id); + String[] accountURISplit = character.getAccountURI().split("/"); + if (accountURISplit[accountURISplit.length - 1].equals(accountID)) { + returnedMap.put(id, character); + } + } + return returnedMap; + } + public Character getCharacter(String characterId) { return characterMap.get(characterId); } + public void setName(String name) { this.name = name; } @@ -107,7 +123,7 @@ this.stageID = stageURI; } - public HashMap createArea(String name, Plain[] region, HashSet permissions) { + public HashMap createArea(String name, Plain[] region, HashSet permissions) { String id = RandomStringGenerator.generateUniqueString(Area.UNIQUE_ID_LENGTH, RandomStringGenerator.ALPHA_NUMERIC, areaMap.keySet()); Area area = new Area(name, region, permissions); @@ -117,18 +133,6 @@ return returnedMap; } - public HashMap createObject(Position3D position, Velocity3D velocity, - AngularVelocity3D angularVelocity, Quaternion3D angle, Object.Attribute attribute, String model) { - String id = RandomStringGenerator.generateUniqueString(Object.UNIQUE_ID_LENGTH, - RandomStringGenerator.ALPHA_NUMERIC, objMap.keySet()); - Object object = new Object(position, velocity, angularVelocity, angle, attribute, model); - objMap.put(id, object); - universe.place(object.getPlaceable()); - HashMap returnedMap = new HashMap<>(); - returnedMap.put(id, object); - return returnedMap; - } - public HashMap createCharacter(String instanceId, String accountURI, String name, Position3D position, Quaternion3D angle, int modelID) { String id = RandomStringGenerator.generateUniqueString(Character.UNIQUE_ID_LENGTH, @@ -145,12 +149,6 @@ return this; } - public Character updateCharacter(String characterId, Position3D position, Quaternion3D angle, String modelID) { - Character character = characterMap.get(characterId); - character.update(position, angle, modelID, null); // areaURI(第4引数)の更新は呼び出し先で自動で行われる - return character; - } - public Character destroyCharacter(String characterId) { return characterMap.remove(characterId); } @@ -159,10 +157,11 @@ return areaMap.remove(areaId); } - public Object destroyObject(String objId) { + public MovableObject destroyObject(String objId) { return objMap.remove(objId); } + public static enum State { AVAILABLE, MAINTENANCE; } diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/MovableObject.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/MovableObject.java new file mode 100644 index 0000000..5d7c095 --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/MovableObject.java @@ -0,0 +1,12 @@ +package org.ntlab.radishforandroidstudio.cactusClient.models; + +import org.ntlab.radishforandroidstudio.framework.model3D.Object3D; +import org.ntlab.radishforandroidstudio.framework.model3D.Universe; + +public class MovableObject extends Object3D { + private Universe universe = null; + + public MovableObject(Object3D obj) { + super(obj); + } +} diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/MovableObjectModel.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/MovableObjectModel.java new file mode 100644 index 0000000..87b5e63 --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/MovableObjectModel.java @@ -0,0 +1,116 @@ +package org.ntlab.radishforandroidstudio.cactusClient.models; + +import net.arnx.jsonic.JSON; +import net.arnx.jsonic.TypeReference; + +import org.ntlab.radishforandroidstudio.cactusClient.connections.ObjectsConnection; +import org.ntlab.radishforandroidstudio.framework.gameMain.GameBaseModel; +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.Property3D; +import org.ntlab.radishforandroidstudio.framework.model3D.Universe; +import org.ntlab.radishforandroidstudio.framework.network.CallBack; +import org.ntlab.radishforandroidstudio.java3d.Appearance; +import org.ntlab.radishforandroidstudio.java3d.Material; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +/** + * オブジェクトを管理するモデル + */ + +public class MovableObjectModel implements GameBaseModel, CallBack { + private Universe universe; + private RealTime3DFragment fragment; + private ObjectsConnection con; + private int nextConnectRenaimdTime = 0; + private int connectInterval = 300; + private String instanceId; + private Map visibleobject = new HashMap<>(); + + public MovableObjectModel(RealTime3DFragment fragment, Universe universe,String instanceId) { + this.fragment = fragment; + this.universe = universe; + this.setInstanceId(instanceId); + } + + + @Override + public void setInstanceId(String instanceId) { + this.instanceId = instanceId; + } + + + /** + * オブジェクトの状態更新 + * + * @param interval 前回の更新からの時間差 + */ + @Override + public void update(double interval) { + nextConnectRenaimdTime -= interval; + if (nextConnectRenaimdTime <= 0) { + nextConnectRenaimdTime = connectInterval; + con = new ObjectsConnection(instanceId); + con.setCallBack(this); + con.doGet(); + } + } + + + @Override + public void onResponse(String response) { + + JSON json = new JSON(); + + + Map o = json.decode(response, new TypeReference>() { + }); + for (Map.Entry entry : o.entrySet()) { + ArrayList properties = new ArrayList<>(); + Object object = entry.getValue(); + + + properties.add(object.getPosition()); + properties.add(object.getAngle()); + + if (!visibleobject.containsKey(entry.getKey())) { + Appearance ap1 = new Appearance(); + Material mat = new Material(); + mat.setDiffuseColor(0.0f, 0.3f, 1.0f); + mat.setAmbientColor(0.0f, 0.0f, 0.0f); + mat.setEmissiveColor(0.0f, 0.0f, 0.0f); + mat.setSpecularColor(0.0f, 0.0f, 0.0f); + mat.setShininess(5.0f); + ap1.setMaterial(mat); + + Object3D objBody = null; + try { + objBody = ModelFactory.loadModel(fragment.getResources(), "cube-binary.stl", ap1).createObject(); + } catch (Exception e) { + e.printStackTrace(); + } + + MovableObject object1 = new MovableObject(objBody); + visibleobject.put(entry.getKey(), object1); + universe.place(entry.getKey(), object1); + universe.place(object1); + + } + universe.apply(entry.getKey(), properties); + } + + for (String key : visibleobject.keySet()) { + if (!o.containsKey(key)) { + universe.displace(visibleobject.get(key)); + } + } + + + } +} diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Object.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Object.java index 5ee62ac..7dfc485 100644 --- a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Object.java +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Object.java @@ -1,9 +1,13 @@ package org.ntlab.radishforandroidstudio.cactusClient.models; +import org.ntlab.radishforandroidstudio.framework.model3D.Model3D; +import org.ntlab.radishforandroidstudio.framework.model3D.Object3D; import org.ntlab.radishforandroidstudio.framework.model3D.Position3D; import org.ntlab.radishforandroidstudio.framework.model3D.Quaternion3D; import org.ntlab.radishforandroidstudio.framework.physics.AngularVelocity3D; import org.ntlab.radishforandroidstudio.framework.physics.Velocity3D; +import org.ntlab.radishforandroidstudio.java3d.Box; +import org.ntlab.radishforandroidstudio.java3d.Primitive; //import framework.model3D.Position3D; //import framework.physics.AngularVelocity3D; @@ -16,7 +20,9 @@ private AngularVelocity3D angularVelocity; private Quaternion3D angle; private Attribute attribute; - private String model; + private Model3D model; + private Primitive prim; + private Object3D object; @JSONHint(ignore = true) public static final int UNIQUE_ID_LENGTH = 12; @@ -26,24 +32,29 @@ // JSONDecode時の呼び出し用 } - public Object(Position3D position, Velocity3D velocity, AngularVelocity3D angularVelocity, Quaternion3D angle, - Attribute attribute, String model) { + public Object(Position3D position, Velocity3D velocity, AngularVelocity3D angularVelocity, + Quaternion3D angle, Attribute attribute, int modelID) { + setPrim(new Box()); + setObject(new Object3D("", prim)); + setPlaceable(object); setPosition(position); setVelocity(velocity); setAngularVelocity(angularVelocity); setAngle(angle); setAttribute(attribute); - setModel(model); + setModel(modelID); } public Position3D getPosition() { return position; } + @JSONHint(ignore = true) public Velocity3D getVelocity() { return velocity; } + @JSONHint(ignore = true) public AngularVelocity3D getAngularVelocity() { return angularVelocity; } @@ -52,16 +63,19 @@ return angle; } + @JSONHint(ignore = true) public Attribute getAttribute() { return attribute; } - public String getModel() { + @JSONHint(ignore = true) + public Model3D getModel() { return model; } public void setPosition(Position3D position) { this.position = position; +// ((Object3D)(getPlaceable().getBody())).setPosition(position); } public void setVelocity(Velocity3D velocity) { @@ -74,35 +88,41 @@ public void setAngle(Quaternion3D angle) { this.angle = angle; +// ((Object3D) getPlaceable().getBody()).apply(angle, false); } public void setAttribute(Attribute attribute) { this.attribute = attribute; } - public void setModel(String model) { - this.model = model; + public void setModel(int modelID) { + this.model = ObjectModelManager.getInstance().getObject(modelID); } public static class Attribute { - private boolean moveable; // 可動 + private boolean movable; // 可動 private double cof; // 摩擦係数 + @SuppressWarnings("unused") + private Attribute() { + + } + public Attribute(boolean moveable, double cof) { - setMoveable(moveable); + setMovable(moveable); setCof(cof); } - public boolean isMoveable() { - return moveable; + public boolean isMovable() { + return movable; } public double getCof() { return cof; } - public void setMoveable(boolean moveable) { - this.moveable = moveable; + public void setMovable(boolean moveable) { + this.movable = moveable; } public void setCof(double cof) { @@ -110,4 +130,22 @@ } } + @JSONHint(ignore = true) + public Primitive getPrim() { + return prim; + } + + public void setPrim(Primitive prim) { + this.prim = prim; + } + + @JSONHint(ignore = true) + public Object3D getObject() { + return (Object3D) getPlaceable().getBody(); + } + + public void setObject(Object3D object) { + this.object = object; + } + } \ No newline at end of file diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/ObjectModelManager.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/ObjectModelManager.java new file mode 100644 index 0000000..1d33074 --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/ObjectModelManager.java @@ -0,0 +1,46 @@ +package org.ntlab.radishforandroidstudio.cactusClient.models; + +import org.ntlab.radishforandroidstudio.framework.gameMain.RealTime3DFragment; +import org.ntlab.radishforandroidstudio.framework.model3D.Model3D; +import org.ntlab.radishforandroidstudio.framework.model3D.ModelFactory; +import org.ntlab.radishforandroidstudio.framework.model3D.ModelFileFormatException; + +import java.io.IOException; +import java.util.HashMap; + +class ObjectModelManager { + + private static ObjectModelManager theInstance = null; + private HashMap model = new HashMap<>(); + private RealTime3DFragment fragment; + + // TODO: 2018/10/23 ObjectModelManagerの記述 + private ObjectModelManager() { + try { + setObject(0, ModelFactory.loadModel(fragment.getResources(),getClass().getResource("cube-binary.stl").getPath())); + setObject(1, ModelFactory.loadModel(fragment.getResources(),getClass().getResource("cube-binary.stl").getPath())); + + } catch (IOException | ModelFileFormatException e) { + e.printStackTrace(); + } + } + + public static ObjectModelManager getInstance() { + if (theInstance == null) { + theInstance = new ObjectModelManager(); + } + return theInstance; + } + + public void setObject(int key, Model3D loadModel) { + model.put(key, loadModel); + } + + public Model3D getObject(int objectID) { + return model.get(objectID); + } + + public int getObjectModelCount() { + return model.size(); + } +} diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/views/PlayerFragment.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/views/PlayerFragment.java index b8f7ce3..ec06ad5 100644 --- a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/views/PlayerFragment.java +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/views/PlayerFragment.java @@ -15,7 +15,10 @@ import android.widget.Button; import org.ntlab.radishforandroidstudio.R; +import org.ntlab.radishforandroidstudio.cactusClient.connections.ObjectsConnection; import org.ntlab.radishforandroidstudio.cactusClient.models.CactusModels; +import org.ntlab.radishforandroidstudio.cactusClient.models.MovableObjectModel; +import org.ntlab.radishforandroidstudio.cactusClient.models.Object; import org.ntlab.radishforandroidstudio.cactusClient.models.OtherPlayerCharactersModel; import org.ntlab.radishforandroidstudio.cactusClient.models.OwnPlayer; import org.ntlab.radishforandroidstudio.cactusClient.models.Player; @@ -36,11 +39,14 @@ import org.ntlab.radishforandroidstudio.java3d.Vector3d; import org.ntlab.radishforandroidstudio.java3d.Vector3f; -public class PlayerFragment extends RealTime3DFragment{ +public class PlayerFragment extends RealTime3DFragment { private OvergroundActor pocha; RWTPad pad = null; private OwnPlayer player; + private Object object; private OtherPlayerCharactersModel otherPlayerCharactersModel; + private MovableObjectModel movableObjectModel; + private ObjectsConnection con; RWTUIFragment f = null; public PlayerFragment() { @@ -54,16 +60,12 @@ //環境光 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); // 地面の作成 @@ -96,23 +98,21 @@ Bundle bundle = getArguments(); // プレイヤーの作成とインスタンスIDのセット String playerId = bundle.getString("playerId"); - player = new OwnPlayer((Player)bundle.getSerializable("player"), getResources(), universe, camera, playerId); + + player = new OwnPlayer((Player) bundle.getSerializable("player"), getResources(), universe, camera, playerId); modelManager.addModel(player); + otherPlayerCharactersModel = new OtherPlayerCharactersModel(this, universe); otherPlayerCharactersModel.setPlayerId(playerId); modelManager.addModel(otherPlayerCharactersModel); modelManager.setInstanceId(bundle.getString("instanceId")); + //objectの通信 + String instanceId = bundle.getString("instanceId"); + movableObjectModel = new MovableObjectModel(this, universe, instanceId); + modelManager.addModel(movableObjectModel); + + //画面の生成 initGameWindowView(); - - - -// Button jumpButton = (Button) getActivity().findViewById(R.id.Button); -// jumpButton.setOnClickListener(new View.OnClickListener() { -// public void onClick(View v) { -// player.jump(); -// } -// }); - return parentView; } @@ -145,11 +145,6 @@ public void onCreateFragmentEvent(RWTUIFragment f) { pad = (RWTPad) f.findViewById(org.ntlab.radishforandroidstudio.R.id.pad); pad.addListener(player); -// Button button = (Button) f.findViewById(R.id.Button); -// button.setOnClickListener(player); - } - - }