@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(""); }
public Shader getShader(AssetManager assetManager, EnumSet<Caps> rendererCaps, DefineList defines) { Shader shader = definesToShaderMap.get(defines); if (shader == null) { shader = loadShader(assetManager, rendererCaps, defines); definesToShaderMap.put(defines.deepClone(), shader); } return shader; }
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(); }
@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 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 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))); }
public void set(int id, float val) { set(id, Float.floatToIntBits(val)); }
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); }
DefineList lookup = new DefineList(NUM_DEFINES); map.put(lookup.deepClone(), STR_EMPTY); lookup.set(BOOL_VAR, true); map.put(lookup.deepClone(), STR_BOOL); lookup.set(BOOL_VAR, false); lookup.set(INT_VAR, 123); map.put(lookup.deepClone(), STR_INT); lookup.set(BOOL_VAR, true); map.put(lookup.deepClone(), STR_BOOL_INT); lookup.set(FLOAT_VAR, FastMath.PI); map.put(lookup.deepClone(), STR_BOOL_INT_FLOAT);
@Test public void testSourceFloatDefine() { DefineList dl = new DefineList(NUM_DEFINES); dl.set(FLOAT_VAR, 1f); assert dl.hashCode() == (1 << FLOAT_VAR); assert generateSource(dl).equals("#define FLOAT_VAR 1.0\n"); dl.set(FLOAT_VAR, 0f); assert dl.hashCode() == (1 << FLOAT_VAR); assert generateSource(dl).equals("#define FLOAT_VAR 0.0\n"); dl.set(FLOAT_VAR, -1f); assert generateSource(dl).equals("#define FLOAT_VAR -1.0\n"); dl.set(FLOAT_VAR, FastMath.FLT_EPSILON); assert generateSource(dl).equals("#define FLOAT_VAR 1.1920929E-7\n"); dl.set(FLOAT_VAR, FastMath.PI); assert generateSource(dl).equals("#define FLOAT_VAR 3.1415927\n"); dl.set(FLOAT_VAR, Float.NaN); generateSource(dl); assert false; dl.set(FLOAT_VAR, Float.POSITIVE_INFINITY); generateSource(dl); assert false; dl.set(FLOAT_VAR, Float.NEGATIVE_INFINITY);
@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 testSourceInitial() { DefineList dl = new DefineList(NUM_DEFINES); assert dl.hashCode() == 0; assert generateSource(dl).equals(""); }
public DefineList deepClone() { return new DefineList(this); }
public String generateSource(List<String> defineNames, List<VarType> defineTypes) { StringBuilder sb = new StringBuilder(); generateSource(sb, defineNames, defineTypes); return sb.toString(); } }
/** * Called by the material to determine which shader to use for rendering. * * The {@link TechniqueDefLogic} is used to determine the shader to use * based on the {@link LightMode}. * * @param renderManager The render manager for which the shader is to be selected. * @param rendererCaps The renderer capabilities which the shader should support. * @return A compatible shader. */ Shader makeCurrent(RenderManager renderManager, SafeArrayList<MatParamOverride> worldOverrides, SafeArrayList<MatParamOverride> forcedOverrides, LightList lights, EnumSet<Caps> rendererCaps) { TechniqueDefLogic logic = def.getLogic(); AssetManager assetManager = owner.getMaterialDef().getAssetManager(); dynamicDefines.clear(); dynamicDefines.setAll(paramDefines); if (worldOverrides != null) { applyOverrides(dynamicDefines, worldOverrides); } if (forcedOverrides != null) { applyOverrides(dynamicDefines, forcedOverrides); } return logic.makeCurrent(assetManager, renderManager, rendererCaps, lights, dynamicDefines); }
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; }
public void set(int id, int val) { rangeCheck(id); isSet |= (1L << id); values[id] = val; }
/** * Compute the sort ID. Similar to {@link Object#hashCode()} but used * for sorting geometries for rendering. * * @return the sort ID for this technique instance. */ public int getSortId() { int hash = 17; hash = hash * 23 + def.getSortId(); hash = hash * 23 + paramDefines.hashCode(); return hash; } }