Merge branch 'stabilization/2106' of https://github.com/o3de/o3de into carlitosan/thecleansing

main
chcurran 5 years ago
commit 76d959dccf

@ -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,16 +1,12 @@
{ {
"GemFormatVersion": 4, "gem_name": "AutomatedTesting",
"Uuid": "afc25e1593194d6283d9ff744ab6d5a1", "display_name": "AutomatedTesting",
"Name": "AutomatedTesting", "license": "Apache-2.0 Or MIT",
"DisplayName": "AutomatedTesting", "origin": "Amazon Web Services, Inc.",
"Version": "0.1.0", "type": "Code",
"Summary": "A short description of my Gem.", "summary": "Project Gem for customizing the AutomatedTesting project functionality.",
"Tags": ["Game"], "canonical_tags": ["Gem"],
"IconPath": "preview.png", "user_tags": [],
"IsGameGem": true, "icon_path": "preview.png",
"Modules": [ "requirements": ""
{
"Type": "GameModule"
}
]
} }

@ -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();

@ -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)

@ -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)

@ -1289,6 +1289,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>
@ -383,7 +383,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>
@ -457,6 +457,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>

@ -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()

@ -648,10 +648,10 @@ namespace O3DE::ProjectManager
gemInfo.m_name = Py_To_String(data["gem_name"]); gemInfo.m_name = Py_To_String(data["gem_name"]);
// optional // optional
gemInfo.m_displayName = Py_To_String_Optional(data, "DisplayName", gemInfo.m_name); gemInfo.m_displayName = Py_To_String_Optional(data, "display_name", gemInfo.m_name);
gemInfo.m_summary = Py_To_String_Optional(data, "Summary", ""); gemInfo.m_summary = Py_To_String_Optional(data, "summary", "");
gemInfo.m_version = Py_To_String_Optional(data, "Version", ""); gemInfo.m_version = "";
gemInfo.m_requirement = Py_To_String_Optional(data, "Requirements", ""); gemInfo.m_requirement = Py_To_String_Optional(data, "requirements", "");
gemInfo.m_creator = Py_To_String_Optional(data, "origin", ""); gemInfo.m_creator = Py_To_String_Optional(data, "origin", "");
if (gemInfo.m_creator.contains("Open 3D Engine")) if (gemInfo.m_creator.contains("Open 3D Engine"))
@ -659,13 +659,27 @@ namespace O3DE::ProjectManager
gemInfo.m_gemOrigin = GemInfo::GemOrigin::Open3DEEngine; gemInfo.m_gemOrigin = GemInfo::GemOrigin::Open3DEEngine;
} }
if (data.contains("Tags")) if (data.contains("user_tags"))
{ {
for (auto tag : data["Tags"]) for (auto tag : data["user_tags"])
{ {
gemInfo.m_features.push_back(Py_To_String(tag)); gemInfo.m_features.push_back(Py_To_String(tag));
} }
} }
QString gemType = Py_To_String_Optional(data, "type", "");
if (gemType == "Asset")
{
gemInfo.m_types |= GemInfo::Type::Asset;
}
if (gemType == "Code")
{
gemInfo.m_types |= GemInfo::Type::Code;
}
if (gemType == "Tool")
{
gemInfo.m_types |= GemInfo::Type::Tool;
}
} }
catch ([[maybe_unused]] const std::exception& e) catch ([[maybe_unused]] const std::exception& e)
{ {

@ -1,12 +1,12 @@
{ {
"gem_name": "AWSClientAuth", "gem_name": "AWSClientAuth",
"GemFormatVersion": 3, "display_name": "AWS Client Authorization",
"Uuid": "c74f2756f5874c0d8d29646dfc9cb0ad", "license": "Apache-2.0 Or MIT",
"Name": "AWSClientAuth", "origin": "Amazon Web Services, Inc.",
"DisplayName": "AWS Client Auth", "type": "Code",
"Version": "0.1.0", "summary": "AWS Client Auth provides client authentication and AWS authorization solution.",
"LinkType": "Dynamic", "canonical_tags": ["Gem"],
"Summary": "AWS Client Auth provides client authentication and AWS authorization solution", "user_tags": ["AWS", "Network", "SDK"],
"Tags": ["AWS", "Amazon Cognito", "Authentication", "Authorization"], "icon_path": "preview.png",
"IconPath": "preview.png" "requirements": ""
} }

@ -1,18 +1,12 @@
{ {
"gem_name": "AWSCore", "gem_name": "AWSCore",
"GemFormatVersion": 4, "display_name": "AWS Core",
"Uuid": "c3710872891c4401b0cbdabfca066cb5", "license": "Apache-2.0 Or MIT",
"Name": "AWSCore", "origin": "Amazon Web Services, Inc.",
"DisplayName": "AWS Core", "type": "Code",
"Version": "0.1.0", "summary": "The AWS Core Gem provides basic shared AWS functionality such as AWS SDK initialization and client configuration, and is automatically added when selecting any AWS feature Gem.",
"LinkType": "Dynamic", "canonical_tags": ["Gem"],
"Summary": "This Gem is automatically enabled when selecting any of the AWS Feature Gems. It provides basic shared functionalities such as AWS SDK initialization and client configuration.", "user_tags": ["AWS", "Network", "SDK"],
"Tags": [ "icon_path": "preview.png",
"AWS", "requirements": ""
"API",
"AWSCore",
"Cloud",
"Connected"
],
"IconPath": "preview.png"
} }

@ -1,16 +1,12 @@
{ {
"gem_name": "AWSMetrics", "gem_name": "AWSMetrics",
"GemFormatVersion": 4, "display_name": "AWS Metrics",
"Uuid": "cc6fc7a18fc047039a369a26100fcbbe", "license": "Apache-2.0 Or MIT",
"Name": "AWSMetrics", "origin": "Amazon Web Services, Inc.",
"DisplayName": "AWS Metrics", "type": "Code",
"Version": "0.1.0", "summary": "The AWS Metrics Gem provides a solution for AWS metrics submission and analytics.",
"LinkType": "Dynamic", "canonical_tags": ["Gem"],
"Summary": "AWS Metrics provides metrics submission and analytics solution.", "user_tags": ["AWS", "Network", "SDK"],
"Tags": [ "icon_path": "preview.png",
"AWS", "requirements": ""
"AWSMetrics",
"Cloud"
],
"IconPath": "preview.png"
} }

@ -1,16 +1,12 @@
{ {
"gem_name": "Achievements", "gem_name": "Achievements",
"GemFormatVersion": 4, "display_name": "Achievements",
"Uuid": "6f8d953dd4fc4bb6ad34c9118a7b789f", "license": "Apache-2.0 Or MIT",
"Name": "Achievements", "origin": "Open 3D Engine - o3de.org",
"DisplayName": "Achievements", "type": "Code",
"Version": "0.1.0", "summary": "The Achievements Gem provides a target platform agnostic interface for retrieving achievement details and unlocking achievements.",
"Summary": "Platform agnostic interface for retrieving achievement details and unlocking achievements.", "canonical_tags": ["Gem"],
"Tags": ["Achievement", "Achievements", "Trophy", "Trophies"], "user_tags": ["Gameplay", "Achievements"],
"IconPath": "preview.png", "icon_path": "preview.png",
"Modules": [ "requirements": ""
{
"Type": "GameModule"
}
]
} }

@ -1,25 +1,12 @@
{ {
"gem_name": "AssetMemoryAnalyzer", "gem_name": "AssetMemoryAnalyzer",
"GemFormatVersion": 4, "display_name": "Asset Memory Analyzer",
"Uuid": "35414634480a4d4c8412c60fe62f4c81", "license": "Apache-2.0 Or MIT",
"Name": "AssetMemoryAnalyzer", "origin": "Open 3D Engine - o3de.org",
"DisplayName": "AssetMemoryAnalyzer", "type": "Code",
"Version": "0.1.0", "summary": "The Asset Memory Analyzer Gem provides tools to profile asset memory usage in Open 3D Engine through ImGUI (Immediate Mode Graphical User Interface).",
"Summary": "Provides debug visualization of the AssetMemoryDriller to show how individual assets are consuming memory.", "canonical_tags": ["Gem"],
"Tags": ["debug"], "user_tags": ["Debug", "Utillity", "Tools"],
"IconPath": "preview.png", "icon_path": "preview.png",
"Modules": [ "requirements": ""
{
"Type": "GameModule"
}
],
"Dependencies": [
{
"Uuid": "bab8807a1bc646b3909f3cc200ffeedf",
"VersionConstraints": [
"~>0.1"
],
"_comment": "ImGui GEM"
}
]
} }

@ -1,16 +1,12 @@
{ {
"gem_name": "AssetValidation", "gem_name": "AssetValidation",
"GemFormatVersion": 4, "display_name": "Asset Validation",
"Uuid": "5a5c3c10b91d4b4ea8baef474c5b5d49", "license": "Apache-2.0 Or MIT",
"Name": "AssetValidation", "origin": "Open 3D Engine - o3de.org",
"DisplayName": "AssetValidation", "type": "Code",
"Version": "0.1.0", "summary": "The Asset Validation Gem provides seed-related commands to ensure assets have valid seeds for asset bundling.",
"Summary": "Tools for managing your assets and their dependencies during development", "canonical_tags": ["Gem"],
"Tags": ["Untagged"], "user_tags": ["Assets", "Utility", "Scripting"],
"IconPath": "preview.png", "icon_path": "preview.png",
"Modules": [ "requirements": ""
{
"Type": "GameModule"
}
]
} }

@ -1,10 +1,14 @@
{ {
"gem_name": "ImageProcessingAtom", "gem_name": "ImageProcessingAtom",
"display_name": "Atom Image Processing", "display_name": "Atom Image Processing",
"license": "Apache-2.0 Or MIT",
"origin": "Open 3D Engine - o3de.org",
"type": "Code",
"summary": "", "summary": "",
"canonical_tags": [ "canonical_tags": [
"Gem" "Gem"
], ],
"user_tags": [ "user_tags": [
] ],
"requirements": ""
} }

@ -1,10 +1,14 @@
{ {
"gem_name": "AtomShader", "gem_name": "AtomShader",
"display_name": "Atom Shader Builder", "display_name": "Atom Shader Builder",
"license": "Apache-2.0 Or MIT",
"origin": "Open 3D Engine - o3de.org",
"type": "Code",
"summary": "", "summary": "",
"canonical_tags": [ "canonical_tags": [
"Gem" "Gem"
], ],
"user_tags": [ "user_tags": [
] ],
"requirements": ""
} }

@ -1,10 +1,14 @@
{ {
"gem_name": "Atom_Bootstrap", "gem_name": "Atom_Bootstrap",
"display_name": "Atom Bootstrap", "display_name": "Atom Bootstrap",
"license": "Apache-2.0 Or MIT",
"origin": "Open 3D Engine - o3de.org",
"type": "Code",
"summary": "", "summary": "",
"canonical_tags": [ "canonical_tags": [
"Gem" "Gem"
], ],
"user_tags": [ "user_tags": [
] ],
"requirements": ""
} }

@ -1,10 +1,14 @@
{ {
"gem_name": "Atom_Component_DebugCamera", "gem_name": "Atom_Component_DebugCamera",
"display_name": "Atom Debug Camera Component", "display_name": "Atom Debug Camera Component",
"license": "Apache-2.0 Or MIT",
"origin": "Open 3D Engine - o3de.org",
"type": "Code",
"summary": "", "summary": "",
"canonical_tags": [ "canonical_tags": [
"Gem" "Gem"
], ],
"user_tags": [ "user_tags": [
] ],
"requirements": ""
} }

@ -80,14 +80,48 @@ 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 theta_sinTheta = 0.0;
if (cosTheta > 0.0)
{
float absCosTheta = abs(cosTheta);
theta_sinTheta = 1.5708 + (-0.879406 + 0.308609 * absCosTheta) * absCosTheta;
}
else
{
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 +223,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); if (vertexCount > 3)
// visibility check
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 +329,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 +401,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 +440,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 +485,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 +498,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 +507,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
{ {

@ -1,10 +1,14 @@
{ {
"gem_name": "Atom_Feature_Common", "gem_name": "Atom_Feature_Common",
"display_name": "Atom Feature Common", "display_name": "Atom Feature Common",
"license": "Apache-2.0 Or MIT",
"origin": "Open 3D Engine - o3de.org",
"type": "Code",
"summary": "", "summary": "",
"canonical_tags": [ "canonical_tags": [
"Gem" "Gem"
], ],
"user_tags": [ "user_tags": [
] ],
"requirements": ""
} }

@ -1,10 +1,14 @@
{ {
"gem_name": "Atom_RHI_DX12", "gem_name": "Atom_RHI_DX12",
"display_name": "Atom RHI DX12", "display_name": "Atom RHI DX12",
"license": "Apache-2.0 Or MIT",
"origin": "Open 3D Engine - o3de.org",
"type": "Code",
"summary": "", "summary": "",
"canonical_tags": [ "canonical_tags": [
"Gem" "Gem"
], ],
"user_tags": [ "user_tags": [
] ],
"requirements": ""
} }

@ -1,10 +1,14 @@
{ {
"gem_name": "Atom_RHI_Metal", "gem_name": "Atom_RHI_Metal",
"display_name": "Atom RHI Metal", "display_name": "Atom RHI Metal",
"license": "Apache-2.0 Or MIT",
"origin": "Open 3D Engine - o3de.org",
"type": "Code",
"summary": "", "summary": "",
"canonical_tags": [ "canonical_tags": [
"Gem" "Gem"
], ],
"user_tags": [ "user_tags": [
] ],
"requirements": ""
} }

@ -1,10 +1,14 @@
{ {
"gem_name": "Atom_RHI_Null", "gem_name": "Atom_RHI_Null",
"display_name": "Atom RHI Null", "display_name": "Atom RHI Null",
"license": "Apache-2.0 Or MIT",
"origin": "Open 3D Engine - o3de.org",
"type": "Code",
"summary": "", "summary": "",
"canonical_tags": [ "canonical_tags": [
"Gem" "Gem"
], ],
"user_tags": [ "user_tags": [
] ],
"requirements": ""
} }

@ -1,10 +1,14 @@
{ {
"gem_name": "Atom_RHI_Vulkan", "gem_name": "Atom_RHI_Vulkan",
"display_name": "Atom RHI Vulkan", "display_name": "Atom RHI Vulkan",
"license": "Apache-2.0 Or MIT",
"origin": "Open 3D Engine - o3de.org",
"type": "Code",
"summary": "", "summary": "",
"canonical_tags": [ "canonical_tags": [
"Gem" "Gem"
], ],
"user_tags": [ "user_tags": [
] ],
"requirements": ""
} }

@ -1,10 +1,14 @@
{ {
"gem_name": "Atom_RHI", "gem_name": "Atom_RHI",
"display_name": "Atom RHI", "display_name": "Atom RHI",
"license": "Apache-2.0 Or MIT",
"origin": "Open 3D Engine - o3de.org",
"type": "Code",
"summary": "", "summary": "",
"canonical_tags": [ "canonical_tags": [
"Gem" "Gem"
], ],
"user_tags": [ "user_tags": [
] ],
"requirements": ""
} }

@ -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

@ -65,9 +65,15 @@ namespace AZ
ConstViewPtr GetDefaultView() const; ConstViewPtr GetDefaultView() const;
//! Gets the current size of the viewport. //! Gets the current size of the viewport.
//! This value is cached and updated on-demand, so may be efficiently queried.
AzFramework::WindowSize GetViewportSize() const; AzFramework::WindowSize GetViewportSize() const;
// SceneNotificationBus interface //! Gets the screen DPI scaling factor.
//! This value is cached and updated on-demand, so may be efficiently queried.
//! \see AzFramework::WindowRequests::GetDpiScaleFactor
float GetDpiScalingFactor() const;
// SceneNotificationBus interface overrides...
//! Ensures our default view remains set when our scene's render pipelines are modified. //! Ensures our default view remains set when our scene's render pipelines are modified.
void OnRenderPipelineAdded(RenderPipelinePtr pipeline) override; void OnRenderPipelineAdded(RenderPipelinePtr pipeline) override;
//! Ensures our default view remains set when our scene's render pipelines are modified. //! Ensures our default view remains set when our scene's render pipelines are modified.
@ -75,15 +81,22 @@ namespace AZ
//! OnBeginPrepareRender is forwarded to our RenderTick notification to allow subscribers to do rendering. //! OnBeginPrepareRender is forwarded to our RenderTick notification to allow subscribers to do rendering.
void OnBeginPrepareRender() override; void OnBeginPrepareRender() override;
//WindowNotificationBus interface // WindowNotificationBus interface overrides...
//! Used to fire a notification when our window resizes //! Used to fire a notification when our window resizes.
void OnWindowResized(uint32_t width, uint32_t height) override; void OnWindowResized(uint32_t width, uint32_t height) override;
//! Used to fire a notification when our window DPI changes.
void OnDpiScaleFactorChanged(float dpiScaleFactor) override;
using SizeChangedEvent = AZ::Event<AzFramework::WindowSize>; using SizeChangedEvent = AZ::Event<AzFramework::WindowSize>;
//! Notifies consumers when the viewport size has changed. //! Notifies consumers when the viewport size has changed.
//! Alternatively, connect to ViewportContextNotificationsBus and listen to ViewportContextNotifications::OnViewportSizeChanged. //! Alternatively, connect to ViewportContextNotificationsBus and listen to ViewportContextNotifications::OnViewportSizeChanged.
void ConnectSizeChangedHandler(SizeChangedEvent::Handler& handler); void ConnectSizeChangedHandler(SizeChangedEvent::Handler& handler);
using ScalarChangedEvent = AZ::Event<float>;
//! Notifies consumers when the viewport DPI scaling ratio has changed.
//! Alternatively, connect to ViewportContextNotificationsBus and listen to ViewportContextNotifications::OnViewportDpiScalingChanged.
void ConnectDpiScalingFactorChangedHandler(ScalarChangedEvent::Handler& handler);
using MatrixChangedEvent = AZ::Event<const AZ::Matrix4x4&>; using MatrixChangedEvent = AZ::Event<const AZ::Matrix4x4&>;
//! Notifies consumers when the view matrix has changed. //! Notifies consumers when the view matrix has changed.
void ConnectViewMatrixChangedHandler(MatrixChangedEvent::Handler& handler); void ConnectViewMatrixChangedHandler(MatrixChangedEvent::Handler& handler);
@ -106,7 +119,7 @@ namespace AZ
//! Notifies consumers when this ViewportContext is about to be destroyed. //! Notifies consumers when this ViewportContext is about to be destroyed.
void ConnectAboutToBeDestroyedHandler(ViewportIdEvent::Handler& handler); void ConnectAboutToBeDestroyedHandler(ViewportIdEvent::Handler& handler);
// ViewportRequestBus interface // ViewportRequestBus interface overrides...
//! Gets the current camera's view matrix. //! Gets the current camera's view matrix.
const AZ::Matrix4x4& GetCameraViewMatrix() const override; const AZ::Matrix4x4& GetCameraViewMatrix() const override;
//! Sets the current camera's view matrix. //! Sets the current camera's view matrix.
@ -130,8 +143,10 @@ namespace AZ
WindowContextSharedPtr m_windowContext; WindowContextSharedPtr m_windowContext;
ViewPtr m_defaultView; ViewPtr m_defaultView;
AzFramework::WindowSize m_viewportSize; AzFramework::WindowSize m_viewportSize;
float m_viewportDpiScaleFactor = 1.0f;
SizeChangedEvent m_sizeChangedEvent; SizeChangedEvent m_sizeChangedEvent;
ScalarChangedEvent m_dpiScalingFactorChangedEvent;
MatrixChangedEvent m_viewMatrixChangedEvent; MatrixChangedEvent m_viewMatrixChangedEvent;
MatrixChangedEvent::Handler m_onViewMatrixChangedHandler; MatrixChangedEvent::Handler m_onViewMatrixChangedHandler;
MatrixChangedEvent m_projectionMatrixChangedEvent; MatrixChangedEvent m_projectionMatrixChangedEvent;

@ -105,8 +105,10 @@ namespace AZ
class ViewportContextNotifications class ViewportContextNotifications
{ {
public: public:
//! Called when the underlying native window size changes for a given viewport context name. //! Called when the underlying native window size changes for a given viewport context.
virtual void OnViewportSizeChanged(AzFramework::WindowSize size){AZ_UNUSED(size);} virtual void OnViewportSizeChanged(AzFramework::WindowSize size){AZ_UNUSED(size);}
//! Called when the window DPI scaling changes for a given viewport context.
virtual void OnViewportDpiScalingChanged(float dpiScale){AZ_UNUSED(dpiScale);}
//! Called when the active view for a given viewport context name changes. //! Called when the active view for a given viewport context name changes.
virtual void OnViewportDefaultViewChanged(AZ::RPI::ViewPtr view){AZ_UNUSED(view);} virtual void OnViewportDefaultViewChanged(AZ::RPI::ViewPtr view){AZ_UNUSED(view);}
//! Called when the viewport is to be rendered. //! Called when the viewport is to be rendered.

@ -51,6 +51,7 @@ namespace AZ
{ {
AZStd::weak_ptr<ViewportContext> context; AZStd::weak_ptr<ViewportContext> context;
ViewportContext::SizeChangedEvent::Handler sizeChangedHandler; ViewportContext::SizeChangedEvent::Handler sizeChangedHandler;
ViewportContext::ScalarChangedEvent::Handler dpiScalingChangedHandler;
}; };
// ViewportContextManager is a singleton owned solely by RPISystem, which is tagged as a friend // ViewportContextManager is a singleton owned solely by RPISystem, which is tagged as a friend

@ -0,0 +1,18 @@
#
# Copyright (c) Contributors to the Open 3D Engine Project. For complete copyright and license terms please see the LICENSE at the root of this distribution.
#
# SPDX-License-Identifier: Apache-2.0 OR MIT
#
#
ly_add_source_properties(
SOURCES External/MaskedOcclusionCulling/MaskedOcclusionCullingAVX2.cpp
PROPERTY COMPILE_OPTIONS
VALUES -mavx2 -mfma -msse4.1
)
ly_add_source_properties(
SOURCES External/MaskedOcclusionCulling/MaskedOcclusionCulling.cpp
PROPERTY COMPILE_OPTIONS
VALUES -mno-avx
)

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

Loading…
Cancel
Save