|
@@ -54,16 +54,15 @@ import com.jme3.texture.Image.Format;
|
|
|
import com.jme3.texture.Texture;
|
|
|
import com.jme3.texture.Texture2D;
|
|
|
import java.util.ArrayList;
|
|
|
-import java.util.HashMap;
|
|
|
-import java.util.Map;
|
|
|
+import static org.junit.Assert.assertEquals;
|
|
|
import org.junit.Before;
|
|
|
|
|
|
/**
|
|
|
- * Validates how {@link MatParamOverride MPOs} work on the material level.
|
|
|
+ * Validates {@link MatParam}s.
|
|
|
*
|
|
|
* @author Kirill Vainer
|
|
|
*/
|
|
|
-public class MaterialMatParamOverrideTest {
|
|
|
+public class MaterialMatParamTest {
|
|
|
|
|
|
private static final HashSet<String> IGNORED_UNIFORMS = new HashSet<String>(
|
|
|
Arrays.asList(new String[]{"m_ParallaxHeight", "m_Shininess", "m_BackfaceShadows"}));
|
|
@@ -84,6 +83,14 @@ public class MaterialMatParamOverrideTest {
|
|
|
outUniforms(uniform("UseMaterialColors", VarType.Boolean, true));
|
|
|
}
|
|
|
|
|
|
+ @Test
|
|
|
+ public void testBoolMpFalse() {
|
|
|
+ material("Common/MatDefs/Light/Lighting.j3md");
|
|
|
+ inputMp(mpoBool("UseMaterialColors", false));
|
|
|
+ outDefines(def("MATERIAL_COLORS", VarType.Boolean, false));
|
|
|
+ outUniforms(uniform("UseMaterialColors", VarType.Boolean, false));
|
|
|
+ }
|
|
|
+
|
|
|
@Test
|
|
|
public void testBoolOverrideFalse() {
|
|
|
material("Common/MatDefs/Light/Lighting.j3md");
|
|
@@ -118,6 +125,14 @@ public class MaterialMatParamOverrideTest {
|
|
|
outUniforms(uniform("AlphaDiscardThreshold", VarType.Float, 3.12f));
|
|
|
}
|
|
|
|
|
|
+ @Test
|
|
|
+ public void testFloatMpZero() {
|
|
|
+ material("Common/MatDefs/Light/Lighting.j3md");
|
|
|
+ inputMp(mpoFloat("AlphaDiscardThreshold", 0.0f));
|
|
|
+ outDefines(def("DISCARD_ALPHA", VarType.Float, 0.0f));
|
|
|
+ outUniforms(uniform("AlphaDiscardThreshold", VarType.Float, 0.0f));
|
|
|
+ }
|
|
|
+
|
|
|
@Test
|
|
|
public void testFloatOverride() {
|
|
|
material("Common/MatDefs/Light/Lighting.j3md");
|
|
@@ -190,6 +205,14 @@ public class MaterialMatParamOverrideTest {
|
|
|
outDefines(def("NUM_BONES", VarType.Int, 1234));
|
|
|
outUniforms(uniform("NumberOfBones", VarType.Int, 1234));
|
|
|
}
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testIntMpZero() {
|
|
|
+ material("Common/MatDefs/Light/Lighting.j3md");
|
|
|
+ inputMp(mpoInt("NumberOfBones", 0));
|
|
|
+ outDefines(def("NUM_BONES", VarType.Int, 0));
|
|
|
+ outUniforms(uniform("NumberOfBones", VarType.Int, 0));
|
|
|
+ }
|
|
|
|
|
|
@Test
|
|
|
public void testIntOverride() {
|
|
@@ -377,25 +400,31 @@ public class MaterialMatParamOverrideTest {
|
|
|
outTextures(tex1);
|
|
|
}
|
|
|
|
|
|
- private static final class Define {
|
|
|
+ private static class Define {
|
|
|
|
|
|
public String name;
|
|
|
public VarType type;
|
|
|
public Object value;
|
|
|
|
|
|
@Override
|
|
|
- public int hashCode() {
|
|
|
- int hash = 3;
|
|
|
- hash = 89 * hash + this.name.hashCode();
|
|
|
- hash = 89 * hash + this.type.hashCode();
|
|
|
- hash = 89 * hash + this.value.hashCode();
|
|
|
- return hash;
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public boolean equals(Object obj) {
|
|
|
- final Define other = (Define) obj;
|
|
|
- return this.name.equals(other.name) && this.type.equals(other.type) && this.value.equals(other.value);
|
|
|
+ public String toString() {
|
|
|
+ switch (type) {
|
|
|
+ case Boolean:
|
|
|
+ if ((Boolean)value) {
|
|
|
+ return "#define " + name + " 1\n";
|
|
|
+ } else {
|
|
|
+ return "";
|
|
|
+ }
|
|
|
+ case Int:
|
|
|
+ case Float:
|
|
|
+ return "#define " + name + " " + value + "\n";
|
|
|
+ default:
|
|
|
+ if (value != null) {
|
|
|
+ return "#define " + name + " 1\n";
|
|
|
+ } else {
|
|
|
+ return "";
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -411,13 +440,13 @@ public class MaterialMatParamOverrideTest {
|
|
|
private final NullRenderer renderer = new NullRenderer() {
|
|
|
@Override
|
|
|
public void setShader(Shader shader) {
|
|
|
- MaterialMatParamOverrideTest.this.usedShader = shader;
|
|
|
+ MaterialMatParamTest.this.usedShader = shader;
|
|
|
evaluated = true;
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public void setTexture(int unit, Texture texture) {
|
|
|
- MaterialMatParamOverrideTest.this.usedTextures[unit] = texture;
|
|
|
+ MaterialMatParamTest.this.usedTextures[unit] = texture;
|
|
|
}
|
|
|
};
|
|
|
private final RenderManager renderManager = new RenderManager(renderer);
|
|
@@ -512,11 +541,11 @@ public class MaterialMatParamOverrideTest {
|
|
|
}
|
|
|
|
|
|
private void outDefines(Define... expectedDefinesArray) {
|
|
|
- Map<String, Define> nameToDefineMap = new HashMap<String, Define>();
|
|
|
+ StringBuilder expectedDefineSource = new StringBuilder();
|
|
|
for (Define define : expectedDefinesArray) {
|
|
|
- nameToDefineMap.put(define.name, define);
|
|
|
+ expectedDefineSource.append(define.toString());
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
if (!evaluated) {
|
|
|
evaluateTechniqueDef();
|
|
|
}
|
|
@@ -525,56 +554,11 @@ public class MaterialMatParamOverrideTest {
|
|
|
Technique tech = mat.getActiveTechnique();
|
|
|
TechniqueDef def = tech.getDef();
|
|
|
DefineList actualDefines = tech.getDynamicDefines();
|
|
|
-
|
|
|
String[] defineNames = def.getDefineNames();
|
|
|
VarType[] defineTypes = def.getDefineTypes();
|
|
|
+ String actualDefineSource = actualDefines.generateSource(Arrays.asList(defineNames), Arrays.asList(defineTypes));
|
|
|
|
|
|
- Assert.assertEquals(defineNames.length, defineTypes.length);
|
|
|
-
|
|
|
- for (int index = 0; index < defineNames.length; index++) {
|
|
|
- String name = defineNames[index];
|
|
|
- VarType type = defineTypes[index];
|
|
|
- Define expectedDefine = nameToDefineMap.remove(name);
|
|
|
- Object expectedValue = null;
|
|
|
-
|
|
|
- if (expectedDefine != null) {
|
|
|
- Assert.assertEquals(expectedDefine.type, type);
|
|
|
- expectedValue = expectedDefine.value;
|
|
|
- }
|
|
|
-
|
|
|
- switch (type) {
|
|
|
- case Boolean:
|
|
|
- if (expectedValue != null) {
|
|
|
- Assert.assertEquals((boolean) (Boolean) expectedValue, actualDefines.getBoolean(index));
|
|
|
- } else {
|
|
|
- Assert.assertEquals(false, actualDefines.getBoolean(index));
|
|
|
- }
|
|
|
- break;
|
|
|
- case Int:
|
|
|
- if (expectedValue != null) {
|
|
|
- Assert.assertEquals((int) (Integer) expectedValue, actualDefines.getInt(index));
|
|
|
- } else {
|
|
|
- Assert.assertEquals(0, actualDefines.getInt(index));
|
|
|
- }
|
|
|
- break;
|
|
|
- case Float:
|
|
|
- if (expectedValue != null) {
|
|
|
- Assert.assertEquals((float) (Float) expectedValue, actualDefines.getFloat(index), 0f);
|
|
|
- } else {
|
|
|
- Assert.assertEquals(0f, actualDefines.getFloat(index), 0f);
|
|
|
- }
|
|
|
- break;
|
|
|
- default:
|
|
|
- if (expectedValue != null) {
|
|
|
- Assert.assertEquals(1, actualDefines.getInt(index));
|
|
|
- } else {
|
|
|
- Assert.assertEquals(0, actualDefines.getInt(index));
|
|
|
- }
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- Assert.assertTrue(nameToDefineMap.isEmpty());
|
|
|
+ assertEquals(expectedDefineSource.toString(), actualDefineSource);
|
|
|
}
|
|
|
|
|
|
private void outUniforms(Uniform... uniforms) {
|