Files
filament/libs/viewer/tests/test_settings.cpp
Mathias Agopian 9474798c75 remove anamorphic bloom feature
This features didn't work well, had a lot of artifacts and generally
wasn't very useful. This kind of effect should be accomplished
differently.

This is an API break because BloomOptions::anamorphism has been removed.
2023-09-18 16:09:21 -07:00

224 lines
6.8 KiB
C++

/*
* Copyright 2020 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <viewer/AutomationSpec.h>
#include <viewer/Settings.h>
#include <gtest/gtest.h>
using namespace filament::viewer;
class ViewSettingsTest : public testing::Test {};
static const char* JSON_TEST_DEFAULTS = R"TXT(
{
"view": {
"antiAliasing": "FXAA",
"taa": {
"enabled": false,
"filterWidth": 1.0,
"feedback": 0.04
},
"msaa": {
"enabled": false,
"sampleCount": 4,
"customResolve": false
},
"dsr": {
"enabled": false,
"minScale": [0.25, 0.25],
"maxScale": [1.0, 1.0],
"sharpness": 0.9,
"enabled": false,
"homogeneousScaling": false,
"quality": "MEDIUM"
},
"colorGrading": {
"enabled": true,
"quality": "MEDIUM",
"toneMapping": "ACES_LEGACY",
"genericToneMapper": {
"contrast": 1.0,
"midGrayIn": 1.0,
"midGrayOut": 1.0,
"hdrMax": 16.0
},
"luminanceScaling": false,
"gamutMapping": false,
"exposure": 0,
"nightAdaptation": 0,
"temperature": 0,
"tint": 0,
"outRed": [1.0, 0.0, 0.0],
"outGreen": [0.0, 1.0, 0.0],
"outBlue": [0.0, 0.0, 1.0],
"shadows": [1.0, 1.0, 1.0, 0.0],
"midtones": [1.0, 1.0, 1.0, 0.0],
"highlights": [1.0, 1.0, 1.0, 0.0],
"ranges": [0.0, 0.333, 0.550, 1.0],
"contrast": 1.0,
"vibrance": 1.0,
"saturation": 1.0,
"slope": [1.0, 1.0, 1.0],
"offset": [0.0, 0.0, 0.0],
"power": [1.0, 1.0, 1.0],
"gamma": [1.0, 1.0, 1.0],
"midPoint": [1.0, 1.0, 1.0],
"scale": [1.0, 1.0, 1.0],
"linkedCurves": false
},
"ssao": {
"enabled": false,
"radius": 0.3,
"power": 1.0,
"bias": 0.0005,
"resolution": 0.5,
"intensity": 1.0,
"quality": "LOW",
"upsampling": "LOW",
"minHorizonAngleRad": 0.0,
"ssct": {
"enabled": false,
"lightConeRad": 1.0,
"shadowDistance": 0.3,
"contactDistanceMax": 1.0,
"intensity": 0.8,
"lightDirection": [0, -1, 0],
"depthBias": 0.01,
"depthSlopeBias": 0.01,
"sampleCount": 4
}
},
"bloom": {
"enabled": false,
"strength": 0.10,
"resolution": 360,
"levels": 6,
"blendMode": "ADD",
"threshold": true,
"highlight": 1000.0
},
"fog": {
"enabled": false,
"distance": 0.0,
"maximumOpacity": 1.0,
"height": 0.0,
"heightFalloff": 1.0,
"color": [0.5, 0.5, 0.5],
"density": 0.1,
"inScatteringStart": 0.0,
"inScatteringSize": -1.0,
"fogColorFromIbl": false
},
"dof": {
"enabled": false,
"cocScale": 1.0,
"maxApertureDiameter": 0.01
},
"vignette": {
"enabled": false,
"midPoint": 0.5,
"roundness": 0.5,
"feather": 0.5,
"color": [0, 0, 0, 1]
},
"dithering": "TEMPORAL",
"renderQuality": {
"hdrColorBuffer": "HIGH"
},
"dynamicLighting": {
"zLightNear": 5,
"zLightFar": 100,
},
"shadowType": "PCF",
"vsmShadowOptions": {
"anisotropy": 1
},
"postProcessingEnabled": true
}
}
)TXT";
static const char* JSON_TEST_MATERIAL = R"TXT(
"material": {
"scalar": { "foo": 5.0, "bar": 2.0 },
"float3": { "baz": [1, 2, 3] }
})TXT";
static const char* JSON_TEST_AUTOMATION = R"TXT([{
"name": "test_72_cases",
"base": { "view.bloom.strength": 0.5 },
"permute": {
"view.bloom.enabled": [false, true],
"material.scalar.metallicFactor": [0.0, 0.2, 0.4, 0.6, 0.8, 1.0],
"material.scalar.roughnessFactor": [0.0, 0.2, 0.4, 0.6, 0.8, 1.0]
}
}])TXT";
TEST_F(ViewSettingsTest, JsonTestDefaults) {
JsonSerializer serializer;
Settings settings1;
ASSERT_TRUE(serializer.readJson(JSON_TEST_DEFAULTS, strlen(JSON_TEST_DEFAULTS), &settings1));
ASSERT_TRUE(settings1.view.bloom.threshold);
Settings settings2;
ASSERT_TRUE(serializer.readJson("{}", strlen("{}"), &settings2));
ASSERT_FALSE(serializer.readJson("{ badly_formed }", strlen("{ badly_formed }"), &settings2));
Settings settings3;
ASSERT_EQ(serializer.writeJson(settings2), serializer.writeJson(settings3));
}
TEST_F(ViewSettingsTest, JsonTestSerialization) {
auto canParse = [](bool parseResult, std::string json) {
if (parseResult) {
return testing::AssertionSuccess() << "Settings can be serialized.";
} else {
return testing::AssertionFailure() << "JSON has errors:\n" << json.c_str() << std::endl;
}
};
JsonSerializer serializer;
Settings outSettings = {};
std::string jsonstr = serializer.writeJson(outSettings);
Settings inSettings = {};
bool result = serializer.readJson(jsonstr.c_str(), jsonstr.size(), &inSettings);
ASSERT_TRUE(canParse(result, jsonstr));
}
TEST_F(ViewSettingsTest, JsonTestMaterial) {
JsonSerializer serializer;
Settings settings;
std::string js = "{" + std::string(JSON_TEST_MATERIAL) + "}";
ASSERT_TRUE(serializer.readJson(js.c_str(), js.size(), &settings));
std::string serialized = serializer.writeJson(settings);
ASSERT_PRED_FORMAT2(testing::IsSubstring, "\"baz\": [1, 2, 3]", serialized);
}
TEST_F(ViewSettingsTest, CustomAutomationSpec) {
AutomationSpec* spec = AutomationSpec::generate(JSON_TEST_AUTOMATION,
strlen(JSON_TEST_AUTOMATION));
ASSERT_TRUE(spec);
ASSERT_EQ(spec->size(), 72);
delete spec;
}
int main(int argc, char** argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}