diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser index 44d36cf..9ceeeae 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 02b0f1a..9b72418 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -39,5 +39,5 @@ implementation 'com.android.support:cardview-v7:27.1.1' implementation 'com.google.android.gms:play-services-maps:15.0.1' implementation group: 'org.apache.commons', name: 'commons-lang3', version: '3.0' - + implementation group: 'javax.servlet', name: 'javax.servlet-api', version: '3.0.1' } diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/connections/CharactersFragmentConnection.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/connections/CharactersFragmentConnection.java new file mode 100644 index 0000000..6ea7a4c --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/connections/CharactersFragmentConnection.java @@ -0,0 +1,11 @@ +package org.ntlab.radishforandroidstudio.cactusClient.connections; + +import org.ntlab.radishforandroidstudio.framework.network.HttpAsyncConnection; + +public class CharactersFragmentConnection extends HttpAsyncConnection { + + public CharactersFragmentConnection() { + super("http://nitta-lab-www.is.konan-u.ac.jp:8080/CactusServer/rest/Instances"); + } + +} diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/connections/InstancesFragmentConnection.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/connections/InstancesFragmentConnection.java new file mode 100644 index 0000000..14953d9 --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/connections/InstancesFragmentConnection.java @@ -0,0 +1,11 @@ +package org.ntlab.radishforandroidstudio.cactusClient.connections; + +import org.ntlab.radishforandroidstudio.framework.network.HttpAsyncConnection; + +public class InstancesFragmentConnection extends HttpAsyncConnection { + + public InstancesFragmentConnection() { + super("http://nitta-lab-www.is.konan-u.ac.jp:8080/CactusServer/rest/Instances"); + } + +} diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Angle.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Angle.java new file mode 100644 index 0000000..2f4f0cf --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Angle.java @@ -0,0 +1,52 @@ +package org.ntlab.radishforandroidstudio.cactusClient.models; + + +public class Angle { + private double vx; + private double vy; + private double vz; + private double a; + + private Angle() { + // JSONDecode時の呼び出し用 + } + + public Angle(double vx, double vy, double vz, double a) { + setVx(vx); + setVy(vy); + setVz(vz); + setA(a); + } + + public double getVx() { + return vx; + } + + public double getVy() { + return vy; + } + + public double getVz() { + return vz; + } + + public double getA() { + return a; + } + + public void setVx(double vx) { + this.vx = vx; + } + + public void setVy(double vy) { + this.vy = vy; + } + + public void setVz(double vz) { + this.vz = vz; + } + + public void setA(double a) { + this.a = a; + } +} \ No newline at end of file diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Area.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Area.java new file mode 100644 index 0000000..6b76158 --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Area.java @@ -0,0 +1,83 @@ +package org.ntlab.radishforandroidstudio.cactusClient.models; + + +import java.util.HashSet; + +import org.ntlab.radishforandroidstudio.framework.model3D.Position3D; + +import net.arnx.jsonic.JSONHint; + +public class Area extends Entity { + private String name; + private Plain[] region; // 任意個の平面の方程式 + private HashSet permissions; // エリア内で可能なことの羅列 + @JSONHint(ignore = true) + public static final int UNIQUE_ID_LENGTH = 12; + + @SuppressWarnings("unused") + private Area() { + // JSONDecode時の呼び出し用 + } + + public Area(String name, Plain[] region, HashSet permissions) { + setName(name); + setRegion(region); + setPermissions(permissions); + } + + public String getName() { + return name; + } + + public Plain[] getRegion() { + return region; + } + + public Plain getPlain(int index) { + return region[index]; + } + + public HashSet getPermissions() { + return permissions; + } + + public boolean isPermission(Allowed allowed) { + return permissions.contains(allowed); + } + + public boolean isSurroundingPosition(Position3D position) { + for (Plain plain : region) { + // ここで Plainのa,b,c,d と Characterのx,y,z を用いて, キャラクターが平面の裏にいるかどうかの判定を行う + double equation = (plain.getA() * position.getX()) + (plain.getB() * position.getY()) + + (plain.getC() * position.getZ()) + plain.getD(); + if (equation > 0) { + return false; + } + } + return true; + } + + public void setName(String name) { + this.name = name; + } + + public void setRegion(Plain[] region) { + this.region = region; + } + + public void setPermissions(HashSet permissions) { + this.permissions = permissions; + } + + public void addPermission(Allowed allowed) { + permissions.add(allowed); + } + + public void removePermission(Allowed allowed) { + permissions.remove(allowed); + } + + public static enum Allowed { + SHOOT, KILL; + } +} \ No newline at end of file diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/CameraState.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/CameraState.java new file mode 100644 index 0000000..04f22c3 --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/CameraState.java @@ -0,0 +1,52 @@ +package org.ntlab.radishforandroidstudio.cactusClient.models; + + +public class CameraState { + private double distance; // キャラからの距離 + private Angle angle; + private double tilt; // チルト(rad) + private double fov; // 視野角(rad) + + private CameraState() { + // JSONDecode時の呼び出し用 + } + + public CameraState(double distance, Angle angle, double tilt, double fov) { + setDistance(distance); + setAngle(angle); + setTilt(tilt); + setFov(fov); + } + + public double getDistance() { + return distance; + } + + public Angle getAngle() { + return angle; + } + + public double getTilt() { + return tilt; + } + + public double getFov() { + return fov; + } + + public void setDistance(double distance) { + this.distance = distance; + } + + public void setAngle(Angle angle) { + this.angle = angle; + } + + public void setTilt(double tilt) { + this.tilt = tilt; + } + + public void setFov(double fov) { + this.fov = fov; + } +} \ No newline at end of file diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Character.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Character.java new file mode 100644 index 0000000..2c5dbf8 --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Character.java @@ -0,0 +1,174 @@ +package org.ntlab.radishforandroidstudio.cactusClient.models; + + +import java.util.HashMap; + +import org.ntlab.radishforandroidstudio.framework.model3D.Position3D; +import org.ntlab.radishforandroidstudio.framework.model3D.Quaternion3D; + + + +import net.arnx.jsonic.JSONHint; + +public class Character extends Entity { + private String accountURI; + private String areaURI; + private String name; + private Position3D position; + private Quaternion3D angle; + private int modelID; + + private HashMap itemMap = new HashMap<>(); + @JSONHint(ignore = true) + public static final int UNIQUE_ID_LENGTH = 12; + + private Character() { + // JSONDecode時の呼び出し用 + } + + public Character(String instanceId, String accountURI, String name, Position3D position, Quaternion3D angle, + int modelID) { + setAccountURI(accountURI); + setName(name); + setPosition(position); + setQuaternion3D(angle); + setModelID(modelID); + initAreaURI(instanceId); + } + + public String getAccountURI() { + return accountURI; + } + + public String getName() { + return name; + } + + public Position3D getPosition() { + return position; + } + + public Quaternion3D getQuaternion3D() { + return angle; + } + + public int getModelID() { + return modelID; + } + + public String getAreaURI() { + return areaURI; + } + + @JSONHint(ignore = true) + public Item getItem(String itemId) { + return itemMap.get(itemId); + } + + @JSONHint(ignore = true) + public HashMap getItems() { + return itemMap; + } + + public void setAccountURI(String accountURI) { + this.accountURI = accountURI; + } + + public void setName(String name) { + this.name = name; + } + + public void setPosition(Position3D position) { + this.position = position; + } + + public void setQuaternion3D(Quaternion3D angle) { + this.angle = angle; + } + + public void setModelID(int modelID) { + this.modelID = modelID; + } + + public void setAreaURI(String areaURI) { + this.areaURI = areaURI; + } + + public HashMap createItem(String name, int amount) { + Item item = new Item(name, amount); + if (!hasItem(item)) { + String id = RandomStringGenerator.generateUniqueString(Item.UNIQUE_ID_LENGTH, + RandomStringGenerator.ALPHA_NUMERIC, itemMap.keySet()); + itemMap.put(id, item); + HashMap returnedMap = new HashMap<>(); + returnedMap.put(id, item); + return returnedMap; + } + return null; + } + + public boolean hasItem(Item item) { + for (Item value : itemMap.values()) { + if (value.equals(item)) { + return true; + } + } + return false; + } + + public Item changeAmountOfItem(String itemId, int amountOfChange) { + Item item = itemMap.get(itemId).changeAmount(amountOfChange); + if (item.isEmpty()) { + destroyItem(itemId); + } + return item; + } + + private void initAreaURI(String instanceId) { + Instance instance = Instances.getInstance().getInstance(instanceId); + setAreaURI(findAreaURI(instance)); + } + + private String findAreaURI(Instance instance) { + // キャラクターのポジションを用いてどのエリア内にいるかを判定して当該エリアのURIに更新する + for (String areaId : instance.getAreas().keySet()) { + Area area = instance.getArea(areaId); + if (area.isSurroundingPosition(position)) { + int subStringEndIndex = areaURI.length() - Area.UNIQUE_ID_LENGTH; + StringBuilder newAreaURI = new StringBuilder(); + return newAreaURI.append(areaURI.substring(0, subStringEndIndex)).append(areaId).toString(); + } + } + return ""; + } + + public void update(Position3D position, Quaternion3D angle, String modelID, String areaURI) { + setPosition(position); + setQuaternion3D(angle); + if (modelID != null) { + setModelID(Integer.parseInt(modelID)); + } + if (areaURI != null) { + setAreaURI(areaURI); + } else { + updateAreaURI(); + } + } + + private void updateAreaURI() { + String[] areaURISplit = areaURI.split("/"); // ……/instances/{instanceId}/areas/{areaId} + int splitSize = areaURISplit.length; + String instanceId = areaURISplit[splitSize - 3]; + String previousAreaId = areaURISplit[splitSize - 1]; + Instance instance = Instances.getInstance().getInstance(instanceId); + Area previousArea = instance.getArea(previousAreaId); + if (!previousArea.isSurroundingPosition(position)) { + // キャラクターのポジションを用いてどのエリア内にいるかを判定して当該エリアのURIに更新する + setAreaURI(findAreaURI(instance)); + } + } + + public Item destroyItem(String itemId) { + return itemMap.remove(itemId); + } +} \ No newline at end of file diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/CharacterModelManager.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/CharacterModelManager.java new file mode 100644 index 0000000..07a4dc8 --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/CharacterModelManager.java @@ -0,0 +1,83 @@ +package org.ntlab.radishforandroidstudio.cactusClient.models; + + +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import java.util.HashMap; +import java.util.Map; + +import org.ntlab.radishforandroidstudio.framework.model3D.Model3D; +import org.ntlab.radishforandroidstudio.framework.model3D.ModelFactory; +import org.ntlab.radishforandroidstudio.framework.model3D.ModelFileFormatException; + +public class CharacterModelManager { + private static CharacterModelManager theInstance = null; + private HashMap characterModels = new HashMap<>(); + private int nextKey = 0; + private static final String MODEL_PATH = "../../"; + + private CharacterModelManager() { + initCharacterModels(); + } + + private void initCharacterModels() { + String[] initCharacterModelFileNames = { "pocha.stl", "Head4.obj" }; + for (String fileName : initCharacterModelFileNames) { + addCharacterModel(fileName); + } + } + + public static CharacterModelManager getInstance() { + if (theInstance == null) { + theInstance = new CharacterModelManager(); + } + return theInstance; + } + + public Model3D getCharacterModel(int id) { + return characterModels.get(id); + } + + public int getCharacterModelCount() { + return characterModels.size(); + } + + public int addCharacterModel(String fileName) { + String path = createModelFilePath(MODEL_PATH + fileName); + characterModels.put(nextKey, loadModel(path)); + return nextKey++; + } + + private String createModelFilePath(String fileName) { + String path = getClass().getResource(fileName).getPath(); + try { + path = URLDecoder.decode(path, "utf-8"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + return path; + } + + private Model3D loadModel(String fileName) { + /***************************************************************************************************** + try { + return ModelFactory.loadModel(fileName, null, false, true); + } catch (IOException | ModelFileFormatException e) { + e.printStackTrace(); + } + *****************************************************************************************************/ + return null; + } + + /** + * 現在のCharacterModelMapの中身の確認用 + */ + private void confirmModelMap() { + // 確認用 + System.out.println(getCharacterModelCount() + "個のマッピングが存在するよ!"); + for (Map.Entry entry : characterModels.entrySet()) { + System.out.println(entry.getKey() + ": " + entry.getValue()); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/EmoteState.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/EmoteState.java new file mode 100644 index 0000000..de81264 --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/EmoteState.java @@ -0,0 +1,33 @@ +package org.ntlab.radishforandroidstudio.cactusClient.models; + + +/** + * エモートの情報を表すクラス
+ * 内部にエモートの種類を表す列挙型も定義 + * @author r-isitani + * + */ +public class EmoteState { + private EmoteType emoteType; + + private EmoteState() { + // JSONDecode時の呼び出し用 + } + + public EmoteState(EmoteType emoteType) { + setEmoteType(emoteType); + } + + public EmoteType getEmoteType() { + return emoteType; + } + + public void setEmoteType(EmoteType emoteType) { + this.emoteType = emoteType; + } + + public static enum EmoteType { + // 開始するエモートの種類の列挙 + DUMMY; + } +} \ No newline at end of file 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..9507a22 --- /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クラスにて扱う実体を表す抽象クラス + * @author r-isitani + * + */ +public abstract class Entity { + +} \ No newline at end of file diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Entity3D.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Entity3D.java new file mode 100644 index 0000000..351eec7 --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Entity3D.java @@ -0,0 +1,28 @@ +package org.ntlab.radishforandroidstudio.cactusClient.models; + + +import org.ntlab.radishforandroidstudio.framework.model3D.Placeable; + +import net.arnx.jsonic.JSONHint; + +public abstract class Entity3D extends Entity { + private Placeable placeable; + + protected Entity3D() { + // JSONDecode時の呼び出し用 + } + + public Entity3D(Placeable placeable) { + setPlaceable(placeable); + } + + @JSONHint(ignore = true) + public Placeable getPlaceable() { + return placeable; + } + + @JSONHint(ignore = true) + public void setPlaceable(Placeable placeable) { + this.placeable = placeable; + } +} \ No newline at end of file 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 new file mode 100644 index 0000000..564e380 --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Instance.java @@ -0,0 +1,169 @@ +package org.ntlab.radishforandroidstudio.cactusClient.models; + +import java.util.HashMap; +import java.util.HashSet; + +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.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; + +/** + * インスタンス + * + * @author r-isitani + * + */ +public class Instance extends Entity { + private String name; + private State state; + private int stageID; + + private Universe universe; + private Ground stage; + private HashMap areaMap = new HashMap<>(); + private HashMap objMap = new HashMap<>(); + private HashMap characterMap = new HashMap<>(); + @JSONHint(ignore = true) + public static final int UNIQUE_ID_LENGTH = 12; + + private Instance() { + // JSONDecode時の呼び出し用 + } + + public Instance(String name, int stageID) { + setName(name); + setState(Instance.State.AVAILABLE); + setStageID(stageID); + // initUniverse(); + } + + private void initUniverse() { + universe = new Universe(); + // ステージの3Dデータを読み込み配置する + Object3D stageObj = StageModelManager.getInstance().getStage(stageID).createObject(); + stage = new Ground(stageObj); + universe.place(stage); + } + + public String getName() { + return name; + } + + public State getState() { + return state; + } + + public int getStageID() { + return stageID; + } + + @JSONHint(ignore = true) + public Universe getUniverse() { + return universe; + } + + @JSONHint(ignore = true) + public HashMap getAreas() { + return areaMap; + } + + public Area getArea(String areaId) { + return areaMap.get(areaId); + } + + @JSONHint(ignore = true) + public HashMap getObjects() { + return objMap; + } + + public Object getObject(String objId) { + return objMap.get(objId); + } + + @JSONHint(ignore = true) + public HashMap getCharacters() { + return characterMap; + } + + public Character getCharacter(String characterId) { + return characterMap.get(characterId); + } + + public void setName(String name) { + this.name = name; + } + + public void setState(State state) { + this.state = state; + } + + public void setStageID(int stageURI) { + this.stageID = stageURI; + } + + 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); + areaMap.put(id, area); + HashMap returnedMap = new HashMap<>(); + returnedMap.put(id, area); + 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, + RandomStringGenerator.ALPHA_NUMERIC, characterMap.keySet()); + Character character = new Character(instanceId, accountURI, name, position, angle, modelID); + characterMap.put(id, character); + HashMap returnedMap = new HashMap<>(); + returnedMap.put(id, character); + return returnedMap; + } + + public Instance update(Instance.State state) { + setState(state); + 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); + } + + public Area destroyArea(String areaId) { + return areaMap.remove(areaId); + } + + public Object destroyObject(String objId) { + return objMap.remove(objId); + } + + public static enum State { + AVAILABLE, MAINTENANCE; + } +} \ No newline at end of file diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Instances.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Instances.java new file mode 100644 index 0000000..1c7ebe0 --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Instances.java @@ -0,0 +1,120 @@ +package org.ntlab.radishforandroidstudio.cactusClient.models; + + +import java.util.HashMap; + +import org.ntlab.radishforandroidstudio.framework.model3D.Position3D; +import org.ntlab.radishforandroidstudio.framework.model3D.Quaternion3D; + +/** + * インスタンスを管理するクラス + * + * @author r-isitani + * + */ +public class Instances { + private static Instances theInstance = null; + private HashMap instanceMap = new HashMap<>(); // instanceのIDと実体を管理 + private HashMap playerMap = new HashMap<>(); + + private Instances() { +// // ダミーコード +// instanceMap.put("test1", new Instance("test1", 0)); +// instanceMap.put("test2", new Instance("test2", 1)); + } + + /** + * Instancesクラスを取得する (シングルトン) + * + * @return + */ + public static Instances getInstance() { + if (theInstance == null) { + theInstance = new Instances(); + } + return theInstance; + } + + public HashMap createInstance(String name, int stageID) { + String id = RandomStringGenerator.generateUniqueString(Instance.UNIQUE_ID_LENGTH, + RandomStringGenerator.ALPHA_NUMERIC, instanceMap.keySet()); + Instance instance = new Instance(name, stageID); + instanceMap.put(id, instance); + HashMap returnedMap = new HashMap<>(); + returnedMap.put(id, instance); + return returnedMap; + } + + public HashMap createPlayer(String instanceURI, String characterURI, CameraState cameraState, + EmoteState.EmoteType animationClassToStart) { + String id = RandomStringGenerator.generateUniqueString(Player.UNIQUE_ID_LENGTH, + RandomStringGenerator.ALPHA_NUMERIC, playerMap.keySet()); + Player player = new Player(instanceURI, characterURI, cameraState, animationClassToStart); + playerMap.put(id, player); + HashMap returnedMap = new HashMap<>(); + returnedMap.put(id, player); + return returnedMap; + } + + public HashMap getInstances() { + return instanceMap; + } + + public Instance getInstance(String instanceId) { + return instanceMap.get(instanceId); + } + + /** + * 全playerを返す + */ + public HashMap getPlayers() { + return playerMap; + } + + /** + * IDに対応するinstanceにいる全playerを返す + * + * @param instanceId + */ + public HashMap getPlayers(String instanceId) { + if (instanceId == null || instanceId.isEmpty()) { + return getPlayers(); + } + HashMap responsePlayers = new HashMap<>(); + for (String id : playerMap.keySet()) { + Player player = playerMap.get(id); + String[] instanceURISplit = player.getInstanceURI().split("/"); // …/instances/{instanceId} + if (instanceId.equals(instanceURISplit[instanceURISplit.length - 1])) { + responsePlayers.put(id, player); + } + } + return responsePlayers; + } + + public Player getPlayer(String playerId) { + return playerMap.get(playerId); + } + + public Instance updateInstance(String instanceId, Instance.State state) { + Instance instance = instanceMap.get(instanceId); + instance.update(state); + return instance; + } + + public Player updatePlayer(String playerId, String characterURI, Position3D position, Quaternion3D angle, + CameraState cameraState, EmoteState.EmoteType animationClassToStart) { + Player player = playerMap.get(playerId); + player.update(characterURI, position, angle, cameraState, animationClassToStart); + return player; + } + + public Instance destroyInstance(String instanceId) { + return instanceMap.remove(instanceId); + } + + public Player destroyPlayer(String playerId) { + Player player = playerMap.get(playerId); + player.destroy(); + return playerMap.remove(playerId); + } +} \ No newline at end of file diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Item.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Item.java new file mode 100644 index 0000000..ab0f447 --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Item.java @@ -0,0 +1,66 @@ +package org.ntlab.radishforandroidstudio.cactusClient.models; + +import net.arnx.jsonic.JSONHint; + +public class Item extends Entity { + private String name; + private int amount; + + @JSONHint(ignore = true) + public static final int UNIQUE_ID_LENGTH = 12; + + private Item() { + // JSONDecode時の呼び出し用 + } + + public Item(String name, int amount) { + setName(name); + setAmount(amount); + } + + public String getName() { + return name; + } + + public int getAmount() { + return amount; + } + + public boolean isEmpty() { + return (amount == 0); + } + + public void setName(String name) { + this.name = name; + } + + public void setAmount(int amount) { + this.amount = amount; + } + + public Item changeAmount(int amountOfChange) { + amount = Math.max(amount + amountOfChange, 0); + return this; + } + + @Override + public int hashCode() { + int result = 17; + result = result * 31 + name.hashCode(); + return result; + } + + @Override + public boolean equals(java.lang.Object obj) { + if (this == obj) { + return true; + } + if (obj instanceof Item) { + Item item = (Item) obj; + if (this.name.equals(item.name)) { + return true; // 同名のアイテムは等価 + } + } + return false; + } +} \ No newline at end of file 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 new file mode 100644 index 0000000..5ee62ac --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Object.java @@ -0,0 +1,113 @@ +package org.ntlab.radishforandroidstudio.cactusClient.models; + +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 framework.model3D.Position3D; +//import framework.physics.AngularVelocity3D; +//import framework.physics.Velocity3D; +import net.arnx.jsonic.JSONHint; + +public class Object extends Entity3D { + private Position3D position; + private Velocity3D velocity; + private AngularVelocity3D angularVelocity; + private Quaternion3D angle; + private Attribute attribute; + private String model; + + @JSONHint(ignore = true) + public static final int UNIQUE_ID_LENGTH = 12; + + @SuppressWarnings("unused") + private Object() { + // JSONDecode時の呼び出し用 + } + + public Object(Position3D position, Velocity3D velocity, AngularVelocity3D angularVelocity, Quaternion3D angle, + Attribute attribute, String model) { + setPosition(position); + setVelocity(velocity); + setAngularVelocity(angularVelocity); + setAngle(angle); + setAttribute(attribute); + setModel(model); + } + + public Position3D getPosition() { + return position; + } + + public Velocity3D getVelocity() { + return velocity; + } + + public AngularVelocity3D getAngularVelocity() { + return angularVelocity; + } + + public Quaternion3D getAngle() { + return angle; + } + + public Attribute getAttribute() { + return attribute; + } + + public String getModel() { + return model; + } + + public void setPosition(Position3D position) { + this.position = position; + } + + public void setVelocity(Velocity3D velocity) { + this.velocity = velocity; + } + + public void setAngularVelocity(AngularVelocity3D angularVelocity) { + this.angularVelocity = angularVelocity; + } + + public void setAngle(Quaternion3D angle) { + this.angle = angle; + } + + public void setAttribute(Attribute attribute) { + this.attribute = attribute; + } + + public void setModel(String model) { + this.model = model; + } + + public static class Attribute { + private boolean moveable; // 可動 + private double cof; // 摩擦係数 + + public Attribute(boolean moveable, double cof) { + setMoveable(moveable); + setCof(cof); + } + + public boolean isMoveable() { + return moveable; + } + + public double getCof() { + return cof; + } + + public void setMoveable(boolean moveable) { + this.moveable = moveable; + } + + public void setCof(double cof) { + this.cof = cof; + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Plain.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Plain.java new file mode 100644 index 0000000..9b92230 --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Plain.java @@ -0,0 +1,52 @@ +package org.ntlab.radishforandroidstudio.cactusClient.models; + + +public class Plain { + private double a; // 平面の方程式 ax+by+cz+d のa + private double b; // 平面の方程式 ax+by+cz+d のb + private double c; // 平面の方程式 ax+by+cz+d のc + private double d; // 平面の方程式 ax+by+cz+d のd + + private Plain() { + // JSONDecode時の呼び出し用 + } + + public Plain(double a, double b, double c, double d) { + setA(a); + setB(b); + setC(c); + setD(d); + } + + public double getA() { + return a; + } + + public double getB() { + return b; + } + + public double getC() { + return c; + } + + public double getD() { + return d; + } + + public void setA(double a) { + this.a = a; + } + + public void setB(double b) { + this.b = b; + } + + public void setC(double c) { + this.c = c; + } + + public void setD(double d) { + this.d = d; + } +} \ No newline at end of file diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Player.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Player.java new file mode 100644 index 0000000..c02904d --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Player.java @@ -0,0 +1,180 @@ +package org.ntlab.radishforandroidstudio.cactusClient.models; + + +import org.ntlab.radishforandroidstudio.framework.gameMain.OvergroundActor; +import org.ntlab.radishforandroidstudio.framework.model3D.Object3D; +import org.ntlab.radishforandroidstudio.framework.model3D.Position3D; +import org.ntlab.radishforandroidstudio.framework.model3D.Quaternion3D; + +import net.arnx.jsonic.JSONHint; + +public class Player extends Entity3D { + private String instanceURI; + private String characterURI; + private String areaURI; + private Position3D position; + private Quaternion3D angle; + private CameraState cameraState; + private EmoteState emoteState; + @JSONHint(ignore = true) + public static final int UNIQUE_ID_LENGTH = 12; + + private Player() { + // JSONDecode時の呼び出し用 + } + + public Player(String instanceURI, String characterURI, CameraState cameraState, + EmoteState.EmoteType animationClassToStart) { + setInstanceURI(instanceURI); + setCharacterURI(characterURI); + setCameraState(cameraState); + setAnimationClassToStart(animationClassToStart); + Character character = getCharacter(characterURI); + readCharacterData(character); + initPlaceable(character.getModelID()); + } + + private void initPlaceable(int modelID) { + // こんな感じで当該コンストラクタの最後でplaceableの注入を行う + Object3D body = CharacterModelManager.getInstance().getCharacterModel(modelID).createObject(); + setPlaceable(new OvergroundActor(body, null)); + // 所属するInstanceが持つUniverseにplaceableを配置する + String[] instanceURISplit = instanceURI.split("/"); // ……/instances/{instanceId} + String instanceId = instanceURISplit[instanceURISplit.length - 1]; + Instances.getInstance().getInstance(instanceId).getUniverse().place(this.getPlaceable()); + } + + public String getInstanceURI() { + return instanceURI; + } + + public String getCharacterURI() { + return characterURI; + } + + public String getAreaURI() { + return areaURI; + } + + public Position3D getPosition() { + return position; + } + + public Quaternion3D getQuaternion3D() { + return angle; + } + + public CameraState getCameraState() { + return cameraState; + } + + public EmoteState getEmoteState() { + return emoteState; + } + + public void setInstanceURI(String instanceURI) { + this.instanceURI = instanceURI; + } + + public void setCharacterURI(String characterURI) { + this.characterURI = characterURI; + } + + public void setAreaURI(String areaURI) { + this.areaURI = areaURI; + } + + public void setPosition(Position3D position) { + this.position = position; + } + + public void setQuaternion3D(Quaternion3D angle) { + this.angle = angle; + } + + public void setCameraState(CameraState cameraState) { + this.cameraState = cameraState; + } + + public void setEmoteState(EmoteState emoteState) { + this.emoteState = emoteState; + } + + public void setAnimationClassToStart(EmoteState.EmoteType animationClassToStart) { + setEmoteState(new EmoteState(animationClassToStart)); + } + + public Player update(String characterURI, Position3D position, Quaternion3D angle, CameraState cameraState, + EmoteState.EmoteType animationClassToStart) { + setCharacterURI(characterURI); + setPosition(position); + setQuaternion3D(angle); + setCameraState(cameraState); + updateEmoteType(animationClassToStart); + updateAreaURI(); + return this; + } + + private void updateAreaURI() { + String[] areaURISplit = areaURI.split("/"); // ……/instances/{instanceId}/areas/{areaId} + int splitSize = areaURISplit.length; + String instanceId = areaURISplit[splitSize - 3]; + String previousAreaId = areaURISplit[splitSize - 1]; + Instance instance = Instances.getInstance().getInstance(instanceId); + Area previousArea = instance.getArea(previousAreaId); + if (!previousArea.isSurroundingPosition(position)) { + // キャラクターのポジションを用いてどのエリア内にいるかを判定して当該エリアのURIに更新する + setAreaURI(findAreaURI(instance)); + } + } + + private String findAreaURI(Instance instance) { + // キャラクターのポジションを用いてどのエリア内にいるかを判定して当該エリアのURIに更新する + for (String areaId : instance.getAreas().keySet()) { + Area area = instance.getArea(areaId); + if (area.isSurroundingPosition(position)) { + int subStringEndIndex = areaURI.length() - Area.UNIQUE_ID_LENGTH; // …/{instanceId}/areas/ まで + return areaURI.substring(0, subStringEndIndex) + areaId; + } + } + return ""; + } + + private void updateEmoteType(EmoteState.EmoteType animationClassToStart) { + emoteState.setEmoteType(animationClassToStart); + } + + public void changeCharacter(String characterURI) { + writeCharacterData(this.characterURI); + readCharacterData(characterURI); + } + + public void destroy() { + writeCharacterData(characterURI); + } + + private Character getCharacter(String characterURI) { + String[] characterURISplit = characterURI.split("/"); // ……/instances/{instanceId}/characters/{characterId} + int splitSize = characterURISplit.length; + String characterId = characterURISplit[splitSize - 1]; + String instanceId = characterURISplit[splitSize - 3]; + return Instances.getInstance().getInstance(instanceId).getCharacter(characterId); + } + + private void readCharacterData(Character character) { + setPosition(character.getPosition()); + setQuaternion3D(character.getQuaternion3D()); + setAreaURI(character.getAreaURI()); + setCharacterURI(characterURI); + } + + private void readCharacterData(String characterURI) { + Character character = getCharacter(characterURI); + readCharacterData(character); + } + + private void writeCharacterData(String characterURI) { + Character character = getCharacter(characterURI); + character.update(position, angle, null, areaURI); // model(第3引数)の更新は出来ない + } +} \ No newline at end of file diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/StageModelManager.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/StageModelManager.java new file mode 100644 index 0000000..5287d4f --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/StageModelManager.java @@ -0,0 +1,45 @@ +package org.ntlab.radishforandroidstudio.cactusClient.models; + + +import java.io.IOException; +import java.util.HashMap; + +import org.ntlab.radishforandroidstudio.framework.model3D.Model3D; +import org.ntlab.radishforandroidstudio.framework.model3D.ModelFactory; +import org.ntlab.radishforandroidstudio.framework.model3D.ModelFileFormatException; + +public class StageModelManager { + private static StageModelManager theInstance = null; + private HashMap model = new HashMap<>(); + + private StageModelManager() { + /***************************************************************************************************** + try { + setStage(0, ModelFactory.loadModel(getClass().getResource("../../konan/konan.stl").getPath())); + setStage(1, ModelFactory.loadModel(getClass().getResource("../../konan/konan.stl").getPath())); + } catch (IOException | ModelFileFormatException e) { + e.printStackTrace(); + } + *******************************************************************************************************/ + } + + public static StageModelManager getInstance() { + if (theInstance == null) { + theInstance = new StageModelManager(); + } + return theInstance; + } + + public void setStage(int key, Model3D model3d) { + model.put(key, model3d); + } + + public Model3D getStage(int stageID) { + return model.get(stageID); + } + + public int getStageModelCount() { + return model.size(); + } + +} \ 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 index 5c5d928..8ad6d11 100644 --- a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/views/InstancesFragment.java +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/views/InstancesFragment.java @@ -12,45 +12,64 @@ import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.ListView; +import android.widget.Toast; +import net.arnx.jsonic.JSON; +import net.arnx.jsonic.TypeReference; + import org.ntlab.radishforandroidstudio.R; import org.ntlab.radishforandroidstudio.cactusClient.Cactus; +import org.ntlab.radishforandroidstudio.cactusClient.connections.InstancesFragmentConnection; +import org.ntlab.radishforandroidstudio.cactusClient.connections.SignUpFragmentConnection; import org.ntlab.radishforandroidstudio.cactusClient.models.Account; +import org.ntlab.radishforandroidstudio.cactusClient.models.Instance; +import org.ntlab.radishforandroidstudio.cactusClient.models.URIAddressedAccount; +import org.ntlab.radishforandroidstudio.framework.network.CallBack; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; public class InstancesFragment extends Fragment { - + private InstancesFragmentConnection connection; + ArrayList> listInstances ; + ListView listView; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - - - //このあたりで、サーバーと通信して、インスタンスの情報をとってくる - //............................................................... - //getInstances - // - - // Inflate the layout for this fragment return inflater.inflate(R.layout.instances_fragment, container, false); } @Override public void onViewCreated(View view, Bundle savedInstanceState) { - // ListViewに表示するデータ - final ArrayList items = new ArrayList<>(); - items.add("インスタンス1"); - items.add("インスタンス2"); - items.add("インスタンス3"); - // ListViewをセット - final ArrayAdapter adapter = new ArrayAdapter(this.getContext(), android.R.layout.simple_list_item_1, items); - ListView listView = (ListView) view.findViewById(R.id.list_view); - listView.setAdapter(adapter); + connection = new InstancesFragmentConnection(); + connection.setCallBack(new CallBack() { + @Override + public void onResponse(String response) { + //通信した時の処理を書くのだよ + HashMap mapInstances = JSON.decode(response, new TypeReference>(){}); + System.out.println(response); +// for(Map.Entry entry : mapInstances.entrySet()){ +// listInstances.add(entry); +// } + listInstances = new ArrayList<>(mapInstances.entrySet()); + ArrayList listNames = new ArrayList<>(); + for(Map.Entry entry : listInstances) { + listNames.add(entry.getValue().getName()); + } + // ListViewをセット + ArrayAdapter adapter = new ArrayAdapter(getContext(), android.R.layout.simple_list_item_1, listNames); + listView = (ListView) view.findViewById(R.id.list_view); + listView.setAdapter(adapter); + } + }); + connection.doGet(); + // セルを選択されたら詳細画面フラグメント呼び出す listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override @@ -58,8 +77,7 @@ //ここでサーバーに何番のインスタンスが選ばれたのかを送信して、受け取った値に応じてキャラクターを送信しなければならない //................................................... - //positionで選ばれたインスタンスわかるで!数字は0からやで!例えば1はデータ2やで!やで - + //InstanceNum+で選ばれたインスタンスわかるで!数字は0からやで!例えば1はデータ2やで!やで FragmentManager manager = getFragmentManager(); FragmentTransaction transaction = manager.beginTransaction(); CharactersFragment fragment = new CharactersFragment();