瀏覽代碼

Fixes Issue #2082 (AlphaBlendModeTest) (#2084)

* test model appearance is correct

* comment changes

* fixed javadoc and license

* deleted incompatible assets and fixed code style

* fixed return value for masked blend
codex 1 年之前
父節點
當前提交
d89e3799a6
共有 1 個文件被更改,包括 20 次插入12 次删除
  1. 20 12
      jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/PBRMaterialAdapter.java

+ 20 - 12
jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/PBRMaterialAdapter.java

@@ -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;