Newer
Older
Cactus-CleanArchitecture / app / src / main / java / org / ntlab / radishforandroidstudio / cactusClient / models / MovableObjectModel.java
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<String, MovableObject> 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<String, Object> o = json.decode(response, new TypeReference<Map<String, Object>>() {
        });
        for (Map.Entry<String, Object> entry : o.entrySet()) {
            ArrayList<Property3D> 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();
                    objBody.scale(0.1);
                } 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));
            }
        }


    }
}