|
@@ -7,8 +7,10 @@ import com.jme3.asset.*;
|
|
|
import com.jme3.material.Material;
|
|
|
import com.jme3.material.RenderState;
|
|
|
import com.jme3.math.*;
|
|
|
+import com.jme3.renderer.Camera;
|
|
|
import com.jme3.renderer.queue.RenderQueue;
|
|
|
import com.jme3.scene.*;
|
|
|
+import com.jme3.scene.control.CameraControl;
|
|
|
import com.jme3.texture.Texture;
|
|
|
import com.jme3.texture.Texture2D;
|
|
|
import com.jme3.util.IntMap;
|
|
@@ -45,6 +47,7 @@ public class GltfLoader implements AssetLoader {
|
|
|
private JsonArray samplers;
|
|
|
private JsonArray animations;
|
|
|
private JsonArray skins;
|
|
|
+ private JsonArray cameras;
|
|
|
|
|
|
private Material defaultMat;
|
|
|
private AssetInfo info;
|
|
@@ -107,11 +110,12 @@ public class GltfLoader implements AssetLoader {
|
|
|
samplers = docRoot.getAsJsonArray("samplers");
|
|
|
animations = docRoot.getAsJsonArray("animations");
|
|
|
skins = docRoot.getAsJsonArray("skins");
|
|
|
-
|
|
|
+ cameras = docRoot.getAsJsonArray("cameras");
|
|
|
|
|
|
customContentManager.init(this);
|
|
|
|
|
|
readSkins();
|
|
|
+ readCameras();
|
|
|
|
|
|
JsonPrimitive defaultScene = docRoot.getAsJsonPrimitive("scene");
|
|
|
|
|
@@ -219,10 +223,16 @@ public class GltfLoader implements AssetLoader {
|
|
|
|
|
|
} else {
|
|
|
//no mesh, we have a node. Can be a camera node or a regular node.
|
|
|
- //TODO handle camera nodes?
|
|
|
- Node node = new Node();
|
|
|
-
|
|
|
- spatial = node;
|
|
|
+ Integer camIndex = getAsInteger(nodeData, "camera");
|
|
|
+ if (camIndex != null) {
|
|
|
+ Camera cam = fetchFromCache("cameras", camIndex, Camera.class);
|
|
|
+ CameraNode node = new CameraNode(null, cam);
|
|
|
+ node.setControlDir(CameraControl.ControlDirection.SpatialToCamera);
|
|
|
+ spatial = node;
|
|
|
+ } else {
|
|
|
+ Node node = new Node();
|
|
|
+ spatial = node;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
Integer skinIndex = getAsInteger(nodeData, "skin");
|
|
@@ -566,6 +576,51 @@ public class GltfLoader implements AssetLoader {
|
|
|
return adapter.getMaterial();
|
|
|
}
|
|
|
|
|
|
+ public void readCameras() {
|
|
|
+ if (cameras == null) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ for (int i = 0; i < cameras.size(); i++) {
|
|
|
+
|
|
|
+ //Can't access resolution here... actually it's a shame we can't access settings from anywhere.
|
|
|
+ //users will have to call resize ont he camera.
|
|
|
+ Camera cam = new Camera(1, 1);
|
|
|
+
|
|
|
+ JsonObject camObj = cameras.get(i).getAsJsonObject();
|
|
|
+ String type = getAsString(camObj, "type");
|
|
|
+ assertNotNull(type, "No type defined ofr camera");
|
|
|
+ JsonObject camData = camObj.getAsJsonObject(type);
|
|
|
+ if (type.equals("perspective")) {
|
|
|
+ float aspectRatio = getAsFloat(camData, "aspectRation", 1f);
|
|
|
+ Float yfov = getAsFloat(camData, "yfov");
|
|
|
+ assertNotNull(yfov, "No yfov for perspective camera");
|
|
|
+ Float znear = getAsFloat(camData, "znear");
|
|
|
+ assertNotNull(znear, "No znear for perspective camere");
|
|
|
+ Float zfar = getAsFloat(camData, "zfar", znear * 1000f);
|
|
|
+
|
|
|
+ cam.setFrustumPerspective(yfov * FastMath.RAD_TO_DEG, aspectRatio, znear, zfar);
|
|
|
+ cam = customContentManager.readExtension(camData, cam);
|
|
|
+
|
|
|
+ } else {
|
|
|
+ Float xmag = getAsFloat(camData, "xmag");
|
|
|
+ assertNotNull(xmag, "No xmag for orthographic camera");
|
|
|
+ Float ymag = getAsFloat(camData, "ymag");
|
|
|
+ assertNotNull(ymag, "No ymag for orthographic camera");
|
|
|
+ Float znear = getAsFloat(camData, "znear");
|
|
|
+ assertNotNull(znear, "No znear for orthographic camere");
|
|
|
+ Float zfar = getAsFloat(camData, "zfar", znear * 1000f);
|
|
|
+ assertNotNull(zfar, "No zfar for orthographic camere");
|
|
|
+
|
|
|
+ cam.setParallelProjection(true);
|
|
|
+ cam.setFrustum(znear, zfar, -xmag, xmag, ymag, -ymag);
|
|
|
+
|
|
|
+ cam = customContentManager.readExtension(camData, cam);
|
|
|
+ }
|
|
|
+
|
|
|
+ addToCache("cameras", i, cam, cameras.size());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
public Texture2D readTexture(JsonObject texture) {
|
|
|
return readTexture(texture, false);
|
|
|
|