Allright so here is the related code from the PostProcessorAppState:
[java]
filterPostProcessor = new FilterPostProcessor(app.getAssetManager());
app.getViewPort().addProcessor(filterPostProcessor);
AppSettings settings = app.getContext().getSettings();
numSamples = settings.getSamples();
shadowQuality = (int) settings.getOrDefault(SettingsHandler.GFX_SHADOWS, 0);
isSSAO = (Boolean) settings.getOrDefault(SettingsHandler.GFX_SSAO, false);
isShadows = (shadowQuality > 0);
isFog = (Boolean) settings.getOrDefault(SettingsHandler.GFX_FOG, false);
boolean depth = (Boolean) settings.getOrDefault(SettingsHandler.GFX_DEPTH_BLUR, false);
depth = false;
isBloom = (Boolean) settings.getOrDefault(SettingsHandler.GFX_BLOOM, false);
isLightScattering = (Boolean) settings.getOrDefault(SettingsHandler.GFX_LIGHT_SCATTERING, false);
isDOF = (Boolean) settings.getOrDefault(SettingsHandler.GFX_DEPTH_OF_FIELD, false);
isWater = true;
isFXAA = numSamples > 0;
LOGGER.logln(this, Logger.LEVEL_DEBUG, "GFXAppState filters: ssao(" + isSSAO + ") shadow(" + isShadows + ") fog(" + isFog + ") depthblur(" + depth + ") bloom(" + isBloom + ") lightScattering(" + isLightScattering + ") depthOfField(" + isDOF + ") and number of samples: " + numSamples + "(->fxaa(" + isFXAA + "))");
if (numSamples > 0) {
filterPostProcessor.setNumSamples(numSamples);
}
if (isWater) {
waterFilter = new WaterFilter();
if (reflectionScene != null) {
waterFilter.setReflectionScene(reflectionScene);
}
waterFilter.setLightColor(sun.getColor());
waterFilter.setLightDirection(sun.getDirection());
waterFilter.setWaterTransparency(0.1f);
waterFilter.setWaveScale(0.001f);
waterFilter.setWaterColor(new ColorRGBA(0.6f, 0.6f, 1f, 1.0f));
waterFilter.setDeepWaterColor(new ColorRGBA(0.4f, 0.4f, 1.0f, 1.0f));
waterFilter.setWaterHeight(INIT_WATER_HEIGHT);
waterFilter.setCausticsIntensity(0.0f);
waterFilter.setFoamHardness(2.0f);
waterFilter.setUnderWaterFogDistance(8 * PerformanceVariables.get().BLOCK_SIZE);
waterFilter.setFoamIntensity(1.0f);
waterFilter.setReflectionDisplace(50);
waterFilter.setRefractionStrength(0.5f);
waterFilter.setShoreHardness(0.01f);
waterFilter.setSpeed(1.5f);
filterPostProcessor.addFilter(waterFilter);
}
if (isShadows) {
EdgeFilteringMode efm;
float factor = 1;
boolean capShadows = true;
float zExtend = 0.0f, zFade = 0.0f;
efm = EdgeFilteringMode.Nearest;
CompareMode cm = CompareMode.Hardware;
switch (shadowQuality) {
case 1:
efm = EdgeFilteringMode.Nearest;
factor = 1;
zExtend = PerformanceVariables.get().BLOCK_SIZE * 64f;
zFade = PerformanceVariables.get().BLOCK_SIZE * 8f;
break;
case 2:
efm = EdgeFilteringMode.Bilinear;
factor = 1;
zExtend = PerformanceVariables.get().BLOCK_SIZE * 128f;
zFade = PerformanceVariables.get().BLOCK_SIZE * 16f;
break;
case 3:
efm = EdgeFilteringMode.Bilinear;
factor = 2;
capShadows = false;
break;
case 4:
efm = EdgeFilteringMode.PCFPOISSON;
factor = 4;
capShadows = false;
break;
}
int shadowMapSize = (int) (512 * factor * PerformanceVariables.get().BLOCK_SIZE);
boolean isRenderer = false;
if (isRenderer) {
shadowRenderer = new DirectionalLightShadowRenderer(app.getAssetManager(), shadowMapSize, shadowQuality);
shadowRenderer.setLight(sun);
shadowRenderer.setEdgeFilteringMode(efm);
shadowRenderer.setEdgesThickness(2);
shadowRenderer.setEnabledStabilization(true);
shadowRenderer.setShadowCompareMode(cm);
if (capShadows) {
shadowRenderer.setShadowZExtend(zExtend);
shadowRenderer.setShadowZFadeLength(zFade);
}
shadowRenderer.setShadowIntensity(0.5f);
app.getViewPort().addProcessor(shadowRenderer);
} else {
shadowFilter = new DirectionalLightShadowFilter(app.getAssetManager(), shadowMapSize, shadowQuality);
shadowFilter.setLight(sun);
shadowFilter.setEdgeFilteringMode(efm);
shadowFilter.setEdgesThickness(1);
shadowFilter.setEnabledStabilization(true);
shadowFilter.setShadowCompareMode(cm);
if (capShadows) {
shadowFilter.setShadowZExtend(zExtend);
shadowFilter.setShadowZFadeLength(zFade);
}
shadowFilter.setShadowIntensity(0.5f);
filterPostProcessor.addFilter(shadowFilter);
}
}
if (isSSAO) {
//ssaoFilter = new SSAOFilter(7.94f, 5.92f, 0.33f, 0.61f);
ssaoFilter = new SSAOFilter();
filterPostProcessor.addFilter(ssaoFilter);
}
if (isBloom) {
bloomFilter = new BloomFilter();
bloomFilter.setBloomIntensity(1);
bloomFilter.setBlurScale(1.0f);
bloomFilter.setDownSamplingFactor(1.0f);
bloomFilter.setExposureCutOff(0.5f);
bloomFilter.setExposurePower(3.0f);
filterPostProcessor.addFilter(bloomFilter);
}
if (isDOF) {
depthOfFieldFilter = new DepthOfFieldFilter();
depthOfFieldFilter.setFocusDistance(0);
depthOfFieldFilter.setFocusRange(256 * PerformanceVariables.get().BLOCK_SIZE);
depthOfFieldFilter.setBlurScale(1.0f);
filterPostProcessor.addFilter(depthOfFieldFilter);
}
if (isLightScattering) {
lightScatteringFilter = new LightScatteringFilter();
lightScatteringFilter.setBlurStart(0.1f);
lightScatteringFilter.setBlurWidth(0.9f);
lightScatteringFilter.setLightDensity(0.8f);
lightScatteringFilter.setLightPosition(Vector3f.UNIT_X.mult(300));
lightScatteringFilter.setNbSamples(Math.max(20, Math.min(100, 25 * numSamples)));
filterPostProcessor.addFilter(lightScatteringFilter);
}
if (depth) {
depthBlurFilter = new DepthBlurFilter();
depthBlurFilter.setFocusDistance(10 * PerformanceVariables.get().BLOCK_SIZE);
depthBlurFilter.setFocusRange(20 * PerformanceVariables.get().BLOCK_SIZE);
depthBlurFilter.setBlurScale(0.8f);
filterPostProcessor.addFilter(depthBlurFilter);
}
if (numSamples < 1) {
fxaaFilter = new FXAAFilter();
filterPostProcessor.addFilter(fxaaFilter);
}
if (isFog) {
fogFilter = new FogFilter();
fogFilter.setFogDensity(1.0f);
fogFilter.setFogColor(new ColorRGBA(0.45f, 0.45f, 0.45f, 0.4f));
fogFilter.setFogDistance(512 * PerformanceVariables.get().BLOCK_SIZE);
filterPostProcessor.addFilter(fogFilter);
}
[/java]
according to the settings from the screenshot below (settings stuff works, i tested and the booleans related to the filters are set correctly meaning the correct filters are applied) there is WaterFilter, ShadowFilter, SSAOFilter, BloomFilter and FogFilter added in that order now (i moved adding the filterpostprocessor to the viewport to the beginning in the meantime to see if it made a difference but unsurprisingly it didn’t)
this is only for toggling the filters ingame as i mentioned:
[java]
ssaoOn = ssaoFilter != null;
fogOn = fogFilter != null;
bloomOn = bloomFilter != null;
lsOn = lightScatteringFilter != null;
shadowsOn = shadowFilter != null;
waterOn = waterFilter != null;
dofOn = depthOfFieldFilter != null;
app.getInputManager().addMapping("SSAO", new KeyTrigger(KeyInput.KEY_F6));
app.getInputManager().addMapping("FOG", new KeyTrigger(KeyInput.KEY_F7));
app.getInputManager().addMapping("BLOOM", new KeyTrigger(KeyInput.KEY_F8));
app.getInputManager().addMapping("LIGHTSCATTERING", new KeyTrigger(KeyInput.KEY_F9));
app.getInputManager().addMapping("SHADOWS", new KeyTrigger(KeyInput.KEY_F10));
app.getInputManager().addMapping("WATER", new KeyTrigger(KeyInput.KEY_F11));
app.getInputManager().addMapping("DOF", new KeyTrigger(KeyInput.KEY_F12));
app.getInputManager().addListener(new ActionListener() {
@Override
public void onAction(String name, boolean isPressed, float tpf) {
boolean remove = true;
if (isPressed) {
boolean turnedOn = true;
if ("SSAO".equals(name)) {
if (ssaoOn) {
ssaoOn = false;
if (remove) {
filterPostProcessor.removeFilter(ssaoFilter);
} else {
ssaoFilter.setEnabled(false);
}
turnedOn = false;
} else {
if (ssaoFilter != null) {
ssaoOn = true;
if (remove) {
filterPostProcessor.addFilter(ssaoFilter);
} else {
ssaoFilter.setEnabled(true);
}
}
}
}
if ("FOG".equals(name)) {
if (fogOn) {
fogOn = false;
if (remove) {
filterPostProcessor.removeFilter(fogFilter);
} else {
fogFilter.setEnabled(false);
}
turnedOn = false;
} else {
if (fogFilter != null) {
fogOn = true;
if (remove) {
filterPostProcessor.addFilter(fogFilter);
} else {
fogFilter.setEnabled(true);
}
}
}
}
if ("BLOOM".equals(name)) {
if (bloomOn) {
bloomOn = false;
if (remove) {
filterPostProcessor.removeFilter(bloomFilter);
} else {
bloomFilter.setEnabled(false);
}
turnedOn = false;
} else {
if (bloomFilter != null) {
bloomOn = true;
if (remove) {
filterPostProcessor.addFilter(bloomFilter);
} else {
bloomFilter.setEnabled(true);
}
}
}
}
if ("LIGHTSCATTERING".equals(name)) {
if (lsOn) {
lsOn = false;
if (remove) {
filterPostProcessor.removeFilter(lightScatteringFilter);
} else {
lightScatteringFilter.setEnabled(false);
}
turnedOn = false;
} else {
if (lightScatteringFilter != null) {
lsOn = true;
if (remove) {
filterPostProcessor.addFilter(lightScatteringFilter);
} else {
lightScatteringFilter.setEnabled(true);
}
}
}
}
if ("SHADOWS".equals(name)) {
if (shadowsOn) {
shadowsOn = false;
if (remove) {
filterPostProcessor.removeFilter(shadowFilter);
} else {
shadowFilter.setEnabled(false);
}
turnedOn = false;
} else {
if (shadowFilter != null) {
shadowsOn = true;
if (remove) {
filterPostProcessor.addFilter(shadowFilter);
} else {
shadowFilter.setEnabled(true);
}
}
}
}
if ("WATER".equals(name)) {
if (waterOn) {
waterOn = false;
if (remove) {
filterPostProcessor.removeFilter(waterFilter);
} else {
waterFilter.setEnabled(false);
}
turnedOn = false;
} else {
if (waterFilter != null) {
waterOn = true;
if (remove) {
filterPostProcessor.addFilter(waterFilter);
} else {
waterFilter.setEnabled(true);
}
}
}
}
if ("DOF".equals(name)) {
if (dofOn) {
dofOn = false;
if (remove) {
filterPostProcessor.removeFilter(depthOfFieldFilter);
} else {
depthOfFieldFilter.setEnabled(false);
}
turnedOn = false;
} else {
if (depthOfFieldFilter != null) {
dofOn = true;
if (remove) {
filterPostProcessor.addFilter(depthOfFieldFilter);
} else {
depthOfFieldFilter.setEnabled(true);
}
}
}
}
NotifierAppState nas = app.getStateManager().getState(NotifierAppState.class);
if (nas != null) {
nas.addNotification(new Notification("changed: " + name + ": " + turnedOn));
}
}
}
}, "SSAO", "FOG", "BLOOM", "LIGHTSCATTERING", "SHADOWS", "WATER", "DOF");
[/java]
Thats the settings (for simplicity only shadows ssao bloom and fog as in the original example):

Thats what it looks like right after i start the actual game
(Remember Filter order was WaterFilter, ShadowFilter, SSAOFilter, BloomFilter, FogFilter)

then i REMOVE (not setEnabled(false)) the FogFilter from the PostProcessor ingame
→ order is now WaterFilter, ShadowFilter, SSAOFilter, BloomFilter

When i add the FogFilter again it looks as i would expect:
→ order is exactly same as initially, with WaterFilter, ShadowFilter, SSAOFilter, BloomFilter, FogFilter, still it gives different result

and for randomness here is 2 more steps, basically confirming the problem is the order of the filters
Now thats 2 steps in one, i removed and added again the shadowFilter (gives wrong shadows again ofc, because order is now WaterFilter, SSAOFilter, BloomFilter, FogFilter, ShadowFilter)

Another two steps, removed and aggain again the fogFilter
(gives correct result (or probably differs slightly from the 3rd image since the shadow is drawn after the SSAO and BloomFilter), with this order: WaterFilter, SSAOFilter, BloomFilter, FogFilter, ShadowFilter)

and have a look at that awesome pumpgun in the quickbar and the right hand (yes, its supposed to be a pumpgun, don’t bother me)
[edit] i wish i could make them all the same view direction but it kept jumping around when unfocussing for screenshots but if you compare the 2nd image to the 4th you can see the difference of the shadow [/edit]
[edit2] i noticed that the IsoSurfaceDemo does not make use of the FogFilter, while using i guess all the other filters and since my problem might be FogFilter related too instead of only filter-order related, is the FogFilter maybe bugged?[/edit2]