package loon.live2d.framework;
import loon.BaseIO;
import loon.live2d.ALive2DModel;
import loon.live2d.physics.PhysicsHair;
import loon.live2d.util.Json;
import loon.live2d.util.UtSystem;
import loon.live2d.util.Json.Value;
import loon.utils.TArray;
public class L2DPhysics {
private TArray<PhysicsHair> physicsList;
private long startTimeMSec;
public L2DPhysics() {
physicsList = new TArray<PhysicsHair>();
startTimeMSec = UtSystem.getUserTimeMSec();
}
public void updateParam(ALive2DModel model) {
long timeMSec = UtSystem.getUserTimeMSec() - startTimeMSec;
for (int i = 0; i < physicsList.size; i++) {
physicsList.get(i).update(model, timeMSec);
}
}
public static L2DPhysics load(String path) throws Exception {
byte[] buf = BaseIO.loadBytes(path);
return load(buf);
}
public static L2DPhysics load(byte[] buf) throws Exception {
L2DPhysics ret = new L2DPhysics();
Value json = Json.parseFromBytes(buf);
Value params = json.get("physics_hair");
int paramNum = params.getVector(null).size;
for (int i = 0; i < paramNum; i++) {
Value param = params.get(i);
PhysicsHair physics = new PhysicsHair();
Value setup = param.get("setup");
float length = setup.get("length").toFloat();
float resist = setup.get("regist").toFloat();
float mass = setup.get("mass").toFloat();
physics.setup(length, resist, mass);
Value srcList = param.get("src");
int srcNum = srcList.getVector(null).size;
for (int j = 0; j < srcNum; j++) {
Value src = srcList.get(j);
String id = src.get("id").toString();// param ID
PhysicsHair.Src type = PhysicsHair.Src.SRC_TO_X;
String typeStr = src.get("ptype").toString();
if (typeStr.equals("x")) {
type = PhysicsHair.Src.SRC_TO_X;
} else if (typeStr.equals("y")) {
type = PhysicsHair.Src.SRC_TO_Y;
} else if (typeStr.equals("angle")) {
type = PhysicsHair.Src.SRC_TO_G_ANGLE;
}
float scale = src.get("scale").toFloat();
float weight = src.get("weight").toFloat();
physics.addSrcParam(type, id, scale, weight);
}
Value targetList = param.get("targets");
int targetNum = targetList.getVector(null).size;
for (int j = 0; j < targetNum; j++) {
Value target = targetList.get(j);
String id = target.get("id").toString();
PhysicsHair.Target type = PhysicsHair.Target.TARGET_FROM_ANGLE;
String typeStr = target.get("ptype").toString();
if (typeStr.equals("angle")) {
type = PhysicsHair.Target.TARGET_FROM_ANGLE;
} else if (typeStr.equals("angle_v")) {
type = PhysicsHair.Target.TARGET_FROM_ANGLE_V;
}
float scale = target.get("scale").toFloat();
float weight = target.get("weight").toFloat();
physics.addTargetParam(type, id, scale, weight);
}
ret.physicsList.add(physics);
}
return ret;
}
}