public void set(int id, float val) { set(id, Float.floatToIntBits(val)); }
@Override public Shader makeCurrent(AssetManager assetManager, RenderManager renderManager, EnumSet<Caps> rendererCaps, LightList lights, DefineList defines) { defines.set(nbLightsDefineId, renderManager.getSinglePassLightBatchSize() * 3); defines.set(singlePassLightingDefineId, true); return super.makeCurrent(assetManager, renderManager, rendererCaps, lights, defines); }
/** * Called by the material to tell the technique a parameter was modified. * Specify <code>null</code> for value if the param is to be cleared. */ final void notifyParamChanged(String paramName, VarType type, Object value) { Integer defineId = def.getShaderParamDefineId(paramName); if (defineId == null) { return; } paramDefines.set(defineId, type, value); }
public void set(int id, boolean val) { if (val) { set(id, 1); } else { // Because #ifdef usage is very common in shaders, unset the define // instead of setting it to 0 for booleans. unset(id); } }
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(); }
@Override public Shader makeCurrent(AssetManager assetManager, RenderManager renderManager, EnumSet<Caps> rendererCaps, LightList lights, DefineList defines) { defines.set(nbLightsDefineId, renderManager.getSinglePassLightBatchSize() * 3); defines.set(singlePassLightingDefineId, true); //TODO here we have a problem, this is called once before render, so the define will be set for all passes (in case we have more than NB_LIGHTS lights) //Though the second pass should not render IBL as it is taken care of on first pass like ambient light in phong lighting. //We cannot change the define between passes and the old technique, and for some reason the code fails on mac (renders nothing). if(lights != null) { lightProbes.clear(); extractIndirectLights(lights, false); defines.set(nbProbesDefineId, lightProbes.size()); } return super.makeCurrent(assetManager, renderManager, rendererCaps, lights, defines); }
@Override public Shader makeCurrent(AssetManager assetManager, RenderManager renderManager, EnumSet<Caps> rendererCaps, LightList lights, DefineList defines) { // TODO: if it ever changes that render isn't called // right away with the same geometry after makeCurrent, it would be // a problem. // Do a radix sort. tempDirLights.clear(); tempPointLights.clear(); tempSpotLights.clear(); for (Light light : lights) { switch (light.getType()) { case Directional: tempDirLights.add((DirectionalLight) light); break; case Point: tempPointLights.add((PointLight) light); break; case Spot: tempSpotLights.add((SpotLight) light); break; } } defines.set(numDirLightsDefineId, tempDirLights.size()); defines.set(numPointLightsDefineId, tempPointLights.size()); defines.set(numSpotLightsDefineId, tempSpotLights.size()); return techniqueDef.getShader(assetManager, rendererCaps, defines); }
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); }
public void setAll(DefineList other) { for (int i = 0; i < other.values.length; i++) { if (other.isSet(i)) { set(i, other.getInt(i)); } } }
@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); }
private void applyOverrides(DefineList defineList, SafeArrayList<MatParamOverride> overrides) { for (MatParamOverride override : overrides.getArray()) { if (!override.isEnabled()) { continue; } Integer defineId = def.getShaderParamDefineId(override.name); if (defineId != null) { if (def.getDefineIdType(defineId) == override.type) { defineList.set(defineId, override.type, override.value); } } } }
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); generateSource(dl); assert false;
@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(""); }
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 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()); }