|
@@ -34,10 +34,17 @@ package com.jme3.scene.plugins.gltf;
|
|
|
import com.jme3.material.*;
|
|
|
|
|
|
/**
|
|
|
- * Created by Nehon on 08/08/2017.
|
|
|
+ * Adapts GLTF PBR materials to JME PBR materials.
|
|
|
+ *
|
|
|
+ * @author Nehon
|
|
|
*/
|
|
|
public abstract class PBRMaterialAdapter extends MaterialAdapter {
|
|
|
-
|
|
|
+
|
|
|
+ /**
|
|
|
+ * The default alpha discard threshold for "MASK" blend mode.
|
|
|
+ */
|
|
|
+ public static final float MASK_ALPHA_DISCARD = 0.5f;
|
|
|
+
|
|
|
public PBRMaterialAdapter() {
|
|
|
addParamMapping("normalTexture", "NormalMap");
|
|
|
addParamMapping("normalScale", "NormalScale");
|
|
@@ -60,15 +67,16 @@ public abstract class PBRMaterialAdapter extends MaterialAdapter {
|
|
|
if (param.getName().equals("alpha")) {
|
|
|
String alphaMode = (String) param.getValue();
|
|
|
switch (alphaMode) {
|
|
|
- case "MASK": // fallthrough
|
|
|
+ case "MASK":
|
|
|
+ // "MASK" -> BlendMode.Off
|
|
|
+ getMaterial().setFloat("AlphaDiscardThreshold", MASK_ALPHA_DISCARD);
|
|
|
+ break;
|
|
|
case "BLEND":
|
|
|
getMaterial().getAdditionalRenderState().setBlendMode(RenderState.BlendMode.Alpha);
|
|
|
- break;
|
|
|
+ // Alpha is a RenderState not a Material Parameter, so return null
|
|
|
+ return null;
|
|
|
}
|
|
|
- // Alpha is a RenderState not a Material Parameter, so return null
|
|
|
- return null;
|
|
|
- }
|
|
|
- if (param.getName().equals("doubleSided")) {
|
|
|
+ } else if (param.getName().equals("doubleSided")) {
|
|
|
boolean doubleSided = (boolean) param.getValue();
|
|
|
if (doubleSided) {
|
|
|
//Note that this is not completely right as normals on the back side will be in the wrong direction.
|
|
@@ -76,14 +84,14 @@ public abstract class PBRMaterialAdapter extends MaterialAdapter {
|
|
|
}
|
|
|
// FaceCulling is a RenderState not a Material Parameter, so return null
|
|
|
return null;
|
|
|
- }
|
|
|
- if (param.getName().equals("NormalMap")) {
|
|
|
+ } else if (param.getName().equals("NormalMap")) {
|
|
|
//Set the normal map type to OpenGl
|
|
|
getMaterial().setFloat("NormalType", 1.0f);
|
|
|
- }
|
|
|
- if (param.getName().equals("LightMap")) {
|
|
|
+ } else if (param.getName().equals("LightMap")) {
|
|
|
//Gltf only supports AO maps (gray scales and only the r channel must be read)
|
|
|
getMaterial().setBoolean("LightMapAsAOMap", true);
|
|
|
+ } else if (param.getName().equals("alphaCutoff")) {
|
|
|
+ getMaterial().setFloat("AlphaDiscardThreshold", (float)param.getValue());
|
|
|
}
|
|
|
|
|
|
return param;
|