public DefineList deepClone() { return new DefineList(this); }
/** * Create a define list with the size matching the number * of defines on this technique. * * @return a define list with the size matching the number * of defines on this technique. */ public DefineList createDefineList() { return new DefineList(defineNames.size()); }
private static String createShaderPrologue(List<String> presetDefines) { DefineList dl = new DefineList(presetDefines.size()); for (int i = 0; i < presetDefines.size(); i++) { dl.set(i, 1); } StringBuilder sb = new StringBuilder(); dl.generateSource(sb, presetDefines, null); return sb.toString(); }
private static String doLookup(HashMap<DefineList, String> map, Boolean boolVal, Integer intVal, Float floatVal) { DefineList dl = new DefineList(NUM_DEFINES); dl.set(BOOL_VAR, VarType.Boolean, boolVal); dl.set(INT_VAR, VarType.Int, intVal); dl.set(FLOAT_VAR, VarType.Float, floatVal); return map.get(dl); }
@Test public void testSourceInitial() { DefineList dl = new DefineList(NUM_DEFINES); assert dl.hashCode() == 0; assert generateSource(dl).equals(""); }
@Test public void testHashCollision() { DefineList dl1 = new DefineList(64); DefineList dl2 = new DefineList(64); // Try to cause a hash collision // (since bit #32 is aliased to bit #1 in 32-bit ints) dl1.set(0, 123); dl1.set(32, 0); dl2.set(32, 0); dl2.set(0, 123); assert dl1.hashCode() == dl2.hashCode(); assert dl1.equals(dl2); }
@Test public void testSourceBooleanDefine() { DefineList dl = new DefineList(NUM_DEFINES); dl.set(BOOL_VAR, true); assert dl.hashCode() == 1; assert generateSource(dl).equals("#define BOOL_VAR 1\n"); dl.set(BOOL_VAR, false); assert dl.hashCode() == 0; assert generateSource(dl).equals(""); dl.set(BOOL_VAR, true); assert dl.hashCode() == 1; assert generateSource(dl).equals("#define BOOL_VAR 1\n"); dl.unset(BOOL_VAR); assert dl.hashCode() == 0; assert generateSource(dl).equals(""); }
@Test public void testSourceIntDefine() { DefineList dl = new DefineList(NUM_DEFINES); int hashCodeWithInt = 1 << INT_VAR; dl.set(INT_VAR, 123); assert dl.hashCode() == hashCodeWithInt; assert generateSource(dl).equals("#define INT_VAR 123\n"); dl.set(INT_VAR, 0); assert dl.hashCode() == hashCodeWithInt; assert generateSource(dl).equals("#define INT_VAR 0\n"); dl.set(INT_VAR, -99); assert dl.hashCode() == hashCodeWithInt; assert generateSource(dl).equals("#define INT_VAR -99\n"); dl.set(INT_VAR, Integer.MAX_VALUE); assert dl.hashCode() == hashCodeWithInt; assert generateSource(dl).equals("#define INT_VAR 2147483647\n"); dl.unset(INT_VAR); assert dl.hashCode() == 0; assert generateSource(dl).equals(""); }
DefineList lookup = new DefineList(NUM_DEFINES);
@Test public void testSourceFloatDefine() { DefineList dl = new DefineList(NUM_DEFINES);
@Test public void testGetSet() { DefineList dl = new DefineList(NUM_DEFINES); assertFalse(dl.getBoolean(BOOL_VAR)); assertEquals(dl.getInt(INT_VAR), 0); assertEquals(dl.getFloat(FLOAT_VAR), 0f, 0f); dl.set(BOOL_VAR, true); dl.set(INT_VAR, -1); dl.set(FLOAT_VAR, Float.NaN); assertTrue(dl.getBoolean(BOOL_VAR)); assertEquals(dl.getInt(INT_VAR), -1); assertTrue(Float.isNaN(dl.getFloat(FLOAT_VAR))); }
@Test public void testGenerateSource() { DefineList dl = new DefineList(NUM_DEFINES); assertEquals("", generateSource(dl)); dl.set(BOOL_VAR, true); assertEquals("#define BOOL_VAR 1\n", generateSource(dl)); dl.set(INT_VAR, 123); assertEquals("#define BOOL_VAR 1\n" + "#define INT_VAR 123\n", generateSource(dl)); dl.set(BOOL_VAR, false); assertEquals("#define INT_VAR 123\n", generateSource(dl)); dl.set(BOOL_VAR, true); // should have predictable ordering based on defineId assertEquals("#define BOOL_VAR 1\n" + "#define INT_VAR 123\n", generateSource(dl)); dl.unset(BOOL_VAR); assertEquals("#define INT_VAR 123\n", generateSource(dl)); }
@Test public void testDeepClone() { DefineList dl1 = new DefineList(NUM_DEFINES); DefineList dl2 = dl1.deepClone(); assertNotSame(dl1, dl2); assertEquals(dl1, dl2); assertEquals(dl1.hashCode(), dl2.hashCode()); dl1.set(BOOL_VAR, true); dl2 = dl1.deepClone(); assertEquals(dl1, dl2); assertEquals(dl1.hashCode(), dl2.hashCode()); dl1.set(BOOL_VAR, false); dl2 = dl1.deepClone(); assertEquals(dl1, dl2); assertEquals(dl1.hashCode(), dl2.hashCode()); dl1.set(INT_VAR, 123); assertNotEquals(dl1, dl2); assertNotEquals(dl1.hashCode(), dl2.hashCode()); dl2 = dl1.deepClone(); assertEquals(dl1, dl2); assertEquals(dl1.hashCode(), dl2.hashCode()); }
@Test public void testEqualsAndHashCode() { DefineList dl1 = new DefineList(NUM_DEFINES); DefineList dl2 = new DefineList(NUM_DEFINES);
public DefineList deepClone() { return new DefineList(this); }
/** * Create a define list with the size matching the number * of defines on this technique. * * @return a define list with the size matching the number * of defines on this technique. */ public DefineList createDefineList() { return new DefineList(defineNames.size()); }
private static String createShaderPrologue(List<String> presetDefines) { DefineList dl = new DefineList(presetDefines.size()); for (int i = 0; i < presetDefines.size(); i++) { dl.set(i, 1); } StringBuilder sb = new StringBuilder(); dl.generateSource(sb, presetDefines, null); return sb.toString(); }
/** * Adds a preset define. * <p> * Preset defines do not depend upon any parameters to be activated, * they are always passed to the shader as long as this technique is used. * * @param defineName The name of the define parameter, e.g. USE_LIGHTING * @param type The type of the define. See * {@link DefineList#set(java.lang.String, com.jme3.shader.VarType, java.lang.Object) } * to see why it matters. * * @param value The value of the define */ public void addShaderPresetDefine(String defineName, VarType type, Object value){ if (presetDefines == null) presetDefines = new DefineList(); presetDefines.set(defineName, type, value); }
/** * Creates a new technique instance that implements the given * technique definition. * * @param owner The material that will own this technique * @param def The technique definition being implemented. */ public Technique(Material owner, TechniqueDef def) { this.owner = owner; this.def = def; if (def.isUsingShaders()) { this.worldBindUniforms = new ArrayList<Uniform>(); this.defines = new DefineList(); for (MatParam param : owner.getParams()) { String defineName = def.getShaderParamDefine(param.getName()); if (defineName != null) { defines.set(defineName, param.getVarType(), param.getValue()); } } } }
private void loadShader(AssetManager manager) { // recompute define list DefineList allDefines = new DefineList(); allDefines.addFrom(def.getShaderPresetDefines()); allDefines.addFrom(defines); ShaderKey key = new ShaderKey(def.getVertexShaderName(), def.getFragmentShaderName(), allDefines, def.getShaderLanguage()); shader = manager.loadShader(key); if (shader == null) { logger.warning("Failed to reload shader!"); return; } // refresh the uniform links //owner.updateUniformLinks(); // register the world bound uniforms worldBindUniforms.clear(); for (UniformBinding binding : def.getWorldBindings()) { Uniform uniform = shader.getUniform("g_" + binding.name()); uniform.setBinding(binding); if (uniform != null) { worldBindUniforms.add(uniform); } } needReload = false; }