Merge pull request #1989 from aws-lumberyard-dev/cgalvan/gitflow_210708

Merged stabilization/2106 to development
monroegm-disable-blank-issue-2
Terry Michaels 5 years ago committed by GitHub
commit 9ea9cbf589
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -103,6 +103,19 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS)
AZ::AssetBundlerBatch AZ::AssetBundlerBatch
) )
ly_add_pytest(
NAME AssetPipelineTests.AssetBundler_SandBox
TEST_SUITE sandbox
PATH ${CMAKE_CURRENT_LIST_DIR}/asset_bundler_batch_tests.py
PYTEST_MARKS "SUITE_sandbox" # run only sandbox tests in this file
EXCLUDE_TEST_RUN_TARGET_FROM_IDE
TEST_SERIAL
TIMEOUT 1500
RUNTIME_DEPENDENCIES
AZ::AssetProcessor
AZ::AssetBundlerBatch
)
ly_add_pytest( ly_add_pytest(
NAME AssetPipelineTests.AssetBuilder NAME AssetPipelineTests.AssetBuilder
PATH ${CMAKE_CURRENT_LIST_DIR}/asset_builder_tests.py PATH ${CMAKE_CURRENT_LIST_DIR}/asset_builder_tests.py

@ -730,6 +730,7 @@ class TestsAssetBundlerBatch_WindowsAndMac(object):
@pytest.mark.BAT @pytest.mark.BAT
@pytest.mark.assetpipeline @pytest.mark.assetpipeline
@pytest.mark.SUITE_sandbox
@pytest.mark.test_case_id("C16877174") @pytest.mark.test_case_id("C16877174")
@pytest.mark.test_case_id("C16877175") @pytest.mark.test_case_id("C16877175")
@pytest.mark.test_case_id("C16877178") @pytest.mark.test_case_id("C16877178")

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:cf6d56fe4c367d39bd78500dd34332fcad57ad41241768b52781dbdb60ddd972
size 347568

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:61efd8df621780af995fc1250918df5e00364ff00f849bef67702cd4b0a152e1 oid sha256:41239f8345fa91fe546442208461ad3cd17c7a7a7047af45018b97363bfea204
size 65537 size 109783

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:e4901093fa6190bf37291b0fb6de23fba1be8ebbd742775a8565a4106722fbb6 oid sha256:ebfc95bd4c0cbcc53d0ef9d314d26e09a347a22dabbf210597f405d9ed8646bf
size 31942 size 7729

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:e4ae97c4f44910121a61686862c8342ce598db4cdf9d46b29e96d3cb9e43bd06 oid sha256:99cb7da9282cfcfa64598455827f27ca6791d45ca0d2c3c2dc090d82468dac03
size 22158 size 4447

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:061e2d0ce8dc852dd298c80f2aed5fee8ea4b87511c00662aa2d00922c0ba3c2 oid sha256:101568e946f1d4cea86d666187bbf71116bbf62e6eaf6d80bc3c5e2e184bdb15
size 30162 size 7938

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:0fb4b4b77620d99dae7473b7bd8affe14630419835bd5719167ed200e657fa4f oid sha256:cf930ffd4efb0b7b627e05aac6e0f56252ea206623e8b5d097d803aa315cdfb8
size 17504 size 1812

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:8aa9b1194f3244025578225a6a87cbc2dd12c70955ff615c8af640ea7f1334f1 oid sha256:ba5fea53b349e254b4625035a308d5731cb06f6d0adc278874d14db2627962cb
size 19619 size 3424

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:0c25ffb1af8160b3202977de8c32aaa235e22c643ffd8004e4546c96868ef3b9 oid sha256:cf087f357cd439d14651073ac079542c60f0648a30dced2a8d19912124b3f8b6
size 18317 size 2310

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:2db961b8f922a552d8ad374fdb56029efd4049a6cde10399b3d961242c82ce53 oid sha256:421ad4db14c28ed18666158f9ec30747c5b8c757405c1efb32442978911b0c06
size 22571 size 4437

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:f39d897a57d4da0a70ede7c91339660b28e9d8c57b3e7d749807b13baa4b85f3 oid sha256:0d0044ebf7e0a5dd23ed64a1289c705d8f6c3c41a62d65e5a1371058855b8cec
size 28559 size 6546

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:263b75d58328499eef1f8fa2e64c30706f546badcc0c4464a043b231da93cd0d oid sha256:3b8717c5f2109dfce1bf7b017278059d4915b524a6eb7e83cfb1926e54ed6869
size 34969 size 7383

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:33522ad8a8e826b22dd9ad214f56e63e24bf55c00bd8c845925d848b855dfb48 oid sha256:ba5fea53b349e254b4625035a308d5731cb06f6d0adc278874d14db2627962cb
size 19619 size 3424

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:f405c9f3d908d038aea26049e533b0d10955adfac370c7b3b80209997ea706d0 oid sha256:a32908a839a6cb0ca2a76d6aa60376ba8a14b4428f06c13149ec277514eb5676
size 24407 size 4533

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:d110f6e151799a2327bcdf5ef94d6fc82b114783a8cc973a8915896679ba4a80 oid sha256:0d0044ebf7e0a5dd23ed64a1289c705d8f6c3c41a62d65e5a1371058855b8cec
size 28559 size 6546

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:db8f00568fad4e49b05249aaa7a48c9fbf85c8b7a78489c83dc9b8161778bcef oid sha256:421ad4db14c28ed18666158f9ec30747c5b8c757405c1efb32442978911b0c06
size 22571 size 4437

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:e4901093fa6190bf37291b0fb6de23fba1be8ebbd742775a8565a4106722fbb6 oid sha256:ebfc95bd4c0cbcc53d0ef9d314d26e09a347a22dabbf210597f405d9ed8646bf
size 31942 size 7729

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:e4ae97c4f44910121a61686862c8342ce598db4cdf9d46b29e96d3cb9e43bd06 oid sha256:99cb7da9282cfcfa64598455827f27ca6791d45ca0d2c3c2dc090d82468dac03
size 22158 size 4447

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:061e2d0ce8dc852dd298c80f2aed5fee8ea4b87511c00662aa2d00922c0ba3c2 oid sha256:101568e946f1d4cea86d666187bbf71116bbf62e6eaf6d80bc3c5e2e184bdb15
size 30162 size 7938

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:0fb4b4b77620d99dae7473b7bd8affe14630419835bd5719167ed200e657fa4f oid sha256:cf930ffd4efb0b7b627e05aac6e0f56252ea206623e8b5d097d803aa315cdfb8
size 17504 size 1812

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:8aa9b1194f3244025578225a6a87cbc2dd12c70955ff615c8af640ea7f1334f1 oid sha256:ba5fea53b349e254b4625035a308d5731cb06f6d0adc278874d14db2627962cb
size 19619 size 3424

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:0c25ffb1af8160b3202977de8c32aaa235e22c643ffd8004e4546c96868ef3b9 oid sha256:cf087f357cd439d14651073ac079542c60f0648a30dced2a8d19912124b3f8b6
size 18317 size 2310

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:2db961b8f922a552d8ad374fdb56029efd4049a6cde10399b3d961242c82ce53 oid sha256:421ad4db14c28ed18666158f9ec30747c5b8c757405c1efb32442978911b0c06
size 22571 size 4437

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:f39d897a57d4da0a70ede7c91339660b28e9d8c57b3e7d749807b13baa4b85f3 oid sha256:0d0044ebf7e0a5dd23ed64a1289c705d8f6c3c41a62d65e5a1371058855b8cec
size 28559 size 6546

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:263b75d58328499eef1f8fa2e64c30706f546badcc0c4464a043b231da93cd0d oid sha256:3b8717c5f2109dfce1bf7b017278059d4915b524a6eb7e83cfb1926e54ed6869
size 34969 size 7383

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:33522ad8a8e826b22dd9ad214f56e63e24bf55c00bd8c845925d848b855dfb48 oid sha256:ba5fea53b349e254b4625035a308d5731cb06f6d0adc278874d14db2627962cb
size 19619 size 3424

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:f405c9f3d908d038aea26049e533b0d10955adfac370c7b3b80209997ea706d0 oid sha256:a32908a839a6cb0ca2a76d6aa60376ba8a14b4428f06c13149ec277514eb5676
size 24407 size 4533

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:d110f6e151799a2327bcdf5ef94d6fc82b114783a8cc973a8915896679ba4a80 oid sha256:0d0044ebf7e0a5dd23ed64a1289c705d8f6c3c41a62d65e5a1371058855b8cec
size 28559 size 6546

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:db8f00568fad4e49b05249aaa7a48c9fbf85c8b7a78489c83dc9b8161778bcef oid sha256:421ad4db14c28ed18666158f9ec30747c5b8c757405c1efb32442978911b0c06
size 22571 size 4437

@ -1,41 +1,5 @@
{ {
"images" : [ "images" : [
{
"extent" : "full-screen",
"filename" : "iPhoneLaunchImage1242x2688.png",
"idiom" : "iphone",
"minimum-system-version" : "12.0",
"orientation" : "portrait",
"scale" : "3x",
"subtype" : "2688h"
},
{
"extent" : "full-screen",
"filename" : "iPhoneLaunchImage2688x1242.png",
"idiom" : "iphone",
"minimum-system-version" : "12.0",
"orientation" : "landscape",
"scale" : "3x",
"subtype" : "2688h"
},
{
"extent" : "full-screen",
"filename" : "iPhoneLaunchImage828x1792.png",
"idiom" : "iphone",
"minimum-system-version" : "12.0",
"orientation" : "portrait",
"scale" : "2x",
"subtype" : "1792h"
},
{
"extent" : "full-screen",
"filename" : "iPhoneLaunchImage1792x828.png",
"idiom" : "iphone",
"minimum-system-version" : "12.0",
"orientation" : "landscape",
"scale" : "2x",
"subtype" : "1792h"
},
{ {
"extent" : "full-screen", "extent" : "full-screen",
"idiom" : "iphone", "idiom" : "iphone",
@ -202,4 +166,4 @@
"version" : 1, "version" : 1,
"author" : "xcode" "author" : "xcode"
} }
} }

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:31afa7ed44c5d9844c8d6ce08beccac482c3f43590869a3d190d06e2df377ccc oid sha256:a4018d9df45b4a04d4cf24a40fe01aa7e30e44a9fdd8ad9a41b0d87791786c12
size 137472 size 30442

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:0aac8ef9899442820bec0df8bf6434a46cc787d57c5d6d38a04727b8dc310048 oid sha256:2eea06cb8ad05acefe9664551af5645d52d9763b82473b1fd4a2b2b6f62e96d3
size 338281 size 53550

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:c07495891f15b138ba09f142777b0f43217bf8be05cbb74ba938319f3425980c oid sha256:90991aca91ab7222fdb85c03947cff38f549a6492551e7447e0c8f55022aae48
size 321125 size 52467

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:d6bf6acb92421a453a36fc143ab6cefda14d631ea5e6dbf95c6e252a445fcbac oid sha256:6c8439a64d18dbff17dd67f6405bf49f99695e9b22fc2cc541dc72c6e3167307
size 144797 size 30564

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:fc79117e25cc7533ccf6724453e3f44a01b4eaaecded6fa826abe897456f36ee
size 405896

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:6c7191be3bdae09dc621012a26b0c1b9c15de1d567cf65ff1079e00f8636a32a
size 220720

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:dfbd362f9cb5f285c23807a032af98150cf5409c514445122683736a3c65008c
size 364976

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:e9ad650fda925b1c076a67d1ef70315fe4f14db888c9fd36ee4eba1d18c1e7d1 oid sha256:f752615184160d7a78f28d9eef354c86e544f11eb1dde9f651d7acd315b3f2e6
size 166749 size 35934

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:16f6e9d7bd15fc528d934c252213de8792812e708b1810191c5f1767f7165852 oid sha256:1a43f1d893e85aa99d335a657ec0f6c13a741db976c033451ab9a2328b8a5970
size 142331 size 35559

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:b0252b068b232f521ac6eca4a708fad6eaf257d0a66aa03f4f865f6a0b219cfc
size 236433

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:7c8433178baebafe984ca23d9325d3c71b5a177fc3b3b869afbb01a583542fbe
size 462842

@ -33,7 +33,7 @@
{ {
"size" : "128x128", "size" : "128x128",
"idiom" : "mac", "idiom" : "mac",
"filename" : "icon_128 _2x.png", "filename" : "icon_128_2x.png",
"scale" : "2x" "scale" : "2x"
}, },
{ {
@ -45,7 +45,7 @@
{ {
"size" : "256x256", "size" : "256x256",
"idiom" : "mac", "idiom" : "mac",
"filename" : "icon_256 _2x.png", "filename" : "icon_256_2x.png",
"scale" : "2x" "scale" : "2x"
}, },
{ {

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:e38257b6917cdf5d73e90e6009f10c8736d62b20c4e785085305075c7e6320e2
size 32037

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:9f41a37d2347a617e93bd97adaf6d4c161c471ca3ef7e04b98c65ddda52396dc oid sha256:f3c651ca45a83d0f68bdaa466826a29b2ca6f674e225d90e68b7dbadc2ba582d
size 27833 size 6620

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:b07984494059bf827bc485cbea06d12e0283811face1a18799495f9ba7ae8af1 oid sha256:f7d5b15add5104d91a03df7d86898f4bc415d095d11c23555b24440497371948
size 20779 size 1061

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:e645142d284de40aafb7a4a858f3df92b6a5ba9b03fa5f1a2d3cb25211597926 oid sha256:148fdae6493d7b7e1bb6cc6aae1861e0469838f54dcb3c15cc157a548c707fec
size 21857 size 1910

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:07631f41b8dea80713d2463f81a713a9a93798975b6fb50afbeeb13d26c57fa2
size 48899

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:e38257b6917cdf5d73e90e6009f10c8736d62b20c4e785085305075c7e6320e2 oid sha256:094620c172320b062f9a1f8cc758ef4bbee11bc0a6049f46ad6b42f9bf613c92
size 32037 size 9679

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:e645142d284de40aafb7a4a858f3df92b6a5ba9b03fa5f1a2d3cb25211597926 oid sha256:148fdae6493d7b7e1bb6cc6aae1861e0469838f54dcb3c15cc157a548c707fec
size 21857 size 1910

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:ad83faf98b49f4e37112baedeae726f4f8d71bcdd1961d9cdad31f043f8ca666 oid sha256:749bcd29d73e5ef2d1ef8b2d878626d0bca09c6b0d5f1c9dc6cefe7b9082c8cc
size 24003 size 3758

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:68529a6c11d5ffa7ecd9d5bbb11ceea28e6852bd45946b525af09602c9a1e1bf oid sha256:934502e242ff7a2e34e21eed1424b5e0953e701761d158520b3297944132328e
size 48899 size 18716

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:8a70003840b418848b2ce6c18ed7cbbfcd6fcf76598a6601dca8b98d9b6c1a2f oid sha256:5719043940db268dccd2e20bd9d6aa13131890d43edf002a173714ae33890422
size 114706 size 29510

@ -1,6 +0,0 @@
; EditorCommon.def : Declares the module parameters for the DLL.
LIBRARY
EXPORTS
; Explicit exports can go here

@ -1,10 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemDefinitionGroup>
<QtMOC>
<OutputFileName>%(RootDir)%(Directory)%(FileName).moc</OutputFileName>
<CommandLineTemplate>$(QTDIR)\bin\moc.exe [AllOptions] [Inputs]</CommandLineTemplate>
<ExecutionDescription>Moc'ing %(Filename)%(Extension)...</ExecutionDescription>
</QtMOC>
</ItemDefinitionGroup>
</Project>

@ -1,46 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<PropertyPageSchema
Include="$(MSBuildThisFileDirectory)$(MSBuildThisFileName).xml" />
<AvailableItemName Include="QtMOC">
<Targets>_QtMOC</Targets>
</AvailableItemName>
</ItemGroup>
<UsingTask
TaskName="QtMOC"
TaskFactory="XamlTaskFactory"
AssemblyName="Microsoft.Build.Tasks.v4.0">
<Task>$(MSBuildThisFileDirectory)$(MSBuildThisFileName).xml</Task>
</UsingTask>
<Target
Name="_QtMOC"
BeforeTargets="ClCompile"
AfterTargets="CustomBuild"
Condition="'@(QtMOC)' != ''"
Outputs="%(QtMOC.OutputFileName)"
Inputs="%(QtMOC.Identity);$(MSBuildProjectFile)"
DependsOnTargets="_SelectedFiles">
<ItemGroup Condition="'@(SelectedFiles)' != ''">
<QtMOC Remove="@(QtMOC)" Condition="'%(Identity)' != '@(SelectedFiles)'" />
</ItemGroup>
<ItemGroup>
<QtMOC_tlog Include="%(QtMOC.OutputFileName)" Condition="'%(QtMOC.OutputFileName)' != '' and '%(QtMOC.ExcludedFromBuild)' != 'true'">
<Source>@(QtMOC, '|')</Source>
</QtMOC_tlog>
</ItemGroup>
<Message
Importance="High"
Text="%(QtMOC.ExecutionDescription)" />
<WriteLinesToFile
Condition="'@(QtMOC_tlog)' != '' and '%(QtMOC_tlog.ExcludedFromBuild)' != 'true'"
File="$(IntDir)$(ProjectName).moc.1.tlog"
Lines="^%(QtMOC_tlog.Source);@(QtMOC_tlog-&gt;'%(Fullpath)')"/>
<QtMOC
Condition="'@(QtMOC)' != '' and '%(QtMOC.ExcludedFromBuild)' != 'true'"
CommandLineTemplate="%(QtMOC.CommandLineTemplate)"
OutputFileName="%(QtMOC.OutputFileName)"
AdditionalOptions="%(QtMOC.AdditionalOptions)"
Inputs="%(QtMOC.Fullpath)" />
</Target>
</Project>

@ -1,74 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<ProjectSchemaDefinitions xmlns="http://schemas.microsoft.com/build/2009/properties" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:sys="clr-namespace:System;assembly=mscorlib">
<Rule
Name="QtMOC"
PageTemplate="tool"
DisplayName="Qt MOC"
Order="200">
<Rule.DataSource>
<DataSource
Persistence="ProjectFile"
ItemType="QtMOC" />
</Rule.DataSource>
<Rule.Categories>
<Category
Name="General">
<Category.DisplayName>
<sys:String>General</sys:String>
</Category.DisplayName>
</Category>
<Category
Name="Command Line"
Subtype="CommandLine">
<Category.DisplayName>
<sys:String>Command Line</sys:String>
</Category.DisplayName>
</Category>
</Rule.Categories>
<StringProperty
Name="OutputFileName"
Category="General"
DisplayName="Output File Name"
Description="Specifies the name of the output file."
Switch="-o&quot;[value]&quot;"/>
<StringProperty
Name="Inputs"
Category="Command Line"
IsRequired="true">
<StringProperty.DataSource>
<DataSource
Persistence="ProjectFile"
ItemType="QtMOC"
SourceType="Item" />
</StringProperty.DataSource>
</StringProperty>
<StringProperty
Name="CommandLineTemplate"
DisplayName="Command Line"
Visible="False"
IncludeInCommandLine="False" />
<StringProperty
Name="ExecutionDescription"
DisplayName="Execution Description"
IncludeInCommandLine="False"
Visible="False" />
<StringProperty
Subtype="AdditionalOptions"
Name="AdditionalOptions"
Category="Command Line">
<StringProperty.DisplayName>
<sys:String>Additional Options</sys:String>
</StringProperty.DisplayName>
<StringProperty.Description>
<sys:String>Additional Options</sys:String>
</StringProperty.Description>
</StringProperty>
</Rule>
<ItemType
Name="QtMOC"
DisplayName="Qt MOC" />
<ContentType
Name="QtMOC"
DisplayName="Qt MOC"
ItemType="QtMOC" />
</ProjectSchemaDefinitions>

@ -1,10 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemDefinitionGroup>
<QtRCC>
<OutputFileName>%(RootDir)%(Directory)rcc_%(FileName).h</OutputFileName>
<CommandLineTemplate>$(QTDIR)\bin\rcc.exe [AllOptions] [Inputs]</CommandLineTemplate>
<ExecutionDescription>Rcc'ing %(Filename)%(Extension)...</ExecutionDescription>
</QtRCC>
</ItemDefinitionGroup>
</Project>

@ -1,46 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<PropertyPageSchema
Include="$(MSBuildThisFileDirectory)$(MSBuildThisFileName).xml" />
<AvailableItemName Include="QtRCC">
<Targets>_QtRCC</Targets>
</AvailableItemName>
</ItemGroup>
<UsingTask
TaskName="QtRCC"
TaskFactory="XamlTaskFactory"
AssemblyName="Microsoft.Build.Tasks.v4.0">
<Task>$(MSBuildThisFileDirectory)$(MSBuildThisFileName).xml</Task>
</UsingTask>
<Target
Name="_QtRCC"
BeforeTargets="ClCompile"
AfterTargets="CustomBuild"
Condition="'@(QtRCC)' != ''"
Outputs="%(QtRCC.OutputFileName)"
Inputs="%(QtRCC.Identity);$(MSBuildProjectFile)"
DependsOnTargets="_SelectedFiles">
<ItemGroup Condition="'@(SelectedFiles)' != ''">
<QtRCC Remove="@(QtRCC)" Condition="'%(Identity)' != '@(SelectedFiles)'" />
</ItemGroup>
<ItemGroup>
<QtRCC_tlog Include="%(QtRCC.OutputFileName)" Condition="'%(QtRCC.OutputFileName)' != '' and '%(QtRCC.ExcludedFromBuild)' != 'true'">
<Source>@(QtRCC, '|')</Source>
</QtRCC_tlog>
</ItemGroup>
<Message
Importance="High"
Text="%(QtRCC.ExecutionDescription)" />
<WriteLinesToFile
Condition="'@(QtRCC_tlog)' != '' and '%(QtRCC_tlog.ExcludedFromBuild)' != 'true'"
File="$(IntDir)$(ProjectName).rcc.1.tlog"
Lines="^%(QtRCC_tlog.Source);@(QtRCC_tlog-&gt;'%(Fullpath)')"/>
<QtRCC
Condition="'@(QtRCC)' != '' and '%(QtRCC.ExcludedFromBuild)' != 'true'"
CommandLineTemplate="%(QtRCC.CommandLineTemplate)"
OutputFileName="%(QtRCC.OutputFileName)"
AdditionalOptions="%(QtRCC.AdditionalOptions)"
Inputs="%(QtRCC.Fullpath)" />
</Target>
</Project>

@ -1,74 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<ProjectSchemaDefinitions xmlns="http://schemas.microsoft.com/build/2009/properties" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:sys="clr-namespace:System;assembly=mscorlib">
<Rule
Name="QtRCC"
PageTemplate="tool"
DisplayName="Qt RCC"
Order="200">
<Rule.DataSource>
<DataSource
Persistence="ProjectFile"
ItemType="QtRCC" />
</Rule.DataSource>
<Rule.Categories>
<Category
Name="General">
<Category.DisplayName>
<sys:String>General</sys:String>
</Category.DisplayName>
</Category>
<Category
Name="Command Line"
Subtype="CommandLine">
<Category.DisplayName>
<sys:String>Command Line</sys:String>
</Category.DisplayName>
</Category>
</Rule.Categories>
<StringProperty
Name="OutputFileName"
Category="General"
DisplayName="Output File Name"
Description="Specifies the name of the output file."
Switch="-o &quot;[value]&quot;"/>
<StringProperty
Name="Inputs"
Category="Command Line"
IsRequired="true">
<StringProperty.DataSource>
<DataSource
Persistence="ProjectFile"
ItemType="QtRCC"
SourceType="Item" />
</StringProperty.DataSource>
</StringProperty>
<StringProperty
Name="CommandLineTemplate"
DisplayName="Command Line"
Visible="False"
IncludeInCommandLine="False" />
<StringProperty
Name="ExecutionDescription"
DisplayName="Execution Description"
IncludeInCommandLine="False"
Visible="False" />
<StringProperty
Subtype="AdditionalOptions"
Name="AdditionalOptions"
Category="Command Line">
<StringProperty.DisplayName>
<sys:String>Additional Options</sys:String>
</StringProperty.DisplayName>
<StringProperty.Description>
<sys:String>Additional Options</sys:String>
</StringProperty.Description>
</StringProperty>
</Rule>
<ItemType
Name="QtRCC"
DisplayName="Qt RCC" />
<ContentType
Name="QtRCC"
DisplayName="Qt RCC"
ItemType="QtRCC" />
</ProjectSchemaDefinitions>

@ -1,10 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemDefinitionGroup>
<QtUIC>
<OutputFileName>%(RootDir)%(Directory)ui_%(FileName).h</OutputFileName>
<CommandLineTemplate>$(QTDIR)\bin\uic.exe [AllOptions] [Inputs]</CommandLineTemplate>
<ExecutionDescription>Uic'ing %(Filename)%(Extension)...</ExecutionDescription>
</QtUIC>
</ItemDefinitionGroup>
</Project>

@ -1,47 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<PropertyPageSchema
Include="$(MSBuildThisFileDirectory)$(MSBuildThisFileName).xml" />
<AvailableItemName Include="QtUIC">
<Targets>_QtUIC</Targets>
</AvailableItemName>
</ItemGroup>
<UsingTask
TaskName="QtUIC"
TaskFactory="XamlTaskFactory"
AssemblyName="Microsoft.Build.Tasks.v4.0">
<Task>$(MSBuildThisFileDirectory)$(MSBuildThisFileName).xml</Task>
</UsingTask>
<Target
Name="_QtUIC"
BeforeTargets="ClCompile"
AfterTargets="CustomBuild"
Condition="'@(QtUIC)' != ''"
Outputs="%(QtUIC.OutputFileName)"
Inputs="%(QtUIC.Identity);$(MSBuildProjectFile)"
DependsOnTargets="_SelectedFiles">
<ItemGroup Condition="'@(SelectedFiles)' != ''">
<QtUIC Remove="@(QtUIC)" Condition="'%(Identity)' != '@(SelectedFiles)'" />
</ItemGroup>
<ItemGroup>
<QtUIC_tlog Include="%(QtUIC.OutputFileName)" Condition="'%(QtUIC.OutputFileName)' != '' and '%(QtUIC.ExcludedFromBuild)' != 'true'">
<Source>@(QtUIC, '|')</Source>
</QtUIC_tlog>
</ItemGroup>
<Message
Importance="High"
Text="%(QtUIC.ExecutionDescription)" />
<WriteLinesToFile
Condition="'@(QtUIC_tlog)' != '' and '%(QtUIC_tlog.ExcludedFromBuild)' != 'true'"
File="$(IntDir)$(ProjectName).uic.1.tlog"
Lines="^%(QtUIC_tlog.Source);@(QtUIC_tlog-&gt;'%(Fullpath)')"/>
<QtUIC
Condition="'@(QtUIC)' != '' and '%(QtUIC.ExcludedFromBuild)' != 'true'"
CommandLineTemplate="%(QtUIC.CommandLineTemplate)"
OutputFileName="%(QtUIC.OutputFileName)"
AdditionalOptions="%(QtUIC.AdditionalOptions)"
Inputs="%(QtUIC.Fullpath)" /> <!-- CRC TODO: Should use identity instead? Inputs="%(QtUIC.Identity)" /> -->
</Target>
</Project>

@ -1,74 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<ProjectSchemaDefinitions xmlns="http://schemas.microsoft.com/build/2009/properties" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:sys="clr-namespace:System;assembly=mscorlib">
<Rule
Name="QtUIC"
PageTemplate="tool"
DisplayName="Qt UIC"
Order="200">
<Rule.DataSource>
<DataSource
Persistence="ProjectFile"
ItemType="QtUIC" />
</Rule.DataSource>
<Rule.Categories>
<Category
Name="General">
<Category.DisplayName>
<sys:String>General</sys:String>
</Category.DisplayName>
</Category>
<Category
Name="Command Line"
Subtype="CommandLine">
<Category.DisplayName>
<sys:String>Command Line</sys:String>
</Category.DisplayName>
</Category>
</Rule.Categories>
<StringProperty
Name="OutputFileName"
Category="General"
DisplayName="Output File Name"
Description="Specifies the name of the output file."
Switch="-o &quot;[value]&quot;"/>
<StringProperty
Name="Inputs"
Category="Command Line"
IsRequired="true">
<StringProperty.DataSource>
<DataSource
Persistence="ProjectFile"
ItemType="QtUIC"
SourceType="Item" />
</StringProperty.DataSource>
</StringProperty>
<StringProperty
Name="CommandLineTemplate"
DisplayName="Command Line"
Visible="False"
IncludeInCommandLine="False" />
<StringProperty
Name="ExecutionDescription"
DisplayName="Execution Description"
IncludeInCommandLine="False"
Visible="False" />
<StringProperty
Subtype="AdditionalOptions"
Name="AdditionalOptions"
Category="Command Line">
<StringProperty.DisplayName>
<sys:String>Additional Options</sys:String>
</StringProperty.DisplayName>
<StringProperty.Description>
<sys:String>Additional Options</sys:String>
</StringProperty.Description>
</StringProperty>
</Rule>
<ItemType
Name="QtUIC"
DisplayName="Qt UIC" />
<ContentType
Name="QtUIC"
DisplayName="Qt UIC"
ItemType="QtUIC" />
</ProjectSchemaDefinitions>

@ -219,6 +219,7 @@ public:
void SetFullScreenState(bool fullScreenState) override; void SetFullScreenState(bool fullScreenState) override;
bool CanToggleFullScreenState() const override; bool CanToggleFullScreenState() const override;
void ToggleFullScreenState() override; void ToggleFullScreenState() override;
float GetDpiScaleFactor() const override { return 1.0f; };
void ConnectViewportInteractionRequestBus(); void ConnectViewportInteractionRequestBus();
void DisconnectViewportInteractionRequestBus(); void DisconnectViewportInteractionRequestBus();

@ -73,7 +73,7 @@ namespace TrackView
bool startedCapture = false; bool startedCapture = false;
AZ::Render::FrameCaptureRequestBus::BroadcastResult( AZ::Render::FrameCaptureRequestBus::BroadcastResult(
startedCapture, &AZ::Render::FrameCaptureRequestBus::Events::CapturePassAttachmentWithCallback, m_passHierarchy, startedCapture, &AZ::Render::FrameCaptureRequestBus::Events::CapturePassAttachmentWithCallback, m_passHierarchy,
AZStd::string("Output"), attachmentReadbackCallback); AZStd::string("Output"), attachmentReadbackCallback, AZ::RPI::PassAttachmentReadbackOption::Output);
return startedCapture; return startedCapture;
} }

@ -21,7 +21,6 @@ set(FILES
res/TreeView.bmp res/TreeView.bmp
res/VisualLog_PlayerButtons.bmp res/VisualLog_PlayerButtons.bmp
res/ab_toolbar.bmp res/ab_toolbar.bmp
res/about_dark.bmp
res/anim.bmp res/anim.bmp
res/animatio.bmp res/animatio.bmp
res/animations_tree_soundevent.bmp res/animations_tree_soundevent.bmp
@ -137,7 +136,6 @@ set(FILES
res/litebulb.bmp res/litebulb.bmp
res/lock_sel.bmp res/lock_sel.bmp
res/locksele.bmp res/locksele.bmp
res/logo.bmp
res/mainfram.bmp res/mainfram.bmp
res/mann_tagdef_toolbar.bmp res/mann_tagdef_toolbar.bmp
res/mann_tagdef_tree.bmp res/mann_tagdef_tree.bmp
@ -184,8 +182,6 @@ set(FILES
res/rename.ico res/rename.ico
res/replace.ico res/replace.ico
res/ribbon_system_button.png res/ribbon_system_button.png
res/sandbox_dark.bmp
res/sb_welcome_dark.bmp
res/selectobj.bmp res/selectobj.bmp
res/seq_1_colour_keys.bmp res/seq_1_colour_keys.bmp
res/seq_2_colour_keys.bmp res/seq_2_colour_keys.bmp

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:887d184cf49cf78c62a1fe53eac3cb8e7b071bb67e09b801a4893445ac4c800f
size 542456

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:8b65af2765042354ae4110dc7bcbde905e4a55a4995f66b626d15ec6c0fa18c1
size 96056

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:79412e83b32bb6712d9701f78465878a2057a590698a4dc8d8c7aa11de2623ef
size 4227

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:887d184cf49cf78c62a1fe53eac3cb8e7b071bb67e09b801a4893445ac4c800f
size 542456

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:704faeb96d930d3e6992a1449908aa6d7860b648e2feb38da8bf37cd7268a694
size 184856

@ -1155,7 +1155,7 @@ namespace Benchmark
class StorageDriveWindowsFixture : public benchmark::Fixture class StorageDriveWindowsFixture : public benchmark::Fixture
{ {
public: public:
constexpr static char* TestFileName = "StreamerBenchmark.bin"; constexpr static const char* TestFileName = "StreamerBenchmark.bin";
constexpr static size_t FileSize = 64_mib; constexpr static size_t FileSize = 64_mib;
void SetupStreamer(bool enableFileSharing) void SetupStreamer(bool enableFileSharing)

@ -504,7 +504,7 @@ namespace Physics
} }
} }
const AZ::Data::Asset<Physics::MaterialLibraryAsset>& MaterialSelection::GetMaterialLibrary() AZ::Data::Asset<Physics::MaterialLibraryAsset> MaterialSelection::GetMaterialLibrary()
{ {
if (auto* physicsSystem = AZ::Interface<AzPhysics::SystemInterface>::Get()) if (auto* physicsSystem = AZ::Interface<AzPhysics::SystemInterface>::Get())
{ {
@ -516,7 +516,7 @@ namespace Physics
return s_invalidMaterialLibrary; return s_invalidMaterialLibrary;
} }
const AZ::Data::AssetId& MaterialSelection::GetMaterialLibraryId() AZ::Data::AssetId MaterialSelection::GetMaterialLibraryId()
{ {
return GetMaterialLibrary().GetId(); return GetMaterialLibrary().GetId();
} }

@ -306,8 +306,8 @@ namespace Physics
void SyncSelectionToMaterialLibrary(); void SyncSelectionToMaterialLibrary();
static const AZ::Data::Asset<Physics::MaterialLibraryAsset>& GetMaterialLibrary(); static AZ::Data::Asset<Physics::MaterialLibraryAsset> GetMaterialLibrary();
static const AZ::Data::AssetId& GetMaterialLibraryId(); static AZ::Data::AssetId GetMaterialLibraryId();
bool AreMaterialSlotsReadOnly() const; bool AreMaterialSlotsReadOnly() const;

@ -116,6 +116,11 @@ namespace AzFramework
SetFullScreenState(!GetFullScreenState()); SetFullScreenState(!GetFullScreenState());
} }
float NativeWindow::GetDpiScaleFactor() const
{
return m_pimpl->GetDpiScaleFactor();
}
/*static*/ bool NativeWindow::GetFullScreenStateOfDefaultWindow() /*static*/ bool NativeWindow::GetFullScreenStateOfDefaultWindow()
{ {
NativeWindowHandle defaultWindowHandle = nullptr; NativeWindowHandle defaultWindowHandle = nullptr;
@ -228,4 +233,10 @@ namespace AzFramework
return false; return false;
} }
float NativeWindow::Implementation::GetDpiScaleFactor() const
{
// For platforms that aren't DPI-aware, we simply return a 1.0 ratio for no scaling
return 1.0f;
}
} // namespace AzFramework } // namespace AzFramework

@ -128,6 +128,7 @@ namespace AzFramework
void SetFullScreenState(bool fullScreenState) override; void SetFullScreenState(bool fullScreenState) override;
bool CanToggleFullScreenState() const override; bool CanToggleFullScreenState() const override;
void ToggleFullScreenState() override; void ToggleFullScreenState() override;
float GetDpiScaleFactor() const override;
//! Get the full screen state of the default window. //! Get the full screen state of the default window.
//! \return True if the default window is currently in full screen, false otherwise. //! \return True if the default window is currently in full screen, false otherwise.
@ -169,6 +170,7 @@ namespace AzFramework
virtual bool GetFullScreenState() const; virtual bool GetFullScreenState() const;
virtual void SetFullScreenState(bool fullScreenState); virtual void SetFullScreenState(bool fullScreenState);
virtual bool CanToggleFullScreenState() const; virtual bool CanToggleFullScreenState() const;
virtual float GetDpiScaleFactor() const;
protected: protected:
uint32_t m_width = 0; uint32_t m_width = 0;

@ -68,6 +68,11 @@ namespace AzFramework
//! Toggle the full screen state of the window. //! Toggle the full screen state of the window.
virtual void ToggleFullScreenState() = 0; virtual void ToggleFullScreenState() = 0;
//! Returns a scalar multiplier representing how many dots-per-inch this window has, compared
//! to a "standard" value of 96, the default for Windows in a DPI unaware setting. This can
//! be used to scale user interface elements to ensure legibility on high density displays.
virtual float GetDpiScaleFactor() const = 0;
}; };
using WindowRequestBus = AZ::EBus<WindowRequests>; using WindowRequestBus = AZ::EBus<WindowRequests>;
@ -87,6 +92,9 @@ namespace AzFramework
//! This is called once when the window is Activated and also called if the user resizes the window. //! This is called once when the window is Activated and also called if the user resizes the window.
virtual void OnWindowResized(uint32_t width, uint32_t height) { AZ_UNUSED(width); AZ_UNUSED(height); }; virtual void OnWindowResized(uint32_t width, uint32_t height) { AZ_UNUSED(width); AZ_UNUSED(height); };
//! This is called if the window's underyling DPI scaling factor changes.
virtual void OnDpiScaleFactorChanged(float dpiScaleFactor) { AZ_UNUSED(dpiScaleFactor); }
//! This is called when the window is deactivated from code or if the user closes the window. //! This is called when the window is deactivated from code or if the user closes the window.
virtual void OnWindowClosed() {}; virtual void OnWindowClosed() {};
}; };

@ -8,6 +8,7 @@
#include <AzFramework/Input/Buses/Notifications/RawInputNotificationBus_Windows.h> #include <AzFramework/Input/Buses/Notifications/RawInputNotificationBus_Windows.h>
#include <AzFramework/Windowing/NativeWindow.h> #include <AzFramework/Windowing/NativeWindow.h>
#include <AzCore/Module/DynamicModuleHandle.h>
#include <AzCore/PlatformIncl.h> #include <AzCore/PlatformIncl.h>
namespace AzFramework namespace AzFramework
@ -17,7 +18,7 @@ namespace AzFramework
{ {
public: public:
AZ_CLASS_ALLOCATOR(NativeWindowImpl_Win32, AZ::SystemAllocator, 0); AZ_CLASS_ALLOCATOR(NativeWindowImpl_Win32, AZ::SystemAllocator, 0);
NativeWindowImpl_Win32() = default; NativeWindowImpl_Win32();
~NativeWindowImpl_Win32() override; ~NativeWindowImpl_Win32() override;
// NativeWindow::Implementation overrides... // NativeWindow::Implementation overrides...
@ -33,6 +34,7 @@ namespace AzFramework
bool GetFullScreenState() const override; bool GetFullScreenState() const override;
void SetFullScreenState(bool fullScreenState) override; void SetFullScreenState(bool fullScreenState) override;
bool CanToggleFullScreenState() const override { return true; } bool CanToggleFullScreenState() const override { return true; }
float GetDpiScaleFactor() const override;
private: private:
static DWORD ConvertToWin32WindowStyleMask(const WindowStyleMasks& styleMasks); static DWORD ConvertToWin32WindowStyleMask(const WindowStyleMasks& styleMasks);
@ -49,6 +51,9 @@ namespace AzFramework
RECT m_windowRectToRestoreOnFullScreenExit; //!< The position and size of the window to restore when exiting full screen. RECT m_windowRectToRestoreOnFullScreenExit; //!< The position and size of the window to restore when exiting full screen.
UINT m_windowStyleToRestoreOnFullScreenExit; //!< The style(s) of the window to restore when exiting full screen. UINT m_windowStyleToRestoreOnFullScreenExit; //!< The style(s) of the window to restore when exiting full screen.
bool m_isInBorderlessWindowFullScreenState = false; //!< Was a borderless window used to enter full screen state? bool m_isInBorderlessWindowFullScreenState = false; //!< Was a borderless window used to enter full screen state?
using GetDpiForWindowType = UINT(HWND hwnd);
GetDpiForWindowType* m_getDpiFunction = nullptr;
}; };
const char* NativeWindowImpl_Win32::s_defaultClassName = "O3DEWin32Class"; const char* NativeWindowImpl_Win32::s_defaultClassName = "O3DEWin32Class";
@ -58,6 +63,15 @@ namespace AzFramework
return aznew NativeWindowImpl_Win32(); return aznew NativeWindowImpl_Win32();
} }
NativeWindowImpl_Win32::NativeWindowImpl_Win32()
{
// Attempt to load GetDpiForWindow from user32 at runtime, available on Windows 10+ versions >= 1607
if (auto user32module = AZ::DynamicModuleHandle::Create("user32"); user32module->Load(false))
{
m_getDpiFunction = user32module->GetFunction<GetDpiForWindowType*>("GetDpiForWindow");
}
}
NativeWindowImpl_Win32::~NativeWindowImpl_Win32() NativeWindowImpl_Win32::~NativeWindowImpl_Win32()
{ {
DestroyWindow(m_win32Handle); DestroyWindow(m_win32Handle);
@ -237,6 +251,12 @@ namespace AzFramework
// Send all other WM_SYSKEYDOWN messages to the default WndProc. // Send all other WM_SYSKEYDOWN messages to the default WndProc.
break; break;
} }
case WM_DPICHANGED:
{
const float newScaleFactor = nativeWindowImpl->GetDpiScaleFactor();
WindowNotificationBus::Event(nativeWindowImpl->GetWindowHandle(), &WindowNotificationBus::Events::OnDpiScaleFactorChanged, newScaleFactor);
break;
}
default: default:
return DefWindowProc(hWnd, message, wParam, lParam); return DefWindowProc(hWnd, message, wParam, lParam);
break; break;
@ -330,6 +350,17 @@ namespace AzFramework
} }
} }
float NativeWindowImpl_Win32::GetDpiScaleFactor() const
{
constexpr UINT defaultDotsPerInch = 96;
UINT dotsPerInch = defaultDotsPerInch;
if (m_getDpiFunction)
{
dotsPerInch = m_getDpiFunction(m_win32Handle);
}
return aznumeric_cast<float>(dotsPerInch) / aznumeric_cast<float>(defaultDotsPerInch);
}
void NativeWindowImpl_Win32::EnterBorderlessWindowFullScreen() void NativeWindowImpl_Win32::EnterBorderlessWindowFullScreen()
{ {
if (m_isInBorderlessWindowFullScreenState) if (m_isInBorderlessWindowFullScreenState)

@ -3288,15 +3288,20 @@ namespace AzQtComponents
} }
// Untab tabbed dock widgets before restoring, as the restore only works on dock widgets parented directly to the main window // Untab tabbed dock widgets before restoring, as the restore only works on dock widgets parented directly to the main window
const QList<QDockWidget*> dockWidgets = m_mainWindow->findChildren<QDockWidget*>(); for (QDockWidget* dockWidget : m_mainWindow->findChildren<QDockWidget*>(
for (QDockWidget* dockWidget : dockWidgets) QRegularExpression(QString("%1.*").arg(m_tabContainerIdentifierPrefix)), Qt::FindChildrenRecursively))
{ {
if (QStackedWidget* stackedWidget = qobject_cast<QStackedWidget*>(dockWidget->parentWidget())) DockTabWidget* tabWidget = qobject_cast<DockTabWidget*>(dockWidget->widget());
if (!tabWidget)
{ {
if (AzQtComponents::DockTabWidget* tabWidget = qobject_cast<AzQtComponents::DockTabWidget*>(stackedWidget->parentWidget())) continue;
{ }
tabWidget->removeTab(dockWidget);
} // Remove the tabs from the tab widget (we don't actually want to close them, which could delete them at this point)
int numTabs = tabWidget->count();
for (int i = 0; i < numTabs; ++i)
{
tabWidget->removeTab(0);
} }
} }

@ -1303,6 +1303,10 @@ namespace AzQtComponents
} }
break; break;
case QStyle::SP_MessageBoxInformation:
return QIcon(QString::fromUtf8(":/stylesheet/img/UI20/Info.svg"));
break;
default: default:
break; break;
} }

@ -123,6 +123,7 @@ QPlainTextEdit:focus
@import "LineEdit.qss"; @import "LineEdit.qss";
@import "Menu.qss"; @import "Menu.qss";
@import "MenuBar.qss"; @import "MenuBar.qss";
@import "MessageBox.qss";
@import "ProgressBar.qss"; @import "ProgressBar.qss";
@import "PushButton.qss"; @import "PushButton.qss";
@import "QDockWidget.qss"; @import "QDockWidget.qss";

@ -0,0 +1,21 @@
/*
* Copyright (c) Contributors to the Open 3D Engine Project
*
* SPDX-License-Identifier: Apache-2.0 OR MIT
*
*/
/* correct the padding around the two main labels to give space at the borders */
QMessageBox QLabel#qt_msgbox_label
{
padding-top: 20px;
padding-right: 20px;
padding-bottom: 20px;
}
QMessageBox QLabel#qt_msgboxex_icon_label
{
padding-left: 20px;
padding-top: 20px;
}

@ -354,17 +354,17 @@
<file>img/UI20/toolbar/Grid.svg</file> <file>img/UI20/toolbar/Grid.svg</file>
<file>img/UI20/toolbar/Lighting.svg</file> <file>img/UI20/toolbar/Lighting.svg</file>
<file>img/UI20/toolbar/Load.svg</file> <file>img/UI20/toolbar/Load.svg</file>
<file>img/UI20/toolbar/Local.svg</file> <file>img/UI20/toolbar/Local.svg</file>
<file>img/UI20/toolbar/Locked.svg</file> <file>img/UI20/toolbar/Locked.svg</file>
<file>img/UI20/toolbar/Locked_Status.svg</file> <file>img/UI20/toolbar/Locked_Status.svg</file>
<file>img/UI20/toolbar/LUA.svg</file> <file>img/UI20/toolbar/LUA.svg</file>
<file>img/UI20/toolbar/Material.svg</file> <file>img/UI20/toolbar/Material.svg</file>
<file>img/UI20/toolbar/Measure.svg</file> <file>img/UI20/toolbar/Measure.svg</file>
<file>img/UI20/toolbar/Move.svg</file> <file>img/UI20/toolbar/Move.svg</file>
<file>img/UI20/toolbar/Object_follow_terrain.svg</file> <file>img/UI20/toolbar/Object_follow_terrain.svg</file>
<file>img/UI20/toolbar/Object_height.svg</file> <file>img/UI20/toolbar/Object_height.svg</file>
<file>img/UI20/toolbar/Object_list.svg</file> <file>img/UI20/toolbar/Object_list.svg</file>
<file>img/UI20/toolbar/Parent.svg</file> <file>img/UI20/toolbar/Parent.svg</file>
<file>img/UI20/toolbar/particle.svg</file> <file>img/UI20/toolbar/particle.svg</file>
<file>img/UI20/toolbar/Play.svg</file> <file>img/UI20/toolbar/Play.svg</file>
<file>img/UI20/toolbar/Redo.svg</file> <file>img/UI20/toolbar/Redo.svg</file>
@ -385,7 +385,7 @@
<file>img/UI20/toolbar/undo.svg</file> <file>img/UI20/toolbar/undo.svg</file>
<file>img/UI20/toolbar/Unlocked.svg</file> <file>img/UI20/toolbar/Unlocked.svg</file>
<file>img/UI20/toolbar/Vertex_snapping.svg</file> <file>img/UI20/toolbar/Vertex_snapping.svg</file>
<file>img/UI20/toolbar/World.svg</file> <file>img/UI20/toolbar/World.svg</file>
<file>img/UI20/toolbar/X_axis.svg</file> <file>img/UI20/toolbar/X_axis.svg</file>
<file>img/UI20/toolbar/Y_axis.svg</file> <file>img/UI20/toolbar/Y_axis.svg</file>
<file>img/UI20/toolbar/Z_axis.svg</file> <file>img/UI20/toolbar/Z_axis.svg</file>
@ -459,6 +459,7 @@
<file>Widgets/ComboBoxConfig.ini</file> <file>Widgets/ComboBoxConfig.ini</file>
<file>Widgets/Menu.qss</file> <file>Widgets/Menu.qss</file>
<file>Widgets/MenuBar.qss</file> <file>Widgets/MenuBar.qss</file>
<file>Widgets/MessageBox.qss</file>
<file>Widgets/ProgressBarConfig.ini</file> <file>Widgets/ProgressBarConfig.ini</file>
<file>Widgets/ProgressBar.qss</file> <file>Widgets/ProgressBar.qss</file>
<file>Widgets/PushButton.qss</file> <file>Widgets/PushButton.qss</file>

@ -222,6 +222,21 @@ namespace AzToolsFramework
void AssetBrowserTreeView::UpdateAfterFilter(bool hasFilter, bool selectFirstValidEntry) void AssetBrowserTreeView::UpdateAfterFilter(bool hasFilter, bool selectFirstValidEntry)
{ {
const QModelIndexList& selectedIndexes = selectionModel()->selectedRows();
// If we've cleared the filter but had something selected, ensure it stays selected and visible.
if (!hasFilter && !selectedIndexes.isEmpty())
{
QModelIndex curIndex = selectedIndexes[0];
m_expandToEntriesByDefault = true;
m_treeStateSaver->ApplySnapshot();
setCurrentIndex(curIndex);
scrollTo(curIndex);
return;
}
// Flag our default expansion state so that we expand down to source entries after filtering // Flag our default expansion state so that we expand down to source entries after filtering
m_expandToEntriesByDefault = hasFilter; m_expandToEntriesByDefault = hasFilter;
// Then ask our state saver to apply its current snapshot again, falling back on asking us if entries should be expanded or not // Then ask our state saver to apply its current snapshot again, falling back on asking us if entries should be expanded or not

@ -151,6 +151,12 @@ namespace LegacyFramework
specializations.Append("tools"); specializations.Append("tools");
} }
void Application::CreateReflectionManager()
{
AZ::ComponentApplication::CreateReflectionManager();
GetSerializeContext()->CreateEditContext();
}
int Application::Run(const ApplicationDesc& desc) int Application::Run(const ApplicationDesc& desc)
{ {
if (!AZ::AllocatorInstance<AZ::OSAllocator>::IsReady()) if (!AZ::AllocatorInstance<AZ::OSAllocator>::IsReady())

@ -56,6 +56,8 @@ namespace LegacyFramework
virtual int Run(const ApplicationDesc& desc); virtual int Run(const ApplicationDesc& desc);
Application(); Application();
void CreateReflectionManager() override;
protected: protected:
// ------------------------------------------------------------------ // ------------------------------------------------------------------

@ -122,6 +122,8 @@ foreach(project_name project_path IN ZIP_LISTS LY_PROJECTS_TARGET_NAME LY_PROJEC
FOLDER ${project_name} FOLDER ${project_name}
) )
# After ensuring that we correctly support DPI scaling, this should be switched to "PerMonitor"
set_property(TARGET ${project_name}.GameLauncher APPEND PROPERTY VS_DPI_AWARE "OFF")
if(LY_DEFAULT_PROJECT_PATH) if(LY_DEFAULT_PROJECT_PATH)
set_property(TARGET ${project_name}.GameLauncher APPEND PROPERTY VS_DEBUGGER_COMMAND_ARGUMENTS "--project-path=\"${LY_DEFAULT_PROJECT_PATH}\"") set_property(TARGET ${project_name}.GameLauncher APPEND PROPERTY VS_DEBUGGER_COMMAND_ARGUMENTS "--project-path=\"${LY_DEFAULT_PROJECT_PATH}\"")
endif() endif()

@ -80,14 +80,44 @@ float3x3 BuildViewAlignedOrthonormalBasis(in float3 normal, in float3 dirToView)
// xy plane in positive z space. // xy plane in positive z space.
float IntegrateEdge(float3 v1, float3 v2) float IntegrateEdge(float3 v1, float3 v2)
{ {
// This alternate version may work better for platforms where acos() precision is low.
/*
float x = dot(v1, v2);
float y = abs(x);
float a = 5.42031 + (3.12829 + 0.0902326 * y) * y;
float b = 3.45068 + (4.18814 + y) * y;
float theta_sinTheta = a / b;
if (x < 0.0)
{
theta_sinTheta = PI * rsqrt(saturate(1.0 - x * x)) - theta_sinTheta;
}
float3 u = cross(v1, v2);
return theta_sinTheta * u.z;
*/
float cosTheta = dot(v1, v2); float cosTheta = dot(v1, v2);
cosTheta = clamp(cosTheta, -0.9999, 0.9999); float theta = acos(cosTheta);
// calculate 1.0 / sin(theta) // calculate 1.0 / sin(theta)
float invSinTheta = rsqrt(1.0 - cosTheta * cosTheta); float invSinTheta = rsqrt(saturate(1.0 - cosTheta * cosTheta));
float theta = acos(cosTheta); return cross(v1, v2).z * ((theta > 0.001) ? theta * invSinTheta : 1.0);
return cross(v1, v2).z * theta * invSinTheta; }
// Cheaper version of above which is good enough for diffuse
float IntegrateEdgeDiffuse(float3 v1, float3 v2)
{
float cosTheta = dot(v1, v2);
float absCosTheta = abs(cosTheta);
float theta_sinTheta = 1.5708 + (-0.879406 + 0.308609 * absCosTheta) * absCosTheta;
if (cosTheta < 0.0)
{
theta_sinTheta = PI * rsqrt(1.0 - cosTheta * cosTheta) - theta_sinTheta;
}
return theta_sinTheta * cross(v1, v2).z;
} }
// Returns the unnormalized z plane intersection point between pointAboveHorizon and pointBelowHorizon. // Returns the unnormalized z plane intersection point between pointAboveHorizon and pointBelowHorizon.
@ -189,42 +219,90 @@ void ClipQuadToHorizon(inout float3 p[5], out int vertexCount)
} }
} }
// Takes 4 points (p) from a quad plus a 5th dummy point, rotates them into the space of the normal, then transforms // Applies the LTC matrix to the clipped points of a quad.
// the points by the LTC matrix provided. The points are then clipped to the normal's hemisphere. The number of points void ApplyLtcMatrixToQuad(in float3x3 ltcMat, inout float3 p[5], in int vertexCount)
// after the clip is returned in vertexCount. It's possible for the resulting clipped quad to be a triangle (when 3
// points are below the horizon), or a pentagon (when one point is below the horizon), or be a regular 4 point quad.
void LtcClipAndNormalizeQuad(in float3 normal, in float3 dirToView, float3x3 ltcMat, inout float3 p[5], out int vertexCount)
{ {
// Rotate ltc matrix
ltcMat = mul(ltcMat, BuildViewAlignedOrthonormalBasis(normal, dirToView));
// Transform points into ltc space // Transform points into ltc space
p[0] = mul(ltcMat, p[0].xyz); p[0] = mul(ltcMat, p[0]);
p[1] = mul(ltcMat, p[1].xyz); p[1] = mul(ltcMat, p[1]);
p[2] = mul(ltcMat, p[2].xyz); p[2] = mul(ltcMat, p[2]);
p[3] = mul(ltcMat, p[3].xyz);
ClipQuadToHorizon(p, vertexCount);
// visibility check if (vertexCount > 3)
if (vertexCount == 0)
{ {
return; p[3] = mul(ltcMat, p[3]);
}
if (vertexCount > 4)
{
p[4] = mul(ltcMat, p[4]);
} }
}
// project onto sphere // Projects the clipped points of a quad onto the sphere.
void NormalizeQuadPoints(inout float3 p[5], in int vertexCount)
{
// project quad points onto a sphere.
p[0] = normalize(p[0]); p[0] = normalize(p[0]);
p[1] = normalize(p[1]); p[1] = normalize(p[1]);
p[2] = normalize(p[2]); p[2] = normalize(p[2]);
p[3] = normalize(p[3]);
p[4] = normalize(p[4]); if (vertexCount > 3)
{
p[3] = normalize(p[3]);
}
if (vertexCount > 4)
{
p[4] = normalize(p[4]);
}
}
// Transforms the 4 points of a quad into the hemisphere of the normal
void TransformQuadToOrthonormalBasis(in float3 normal, in float3 dirToView, inout float3 p[4])
{
float3x3 orthoNormalBasis = BuildViewAlignedOrthonormalBasis(normal, dirToView);
// Transform points into orthonormal space
p[0] = mul(orthoNormalBasis, p[0]);
p[1] = mul(orthoNormalBasis, p[1]);
p[2] = mul(orthoNormalBasis, p[2]);
p[3] = mul(orthoNormalBasis, p[3]);
} }
float IntegrateQuad(in float3 v[5], in float vertexCount, in bool doubleSided) // Integrates the edges of a quad for lambertian diffuse contribution.
float IntegrateQuadDiffuse(in float3 v[5], in float vertexCount, in bool doubleSided)
{ {
// Integrate
float sum = 0.0; float sum = 0.0;
NormalizeQuadPoints(v, vertexCount);
// There must be at least 3 points so don't check for the first 2 edges.
sum += IntegrateEdgeDiffuse(v[0], v[1]);
sum += IntegrateEdgeDiffuse(v[1], v[2]);
if (vertexCount > 3)
{
sum += IntegrateEdgeDiffuse(v[2], v[3]);
if (vertexCount == 5)
{
sum += IntegrateEdgeDiffuse(v[3], v[4]);
}
}
// Close the polygon
sum += IntegrateEdgeDiffuse(v[vertexCount - 1], v[0]);
// Note: negated due to winding order
sum = doubleSided ? abs(sum) : max(0.0, -sum);
return sum;
}
// Integrates the edges of a quad for specular contribution.
float IntegrateQuadSpecular(in float3 v[5], in float vertexCount, in bool doubleSided)
{
float sum = 0.0;
NormalizeQuadPoints(v, vertexCount);
// There must be at least 3 points so don't check for the first 2 edges. // There must be at least 3 points so don't check for the first 2 edges.
sum += IntegrateEdge(v[0], v[1]); sum += IntegrateEdge(v[0], v[1]);
sum += IntegrateEdge(v[1], v[2]); sum += IntegrateEdge(v[1], v[2]);
@ -247,26 +325,62 @@ float IntegrateQuad(in float3 v[5], in float vertexCount, in bool doubleSided)
return sum; return sum;
} }
float LtcQuadEvaluate(in float3 normal, in float3 dirToView, in float3x3 ltcMat, in float3 p[4], in bool doubleSided) // Evaluate linear transform cosine lighting for a 4 point quad.
// normal - The surface normal
// dirToView - Normalized direction from the surface to the view
// ltcMat - The LTC matrix for specular, or identity for diffuse.
// p[4] - The 4 light positions relative to the surface position.
// doubleSided - If the quad emits light from both sides
// diffuse - The output diffuse response for the quad light
// specular - The output specular response for the quad light
void LtcQuadEvaluate(
in float3 normal,
in float3 dirToView,
in float3x3 ltcMat,
in float3 p[4],
in bool doubleSided,
out float diffuse,
out float specular)
{ {
// Transform the points of the light into the space of the normal's hemisphere.
TransformQuadToOrthonormalBasis(normal, dirToView, p);
// Initialize quad with dummy point at end in case one corner is clipped (resulting in 5 sided polygon) // Initialize quad with dummy point at end in case one corner is clipped (resulting in 5 sided polygon)
float3 v[5] = {p[0], p[1], p[2], p[3], float3(0.0, 0.0, 0.0)}; float3 v[5] = {p[0], p[1], p[2], p[3], float3(0.0, 0.0, 0.0)};
// Clip the light polygon to the normal hemisphere. This is done before the LTC matrix is applied to prevent
// parts of the light below the horizon from impacting the surface. The number of points remaining after
// the clip is returned in vertexCount. It's possible for the vertexCount of the resulting clipped quad to be
// 0 - all points clipped (no work to do, so return)
// 3 - 3 points clipped, leaving only a triangular corner of the quad
// 4 - 2 or 0 points clipped, leaving a quad
// 5 - 1 point clipped leaving a pentagon.
int vertexCount = 0; int vertexCount = 0;
LtcClipAndNormalizeQuad(normal, dirToView, ltcMat, v, vertexCount); ClipQuadToHorizon(v, vertexCount);
if (vertexCount > 0) if (vertexCount == 0)
{ {
return IntegrateQuad(v, vertexCount, doubleSided); // Entire light is below the horizon.
return;
} }
return 0.0;
// IntegrateQuadDiffuse is a cheap approximation compared to specular.
diffuse = IntegrateQuadDiffuse(v, vertexCount, doubleSided);
ApplyLtcMatrixToQuad(ltcMat, v, vertexCount);
// IntegrateQuadSpecular uses more accurate integration to handle smooth surfaces correctly.
specular = IntegrateQuadSpecular(v, vertexCount, doubleSided);
} }
// Checks an edge against the horizon and integrates it. // Checks an edge against the horizon and integrates it.
// p0 - first point // p0 - First point
// p1 - second point // p1 - Second point
// prevClipPoint - the clip point saved from the last time an edge went from above to below the horizon // prevClipPoint - The clip point saved from the last time an edge went from above to below the horizon
// sum - the sum total of all integrations to contribute to. // ltcMat - The ltc lookup matrix for specular
// diffuse - The current sum total of diffuse contribution to apply additional contribution to
// specular - The current sum total of specular contribution to apply additional contribution to
// //
// Explanation: // Explanation:
// When evaluating edges of a polygon there are four possible states to deal with // When evaluating edges of a polygon there are four possible states to deal with
@ -283,28 +397,34 @@ float LtcQuadEvaluate(in float3 normal, in float3 dirToView, in float3x3 ltcMat,
// 4. Both points are below the horizon // 4. Both points are below the horizon
// - Do nothing. // - Do nothing.
void EvaluatePolyEdge(in float3 p0, in float3 p1, inout float3 prevClipPoint, inout float sum) void EvaluatePolyEdge(in float3 p0, in float3 p1, inout float3 prevClipPoint, in float3x3 ltcMat, inout float diffuse, inout float specular)
{ {
if (p0.z > 0.0) if (p0.z > 0.0)
{ {
if (p1.z > 0.0) if (p1.z > 0.0)
{ {
// Both above horizon // Both above horizon
sum += IntegrateEdge(normalize(p0), normalize(p1)); diffuse += IntegrateEdgeDiffuse(normalize(p0), normalize(p1));
specular += IntegrateEdge(normalize(mul(ltcMat, p0)), normalize(mul(ltcMat, p1)));
} }
else else
{ {
// Going from above to below horizon // Going from above to below horizon
prevClipPoint = normalize(ClipEdge(p0, p1)); prevClipPoint = ClipEdge(p0, p1);
sum += IntegrateEdge(normalize(p0), prevClipPoint); diffuse += IntegrateEdgeDiffuse(normalize(p0), normalize(prevClipPoint));
specular += IntegrateEdge(normalize(mul(ltcMat, p0)), normalize(mul(ltcMat, prevClipPoint)));
} }
} }
else if (p1.z > 0.0) else if (p1.z > 0.0)
{ {
// Going from below to above horizon // Going from below to above horizon
float3 clipPoint = normalize(ClipEdge(p1, p0)); float3 clipPoint = ClipEdge(p1, p0);
sum += IntegrateEdge(prevClipPoint, clipPoint); diffuse += IntegrateEdgeDiffuse(normalize(prevClipPoint), normalize(clipPoint));
sum += IntegrateEdge(clipPoint, normalize(p1)); diffuse += IntegrateEdgeDiffuse(normalize(clipPoint), normalize(p1));
clipPoint = mul(ltcMat, clipPoint);
specular += IntegrateEdge(normalize(mul(ltcMat, prevClipPoint)), normalize(clipPoint));
specular += IntegrateEdge(normalize(clipPoint), normalize(mul(ltcMat, p1)));
} }
} }
@ -316,26 +436,38 @@ void EvaluatePolyEdge(in float3 p0, in float3 p1, inout float3 prevClipPoint, in
// positions - The buffer where the polygon positions are // positions - The buffer where the polygon positions are
// startIdx - The index of the first polygon position // startIdx - The index of the first polygon position
// endIdx - The index of the point directly after the last polygon position // endIdx - The index of the point directly after the last polygon position
// // diffuse - The output diffuse response for the polygon light
// specular - The output specular response for the polygon light
// The most complicated aspect of this function is clipping the polygon against the horizon of the surface point. See // The most complicated aspect of this function is clipping the polygon against the horizon of the surface point. See
// EvaluatePolyEdge() above for details on the general concept. However, this function must deal with the case of the // EvaluatePolyEdge() above for details on the general concept. However, this function must deal with the case of the
// first point being below the horizon. In that case, it needs to search in reverse from the end for the first point // first point being below the horizon. In that case, it needs to search in reverse from the end for the first point
// above the horizon, and save the intersection point between the above and below points so it can be used in // above the horizon, and save the intersection point between the above and below points so it can be used in
// EvaluatePolyEdge() later. During this search it also adjusts the end point index as necessary to avoid processing // EvaluatePolyEdge() later. During this search it also adjusts the end point index as necessary to avoid processing
// those points that are below the horizon. // those points that are below the horizon.
float LtcPolygonEvaluate(in float3 pos, in float3 normal, in float3 dirToView, in float3x3 ltcMat, in StructuredBuffer<float4> positions, in uint startIdx, in uint endIdx) void LtcPolygonEvaluate(
in float3 pos,
in float3 normal,
in float3 dirToView,
in float3x3 ltcMat,
in StructuredBuffer<float4> positions,
in uint startIdx,
in uint endIdx,
out float diffuse,
out float specular
)
{ {
if (endIdx - startIdx < 3) if (endIdx - startIdx < 3)
{ {
return 0.0; // Must have at least 3 points to form a polygon. return; // Must have at least 3 points to form a polygon.
} }
// Rotate ltc matrix // Rotate ltc matrix
ltcMat = mul(ltcMat, BuildViewAlignedOrthonormalBasis(normal, dirToView)); float3x3 orthonormalMat = BuildViewAlignedOrthonormalBasis(normal, dirToView);
// Prepare initial values // Prepare initial values
float sum = 0.0; // sum of edge integation float3 p0 = mul(orthonormalMat, positions[startIdx].xyz - pos); // First point in polygon
float3 p0 = mul(ltcMat, positions[startIdx].xyz - pos); // First point in polygon diffuse = 0.0;
specular = 0.0;
float3 prevClipPoint = float3(0.0, 0.0, 0.0); // Used to hold previous clip point when polygon dips below horizon. float3 prevClipPoint = float3(0.0, 0.0, 0.0); // Used to hold previous clip point when polygon dips below horizon.
float3 closePoint = p0; float3 closePoint = p0;
@ -349,10 +481,10 @@ float LtcPolygonEvaluate(in float3 pos, in float3 normal, in float3 dirToView, i
// searching backwards, updating the endIdx along the way to avoid reprocessing those points later // searching backwards, updating the endIdx along the way to avoid reprocessing those points later
for ( ; endIdx > startIdx + 1; --endIdx) for ( ; endIdx > startIdx + 1; --endIdx)
{ {
float3 prevPoint = mul(ltcMat, positions[endIdx - 1].xyz - pos); float3 prevPoint = mul(orthonormalMat, positions[endIdx - 1].xyz - pos);
if (prevPoint.z > 0) if (prevPoint.z > 0.0)
{ {
prevClipPoint = normalize(ClipEdge(prevPoint, p0)); prevClipPoint = ClipEdge(prevPoint, p0);
closePoint = prevClipPoint; closePoint = prevClipPoint;
break; break;
} }
@ -362,7 +494,7 @@ float LtcPolygonEvaluate(in float3 pos, in float3 normal, in float3 dirToView, i
// Check if all points below horizon // Check if all points below horizon
if (endIdx == startIdx + 1) if (endIdx == startIdx + 1)
{ {
return 0.0; return;
} }
p0 = firstPoint; // Restore the original p0 p0 = firstPoint; // Restore the original p0
@ -371,13 +503,14 @@ float LtcPolygonEvaluate(in float3 pos, in float3 normal, in float3 dirToView, i
// Evaluate all the points // Evaluate all the points
for (uint curIdx = startIdx + 1; curIdx < endIdx; ++curIdx) for (uint curIdx = startIdx + 1; curIdx < endIdx; ++curIdx)
{ {
float3 p1 = mul(ltcMat, positions[curIdx].xyz - pos); // Current point in polygon float3 p1 = mul(orthonormalMat, positions[curIdx].xyz - pos); // Current point in polygon
EvaluatePolyEdge(p0, p1, prevClipPoint, sum); EvaluatePolyEdge(p0, p1, prevClipPoint, ltcMat, diffuse, specular);
p0 = p1; p0 = p1;
} }
EvaluatePolyEdge(p0, closePoint, prevClipPoint, sum); EvaluatePolyEdge(p0, closePoint, prevClipPoint, ltcMat, diffuse, specular);
// Note: negated due to winding order // Note: negated due to winding order
return -sum; diffuse = -diffuse;
specular = -specular;
} }

@ -50,26 +50,25 @@ void ApplyPoylgonLight(ViewSrg::PolygonLight light, Surface surface, inout Light
float radiusAttenuation = 1.0 - (falloff * falloff); float radiusAttenuation = 1.0 - (falloff * falloff);
radiusAttenuation = radiusAttenuation * radiusAttenuation; radiusAttenuation = radiusAttenuation * radiusAttenuation;
// Diffuse
static const float3x3 identityMatrix = float3x3(1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0);
float diffuse = LtcPolygonEvaluate(surface.position, surface.normal, lightingData.dirToCamera, identityMatrix, ViewSrg::m_polygonLightPoints, startIndex, endIndex);
diffuse = doubleSided ? abs(diffuse) : max(0.0, diffuse);
// Specular
float2 ltcCoords = LtcCoords(dot(surface.normal, lightingData.dirToCamera), surface.roughnessLinear); float2 ltcCoords = LtcCoords(dot(surface.normal, lightingData.dirToCamera), surface.roughnessLinear);
float3x3 ltcMat = LtcMatrix(SceneSrg::m_ltcMatrix, ltcCoords); float3x3 ltcMat = LtcMatrix(SceneSrg::m_ltcMatrix, ltcCoords);
float3 specular = LtcPolygonEvaluate(surface.position, surface.normal, lightingData.dirToCamera, ltcMat, ViewSrg::m_polygonLightPoints, startIndex, endIndex);
float diffuse = 0.0;
float specular = 0.0;
LtcPolygonEvaluate(surface.position, surface.normal, lightingData.dirToCamera, ltcMat, ViewSrg::m_polygonLightPoints, startIndex, endIndex, diffuse, specular);
diffuse = doubleSided ? abs(diffuse) : max(0.0, diffuse);
specular = doubleSided ? abs(specular) : max(0.0, specular); specular = doubleSided ? abs(specular) : max(0.0, specular);
// Apply BRDF scale terms (BRDF magnitude and Schlick Fresnel) // Apply BRDF scale terms (BRDF magnitude and Schlick Fresnel)
float2 schlick = SceneSrg::m_ltcAmplification.Sample(PassSrg::LinearSampler, ltcCoords).xy; float2 schlick = SceneSrg::m_ltcAmplification.Sample(PassSrg::LinearSampler, ltcCoords).xy;
specular *= schlick.x + (1.0 - surface.specularF0) * schlick.y; float3 specularRGB = specular * (schlick.x + (1.0 - surface.specularF0) * schlick.y);
// Scale by inverse surface area of hemisphere (1/2pi), attenuation, and light intensity // Scale by inverse surface area of hemisphere (1/2pi), attenuation, and light intensity
float3 intensity = 0.5 * INV_PI * radiusAttenuation * abs(light.m_rgbIntensityNits); float3 intensity = 0.5 * INV_PI * radiusAttenuation * abs(light.m_rgbIntensityNits);
lightingData.diffuseLighting += surface.albedo * diffuse * intensity; lightingData.diffuseLighting += surface.albedo * diffuse * intensity;
lightingData.specularLighting += surface.specularF0 * specular * intensity; lightingData.specularLighting += surface.specularF0 * specularRGB * intensity;
} }
void ApplyPolygonLights(Surface surface, inout LightingData lightingData) void ApplyPolygonLights(Surface surface, inout LightingData lightingData)

@ -111,24 +111,22 @@ void ApplyQuadLight(ViewSrg::QuadLight light, Surface surface, inout LightingDat
{ {
float3 p[4] = {p0, p1, p2, p3}; float3 p[4] = {p0, p1, p2, p3};
// Diffuse
float3x3 identityMatrix = float3x3(1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0);
float diffuse = LtcQuadEvaluate(surface.normal, lightingData.dirToCamera, identityMatrix, p, doubleSided);
// Specular
float2 ltcCoords = LtcCoords(dot(surface.normal, lightingData.dirToCamera), surface.roughnessLinear); float2 ltcCoords = LtcCoords(dot(surface.normal, lightingData.dirToCamera), surface.roughnessLinear);
float3x3 ltcMat = LtcMatrix(SceneSrg::m_ltcMatrix, ltcCoords); float3x3 ltcMat = LtcMatrix(SceneSrg::m_ltcMatrix, ltcCoords);
float3 specular = LtcQuadEvaluate(surface.normal, lightingData.dirToCamera, ltcMat, p, doubleSided);
float diffuse = 0.0;
float specular = 0.0;
LtcQuadEvaluate(surface.normal, lightingData.dirToCamera, ltcMat, p, doubleSided, diffuse, specular);
// Apply BRDF scale terms (BRDF magnitude and Schlick Fresnel) // Apply BRDF scale terms (BRDF magnitude and Schlick Fresnel)
float2 schlick = SceneSrg::m_ltcAmplification.Sample(PassSrg::LinearSampler, ltcCoords).xy; float2 schlick = SceneSrg::m_ltcAmplification.Sample(PassSrg::LinearSampler, ltcCoords).xy;
specular *= schlick.x + (1.0 - surface.specularF0) * schlick.y; float3 specularRGB = specular * (schlick.x + (1.0 - surface.specularF0) * schlick.y);
// Scale by inverse surface area of hemisphere (1/2pi), attenuation, and light intensity // Scale by inverse surface area of hemisphere (1/2pi), attenuation, and light intensity
float3 intensity = 0.5 * INV_PI * radiusAttenuation * light.m_rgbIntensityNits; float3 intensity = 0.5 * INV_PI * radiusAttenuation * light.m_rgbIntensityNits;
lightingData.diffuseLighting += surface.albedo * diffuse * intensity; lightingData.diffuseLighting += surface.albedo * diffuse * intensity;
lightingData.specularLighting += surface.specularF0 * specular * intensity; lightingData.specularLighting += surface.specularF0 * specularRGB * intensity;
} }
else else
{ {

@ -46,14 +46,16 @@ namespace AZ
//! Save a buffer attachment or a image attachment binded to a pass's slot to a data file. //! Save a buffer attachment or a image attachment binded to a pass's slot to a data file.
//! @param passHierarchy For finding the pass by using PassHierarchyFilter //! @param passHierarchy For finding the pass by using PassHierarchyFilter
//! @param slotName Name of the pass's slot. The attachment bound to this slot will be captured. //! @param slotName Name of the pass's slot. The attachment bound to this slot will be captured.
//! @param option Only valid for an InputOutput attachment. Use PassAttachmentReadbackOption::Input to capture the input state
//! and use PassAttachmentReadbackOption::Output to capture the output state
//! @param outputFilename The output file path. //! @param outputFilename The output file path.
virtual bool CapturePassAttachment(const AZStd::vector<AZStd::string>& passHierarchy, const AZStd::string& slotName virtual bool CapturePassAttachment(const AZStd::vector<AZStd::string>& passHierarchy, const AZStd::string& slotName
, const AZStd::string& outputFilePath) = 0; , const AZStd::string& outputFilePath, RPI::PassAttachmentReadbackOption option) = 0;
//! Similar to CapturePassAttachment. But instead of saving the read back result to a file, it will call the callback function provide //! Similar to CapturePassAttachment. But instead of saving the read back result to a file, it will call the callback function provide
//! in the input when callback is finished //! in the input when callback is finished
virtual bool CapturePassAttachmentWithCallback(const AZStd::vector<AZStd::string>& passHierarchy, const AZStd::string& slotName virtual bool CapturePassAttachmentWithCallback(const AZStd::vector<AZStd::string>& passHierarchy, const AZStd::string& slotName
, RPI::AttachmentReadback::CallbackFunction callback) = 0; , RPI::AttachmentReadback::CallbackFunction callback, RPI::PassAttachmentReadbackOption option) = 0;
}; };
using FrameCaptureRequestBus = EBus<FrameCaptureRequests>; using FrameCaptureRequestBus = EBus<FrameCaptureRequests>;

@ -343,7 +343,7 @@ namespace AZ
} }
bool FrameCaptureSystemComponent::CapturePassAttachment(const AZStd::vector<AZStd::string>& passHierarchy, const AZStd::string& slot, bool FrameCaptureSystemComponent::CapturePassAttachment(const AZStd::vector<AZStd::string>& passHierarchy, const AZStd::string& slot,
const AZStd::string& outputFilePath) const AZStd::string& outputFilePath, RPI::PassAttachmentReadbackOption option)
{ {
InitReadback(); InitReadback();
@ -376,40 +376,22 @@ namespace AZ
return false; return false;
} }
AZ::RPI::RenderPass* renderPass = azrtti_cast<AZ::RPI::RenderPass*>(foundPasses[0]); AZ::RPI::Pass* pass = foundPasses[0];
if (renderPass) if (pass->ReadbackAttachment(m_readback, Name(slot), option))
{ {
Name slotName = Name(slot); m_state = State::Pending;
AZ::RPI::PassAttachment* attachment = nullptr; m_result = FrameCaptureResult::None;
for (auto& binding : renderPass->GetAttachmentBindings()) SystemTickBus::Handler::BusConnect();
{ return true;
if (binding.m_name == slotName)
{
attachment = binding.m_attachment.get();
break;
}
}
if (attachment)
{
m_state = State::Pending;
m_result = FrameCaptureResult::None;
SystemTickBus::Handler::BusConnect();
renderPass->ReadbackAttachment(m_readback, attachment);
}
else
{
AZ_Warning("FrameCaptureSystemComponent", false, "Failed to find attachment bound to pass [%s] slot [%s]",
renderPass->GetName().GetCStr(), slotName.GetCStr());
return false;
}
} }
return true; AZ_Warning("FrameCaptureSystemComponent", false, "Failed to readback the attachment bound to pass [%s] slot [%s]", pass->GetName().GetCStr(), slot.c_str());
return false;
} }
bool FrameCaptureSystemComponent::CapturePassAttachmentWithCallback(const AZStd::vector<AZStd::string>& passHierarchy, const AZStd::string& slotName bool FrameCaptureSystemComponent::CapturePassAttachmentWithCallback(const AZStd::vector<AZStd::string>& passHierarchy, const AZStd::string& slotName
, RPI::AttachmentReadback::CallbackFunction callback) , RPI::AttachmentReadback::CallbackFunction callback, RPI::PassAttachmentReadbackOption option)
{ {
bool result = CapturePassAttachment(passHierarchy, slotName, ""); bool result = CapturePassAttachment(passHierarchy, slotName, "", option);
// Append state change to user provided call back // Append state change to user provided call back
AZ::RPI::AttachmentReadback::CallbackFunction callbackSetState = [&, callback](const AZ::RPI::AttachmentReadback::ReadbackResult& result) AZ::RPI::AttachmentReadback::CallbackFunction callbackSetState = [&, callback](const AZ::RPI::AttachmentReadback::ReadbackResult& result)

@ -36,9 +36,10 @@ namespace AZ
bool CaptureScreenshot(const AZStd::string& filePath) override; bool CaptureScreenshot(const AZStd::string& filePath) override;
bool CaptureScreenshotForWindow(const AZStd::string& filePath, AzFramework::NativeWindowHandle windowHandle) override; bool CaptureScreenshotForWindow(const AZStd::string& filePath, AzFramework::NativeWindowHandle windowHandle) override;
bool CaptureScreenshotWithPreview(const AZStd::string& outputFilePath) override; bool CaptureScreenshotWithPreview(const AZStd::string& outputFilePath) override;
bool CapturePassAttachment(const AZStd::vector<AZStd::string>& passHierarchy, const AZStd::string& slotName, const AZStd::string& outputFilePath) override; bool CapturePassAttachment(const AZStd::vector<AZStd::string>& passHierarchy, const AZStd::string& slotName, const AZStd::string& outputFilePath,
RPI::PassAttachmentReadbackOption option) override;
bool CapturePassAttachmentWithCallback(const AZStd::vector<AZStd::string>& passHierarchy, const AZStd::string& slotName bool CapturePassAttachmentWithCallback(const AZStd::vector<AZStd::string>& passHierarchy, const AZStd::string& slotName
, RPI::AttachmentReadback::CallbackFunction callback) override; , RPI::AttachmentReadback::CallbackFunction callback, RPI::PassAttachmentReadbackOption option) override;
private: private:
void CaptureAttachmentCallback(const AZ::RPI::AttachmentReadback::ReadbackResult& readbackResult); void CaptureAttachmentCallback(const AZ::RPI::AttachmentReadback::ReadbackResult& readbackResult);

@ -64,23 +64,9 @@ namespace AZ
// Set up read back attachment before children prepare // Set up read back attachment before children prepare
if (m_readback->IsReady()) if (m_readback->IsReady())
{ {
AZ::RPI::RenderPass* renderPass = azrtti_cast<AZ::RPI::RenderPass*>(m_renderTargetPass.get()); if (m_renderTargetPass)
if (renderPass)
{ {
RPI::PassAttachment* attachment = nullptr; m_attachmentReadbackComplete = m_renderTargetPass->ReadbackAttachment(m_readback, AZ::Name("RenderTargetOutput"));
for (auto& binding : renderPass->GetAttachmentBindings())
{
if (binding.m_slotType == RPI::PassSlotType::Output)
{
attachment = binding.m_attachment.get();
break;
}
}
if (attachment)
{
renderPass->ReadbackAttachment(m_readback, attachment);
m_attachmentReadbackComplete = true;
}
} }
} }
} }

@ -142,6 +142,8 @@ namespace AZ
void RayTracingPipelineState::Shutdown() void RayTracingPipelineState::Shutdown()
{ {
ShutdownInternal();
DeviceObject::Shutdown();
} }
} }
} }

@ -25,6 +25,8 @@ ly_add_target(
../Assets/atom_rpi_asset_files.cmake ../Assets/atom_rpi_asset_files.cmake
${pal_source_dir}/platform_${PAL_PLATFORM_NAME_LOWERCASE}_files.cmake ${pal_source_dir}/platform_${PAL_PLATFORM_NAME_LOWERCASE}_files.cmake
${MASKED_OCCLUSION_CULLING_FILES} ${MASKED_OCCLUSION_CULLING_FILES}
PLATFORM_INCLUDE_FILES
${CMAKE_CURRENT_LIST_DIR}/Source/Platform/Common/${PAL_TRAIT_COMPILER_ID}/atom_rpi_public_${PAL_TRAIT_COMPILER_ID_LOWERCASE}.cmake
INCLUDE_DIRECTORIES INCLUDE_DIRECTORIES
PRIVATE PRIVATE
Source Source

@ -57,6 +57,7 @@ namespace AZ
class PassTemplate; class PassTemplate;
struct PassRequest; struct PassRequest;
struct PassValidationResults; struct PassValidationResults;
class AttachmentReadback;
using SortedPipelineViewTags = AZStd::set<PipelineViewTag, AZNameSortAscending>; using SortedPipelineViewTags = AZStd::set<PipelineViewTag, AZNameSortAscending>;
using PassesByDrawList = AZStd::map<RHI::DrawListTag, const Pass*>; using PassesByDrawList = AZStd::map<RHI::DrawListTag, const Pass*>;
@ -65,7 +66,12 @@ namespace AZ
const uint32_t PassInputBindingCountMax = 16; const uint32_t PassInputBindingCountMax = 16;
const uint32_t PassInputOutputBindingCountMax = PassInputBindingCountMax; const uint32_t PassInputOutputBindingCountMax = PassInputBindingCountMax;
const uint32_t PassOutputBindingCountMax = PassInputBindingCountMax; const uint32_t PassOutputBindingCountMax = PassInputBindingCountMax;
enum class PassAttachmentReadbackOption : uint8_t
{
Input = 0,
Output
};
//! Atom's base pass class (every pass class in Atom must derive from this class). //! Atom's base pass class (every pass class in Atom must derive from this class).
//! //!
@ -222,6 +228,14 @@ namespace AZ
//! Enables/Disables PipelineStatistics queries for this pass //! Enables/Disables PipelineStatistics queries for this pass
virtual void SetPipelineStatisticsQueryEnabled(bool enable); virtual void SetPipelineStatisticsQueryEnabled(bool enable);
//! Readback an attachment attached to the specified slot name
//! @param readback The AttachmentReadback object which is used for readback. Its callback function will be called when readback is finished.
//! @param slotName The attachment bind to the slot with this slotName is to be readback
//! @param option The option is used for choosing input or output state when readback an InputOutput attachment.
//! It's ignored if the attachment isn't an InputOutput attachment.
//! Return true if the readback request was successful. User may expect the AttachmentReadback's callback function would be called.
bool ReadbackAttachment(AZStd::shared_ptr<AttachmentReadback> readback, const Name& slotName, PassAttachmentReadbackOption option = PassAttachmentReadbackOption::Output);
//! Returns whether the Timestamp queries is enabled/disabled for this pass //! Returns whether the Timestamp queries is enabled/disabled for this pass
bool IsTimestampQueryEnabled() const; bool IsTimestampQueryEnabled() const;
@ -266,7 +280,6 @@ namespace AZ
// Update output bindings on this pass that are connected to bindings on other passes // Update output bindings on this pass that are connected to bindings on other passes
void UpdateConnectedOutputBindings(); void UpdateConnectedOutputBindings();
protected: protected:
explicit Pass(const PassDescriptor& descriptor); explicit Pass(const PassDescriptor& descriptor);
@ -349,6 +362,7 @@ namespace AZ
void FrameEnd(); void FrameEnd();
virtual void FrameEndInternal() { } virtual void FrameEndInternal() { }
void UpdateReadbackAttachment(FramePrepareParams params, bool beforeAddScopes);
// --- Protected Members --- // --- Protected Members ---
@ -442,7 +456,10 @@ namespace AZ
// Sort type to be used by the default sort implementation. Passes can also provide // Sort type to be used by the default sort implementation. Passes can also provide
// fully custom sort implementations by overriding the SortDrawList() function. // fully custom sort implementations by overriding the SortDrawList() function.
RHI::DrawListSortType m_drawListSortType = RHI::DrawListSortType::KeyThenDepth; RHI::DrawListSortType m_drawListSortType = RHI::DrawListSortType::KeyThenDepth;
// For read back attachment
AZStd::shared_ptr<AttachmentReadback> m_attachmentReadback;
PassAttachmentReadbackOption m_readbackOption;
private: private:
// Return the Timestamp result of this pass // Return the Timestamp result of this pass

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save