Merge remote-tracking branch 'upstream/development' into nvsickle/OutlinerDuplicateEntryFixes
This commit is contained in:
@@ -64,30 +64,6 @@
|
|||||||
<Class name="unsigned int" field="platformFlags" value="255" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
<Class name="unsigned int" field="platformFlags" value="255" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||||
<Class name="AZStd::string" field="pathHint" value="config/sketch_on.cfg" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
<Class name="AZStd::string" field="pathHint" value="config/sketch_on.cfg" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||||
</Class>
|
</Class>
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{16983926-6160-5935-853E-641C8BBCFA1B}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/codecoverage/hit.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{914896F1-D4A3-5550-9676-8B2D48443335}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/codecoverage/pbar.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{0E4737A6-2B5C-57DB-A0FC-38C2F84D970A}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/codecoverage/unexpected.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
||||||
<Class name="AZ::Uuid" field="guid" value="{34B60E74-28FA-57C4-9A2E-77515A083AC5}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
<Class name="AZ::Uuid" field="guid" value="{34B60E74-28FA-57C4-9A2E-77515A083AC5}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
||||||
@@ -160,686 +136,6 @@
|
|||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/icons/streamingterrain.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
<Class name="AZStd::string" field="pathHint" value="engineassets/icons/streamingterrain.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||||
</Class>
|
</Class>
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{F0A47991-AE9A-5E6B-9B4B-0993FC73BB8D}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/materials/fog/fogvolumebox.mtl" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{E2D5810A-A0A8-559D-813F-ED37F1660379}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/materials/fog/fogvolumeellipsoid.mtl" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{210E4B54-63B7-5F30-81B9-39371B298723}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/materials/fog/oceaninto.mtl" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{2C991928-0414-5CD8-BA07-CDBD57E9E5C1}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/materials/fog/oceanintolowspec.mtl" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{EA10CCB0-79E7-51E2-9585-B31B61716855}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/materials/fog/oceanoutof.mtl" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{E53D792D-A41F-54C2-AA9B-1609A5467588}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/materials/fog/oceanoutoflowspec.mtl" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{575105B0-7184-513D-966F-7932B52A24B6}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/materials/fog/waterfogvolumeinto.mtl" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{2119F7D0-5555-5A8E-8D4F-48225AA3C012}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/materials/fog/waterfogvolumeoutof.mtl" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{D4E71967-FCEA-516E-9DB5-96595569A4AB}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/materials/physproxytoobig.mtl" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{EEE06764-1F83-59BE-8611-102F21B77076}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/materials/sky/sky.mtl" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{923F707E-9CE8-5B65-BB53-72AFB91B4165}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/materials/water/ocean_default.mtl" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{359148BF-8B82-51CE-8919-EB6E79A25596}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/materials/water/wateroceanbottom.mtl" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{04EF85E7-D3F5-5359-A52E-C59566B79C4F}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/screenspace/areatex.dds.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{60736D16-139A-5623-A49F-E33C91878CC5}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/screenspace/film_grain.dds.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{1AA9E7E9-6723-5394-88DA-04E9A1CAE19D}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/screenspace/grain_bayer_mul.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{C47FD879-9E9D-5FED-A771-AA5DD3FBA1EB}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/screenspace/normalsfitting.dds.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{28ABA702-99F9-5B40-84EC-E297D0FB7BCC}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/screenspace/pointsonsphere4x4.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{41E565F8-E384-5C8B-B34B-494A93FC4A15}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/screenspace/pointsonspherevo4x4.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{90B77841-601D-5CE3-9631-F4219CB561AC}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/screenspace/searchtex.dds.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{52162CD3-1245-5BF8-923F-E8CEC547B227}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="3000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/shading/defaultprobe_cm_ibldiffuse.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{52162CD3-1245-5BF8-923F-E8CEC547B227}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="2000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/shading/defaultprobe_cm_iblspecular.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{AFB81122-E810-5940-8C5C-BFC0E1BA0875}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/shading/environmentbrdf.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{A0F3C5F3-4D9C-5B27-A8D0-9DD98108B0C2}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/shading/vignetting.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{5B87AD56-9EF7-5750-805D-76AC1C950D63}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/shading/waterfoam.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{4DFDF390-CC32-5BE8-BFAC-3BC65DC9E0E4}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="255" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/sky/optical.lut" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{687C2588-8B67-57B6-BEB5-3D29143A624F}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="255" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/sky/stars.dat" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{2D05A7E1-9A9D-593E-B1BE-ACFF1799FBBC}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/texturemsg/defaultsolids_diff.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{493ACDCA-0393-5225-B48A-E355516F5E09}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/texturemsg/rcerror.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{B68E2732-F748-51C3-95BE-4D66073866A4}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/texturemsg/rcerror_a.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{F74A817C-8493-556B-9C5E-9C55B2A6541C}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="3000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/texturemsg/rcerror_cm_ibldiffuse.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{F74A817C-8493-556B-9C5E-9C55B2A6541C}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="2000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/texturemsg/rcerror_cm_iblspecular.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{9A531C9D-0F6E-5FF4-B853-2BA03994054D}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/texturemsg/rcerror_ddn.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{6A4CA27C-E194-5954-888C-F470924B8C9E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/texturemsg/rcerror_ddna.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{78C64FA5-267D-543F-87DC-8ACBA422B697}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/texturemsg/replacemecm.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{76C3ABD1-97B1-5010-8732-27469D27783A}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/texturemsg/replacemerelease.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{45CF823D-491D-5C86-A1D1-E96F9B54BA5E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/texturemsg/shadercompiling.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{5AD90C79-0820-5667-98BA-3B81E8D8316E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/texturemsg/shadererror.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{30636215-C650-5FB5-97C3-DE456AF8B444}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/textures/black.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{BA504C07-4568-51E8-AD95-41C6CAAABE71}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/textures/blackalpha.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{FA447D02-C5E2-5688-AD42-839E03DF92FB}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/textures/blackcm.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{826DFAB8-AEA4-503C-A5DE-CC31100D5D2D}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/textures/caustics_sampler.dds.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{A09C44AE-E326-5987-9200-00E18C24BAE4}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/textures/default_cch.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{80E55B1C-5970-55BA-859C-5650C1B63BA8}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/textures/flares/ghost_grey.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{DB73764D-3DCF-5CEE-BAF4-D4587CB14383}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/textures/flares/icons/ghost.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{D5B8AC4E-5738-5573-BA28-8202D3CB00BA}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/textures/flares/icons/glow.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{1616B1E9-CC73-5F2B-8231-6C7F715E6123}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/textures/flares/icons/iris_shafts.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{C8259FF1-D83A-59D0-A011-2A05720C9E48}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/textures/flares/icons/multi_ghost.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{13B4A9B8-8ED5-59BE-897C-CF457E645B85}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/textures/flares/icons/orbs.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{573682BF-D4EC-5F4D-ADC8-CA9155A84537}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/textures/flares/icons/ring.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{7A71C338-1EFF-5F32-B24D-638C330172AB}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/textures/flares/icons/vol_shafts.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{6DE56C27-13DD-5E06-A39C-51AA74368239}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/textures/flares/iris_shaft.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{8E964EB9-9199-5FDE-B430-CBC06F1D036B}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/textures/flares/lens_dirtyglass.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{5F65364B-29BC-5952-B19B-63E4413251D0}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/textures/flares/orb_01.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{07FFB096-FE13-50F9-8D1A-136AF06A788A}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/textures/flares/spectrum_full.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{273044AE-6D8E-5BF9-AB52-27C56794DDDC}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/textures/fogvolshadowjitter.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{A57190FB-D213-523D-B0E3-80071CF8671B}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/textures/frozen/frost_noise3.dds.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{9BCC8F01-F26E-50DC-BFEF-FB8BC9B5CDD0}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/textures/frozen/frost_noise4.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{F0645175-9ED4-5955-B382-E8B286EE272D}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/textures/frozen/snow_spatter.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{72118AD3-BFE6-5DB1-B54F-565C213EC097}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/textures/glass_decalatlas_ddn.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{A45AFFA5-085F-5FC8-BA00-0D312894CE74}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/textures/glass_decalatlas_diff.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{D1C27431-940A-5503-BC7D-24A02624954F}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/textures/grey.dds.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{91871647-CCA0-5770-BFD1-D18DA323D766}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/textures/jumpnoisehighfrequency_x27y19.dds.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{2E988455-2098-589B-A851-9F3E06931E7B}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/textures/noise3d.dds.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{01FC0C22-A53C-52A0-905F-C6116987CA7B}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/textures/noise.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{CE0D25F5-09B2-58BF-B402-0D2B57CDE94C}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/textures/oceanwaves_ddn.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{44018EF7-DE41-5B2F-ADE1-559A765267C4}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/textures/palletteinst.dds.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{957B791A-EEC4-5FCA-BBB1-65BA19A7414F}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/textures/perlinnoise2d.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{CCF2215B-CA7B-52E6-984A-02A1A08C8752}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/textures/perlinnoise_sum.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{0AD39162-29A6-5E35-B7D6-486187979ED7}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/textures/perlinnoisederivatives.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{BC788487-7231-5685-A1D3-B99669088633}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/textures/perlinnoisenormal_ddn.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{1186F215-63F9-5C9E-BBAE-48A803D0818A}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/textures/pixeltex.dds.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{839CAA27-2D14-5B0F-8156-5A9A79CF0A33}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/textures/rotrandomcm.dds.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{62ADE3EE-022B-5729-B614-8F1960FC72BD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/textures/screen_noisy_bump.dds.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{35DB3C74-85EC-5F8C-A729-160126F53AA3}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/textures/screenfrost_alpha.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{78836DF3-C8DE-538D-9CE8-3ACDB8B58D90}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/textures/screenfrost_ddn.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{DD7CD22E-5686-5349-8D9D-35B8ED7FEADF}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/textures/snowflakes.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{128F4EA1-6CC2-5B5C-BA7C-B6ED96F417AC}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/textures/startscreen.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{0D08102C-D5B0-5EEA-8FE5-50CB48384E2C}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/textures/texelspermetergrad.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{9D76262A-B907-569D-828C-D1BA03DE4919}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/textures/user_tex1.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{8ACBE475-82F1-52B6-B151-2F782D10AE88}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/textures/user_tex2.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{9E9D05D2-C69B-584F-B567-54E0BBDB6D93}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/textures/vector_noise.dds.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{BCBE61E6-CB5D-5EC8-9969-6BEE9D855F3D}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/textures/water_droplets.dds.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{CA7B4C82-B514-58C7-A67D-B4ED5053E5C8}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/textures/water_gloss.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{8AE9BA46-862B-5F85-94FD-F1C407B842A9}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/textures/white.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{D0A2B3B2-5C08-5F0D-A291-C49959B8E502}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/textures/white_ddn.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
||||||
<Class name="AZ::Uuid" field="guid" value="{E03A8D59-7F4C-5C84-9D05-339A65C65E2C}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
<Class name="AZ::Uuid" field="guid" value="{E03A8D59-7F4C-5C84-9D05-339A65C65E2C}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
||||||
@@ -1384,166 +680,6 @@
|
|||||||
<Class name="unsigned int" field="platformFlags" value="255" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
<Class name="unsigned int" field="platformFlags" value="255" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||||
<Class name="AZStd::string" field="pathHint" value="config/spec/pc_veryhigh.cfg" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
<Class name="AZStd::string" field="pathHint" value="config/spec/pc_veryhigh.cfg" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||||
</Class>
|
</Class>
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{7C8D5984-4282-5A7A-8F1A-128FB539DFB6}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/texturemsg/color_blue.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{31261B2C-C26D-5FB0-BAE2-D26FB2075E70}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/texturemsg/color_cyan.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{A5C4E720-A3C7-5C65-BD8B-DDD9505945FD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/texturemsg/color_green.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{FAB14BE8-A5E6-5B2D-AAC8-E797951A37D4}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/texturemsg/color_magenta.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{6054B7C8-859D-50B6-9D0B-5F9BAC91A71C}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/texturemsg/color_orange.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{69073C24-F9FC-5B2C-BFD1-983ECC76D9A3}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/texturemsg/color_purple.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{AB3993B7-F89B-5C86-AFF9-452584B99CA5}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/texturemsg/color_red.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{DA13AE0E-68E0-5FA3-B335-F3209883B49B}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/texturemsg/color_white.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{141C2C7F-AEB2-5121-90D6-807525B168CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/texturemsg/color_yellow.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{7E73949E-1D79-5B3A-B787-4F098344C26A}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/texturemsg/mipmapdebug.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{10DCCDD1-60FC-566B-9DE4-936C9DDE01D3}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/texturemsg/replaceme.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{69015F42-750A-53A2-9D10-B4A22D064DE7}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/texturemsg/texturecompiling.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{B2D65572-A209-5222-AAEB-903220636818}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/texturemsg/texturecompiling_a.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{CFED46A4-83E7-5616-B3BB-4BB218927804}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="3000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/texturemsg/texturecompiling_cm_ibldiffuse.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{CFED46A4-83E7-5616-B3BB-4BB218927804}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="2000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/texturemsg/texturecompiling_cm_iblspecular.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{254812AC-7A00-5FEE-B9ED-6E181E1F6408}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/texturemsg/texturecompiling_ddn.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{2873AD02-367D-520B-8D79-58BF25328AF7}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/texturemsg/texturecompiling_ddna.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{6A04254A-BA1A-5392-B5CC-8585CBB189A6}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/textures/greyalpha.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{1213DEB1-FC2B-566A-86AA-E82D93D8AE2F}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/materials/lens_optics.mtl" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{6E4F82A0-0C23-578B-B68F-C071F136B2AE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/objects/helper.mtl" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
||||||
<Class name="AZ::Uuid" field="guid" value="{A8970A25-5043-5519-A927-F180E7D6E8C1}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
<Class name="AZ::Uuid" field="guid" value="{A8970A25-5043-5519-A927-F180E7D6E8C1}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
||||||
@@ -1632,46 +768,6 @@
|
|||||||
<Class name="unsigned int" field="platformFlags" value="255" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
<Class name="unsigned int" field="platformFlags" value="255" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||||
<Class name="AZStd::string" field="pathHint" value="engine_dependencies.xml" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
<Class name="AZStd::string" field="pathHint" value="engine_dependencies.xml" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||||
</Class>
|
</Class>
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{3B3997AF-DDB9-5E52-877D-90C72F2E53EE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/textures/defaults/16_5.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{099C5359-AEE0-5158-BBFD-36D3E3C552BD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/textures/defaults/16_34.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{AD8E4A1C-BD52-5480-911E-E351EA75DF5B}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/textures/defaults/16_12.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{E0C71739-AA65-56B4-8D0D-388C853CAE33}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/texturemsg/notfound.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
|
||||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
|
||||||
<Class name="AZ::Uuid" field="guid" value="{16A565B6-FF97-5C0E-A455-58E0D329DA55}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
|
||||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
</Class>
|
|
||||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
|
||||||
<Class name="AZStd::string" field="pathHint" value="engineassets/texturemsg/notfound_ddna.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
|
||||||
</Class>
|
|
||||||
</Class>
|
</Class>
|
||||||
</ObjectStream>
|
</ObjectStream>
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
<EngineDependencies versionnumber="1.0.0">
|
<EngineDependencies versionnumber="1.0.0">
|
||||||
<Dependency path="libs/particles/preloadlibs.txt" optional="true" />
|
<Dependency path="libs/particles/preloadlibs.txt" optional="true" />
|
||||||
<Dependency path="libs/gameaudio/wwise/*.xml" optional="false" />
|
<Dependency path="libs/gameaudio/wwise/*.xml" optional="false" />
|
||||||
<Dependency path=":libs/gameaudio/wwise/levels/default_controls.xml" optional="false" />
|
|
||||||
</EngineDependencies>
|
</EngineDependencies>
|
||||||
@@ -226,9 +226,9 @@ class TestMaterialEditor(object):
|
|||||||
self, request, workspace, project, launcher_platform, generic_launcher, exe_file_name, cfg_args):
|
self, request, workspace, project, launcher_platform, generic_launcher, exe_file_name, cfg_args):
|
||||||
"""
|
"""
|
||||||
Tests each valid RHI option (Null RHI excluded) can be launched with the MaterialEditor.
|
Tests each valid RHI option (Null RHI excluded) can be launched with the MaterialEditor.
|
||||||
Checks for the "Finished loading viewport configurtions." success message post lounch.
|
Checks for the "Finished loading viewport configurations." success message post launch.
|
||||||
"""
|
"""
|
||||||
expected_lines = ["Finished loading viewport configurtions."]
|
expected_lines = ["Finished loading viewport configurations."]
|
||||||
unexpected_lines = [
|
unexpected_lines = [
|
||||||
# "Trace::Assert",
|
# "Trace::Assert",
|
||||||
# "Trace::Error",
|
# "Trace::Error",
|
||||||
@@ -241,7 +241,7 @@ class TestMaterialEditor(object):
|
|||||||
generic_launcher,
|
generic_launcher,
|
||||||
editor_script="",
|
editor_script="",
|
||||||
run_python="--runpython",
|
run_python="--runpython",
|
||||||
timeout=30,
|
timeout=60,
|
||||||
expected_lines=expected_lines,
|
expected_lines=expected_lines,
|
||||||
unexpected_lines=unexpected_lines,
|
unexpected_lines=unexpected_lines,
|
||||||
halt_on_unexpected=False,
|
halt_on_unexpected=False,
|
||||||
|
|||||||
@@ -25,28 +25,39 @@ import prefab.Prefab_Test_Utils as prefab_test_utils
|
|||||||
# This is a helper class which contains some of the useful information about a prefab instance.
|
# This is a helper class which contains some of the useful information about a prefab instance.
|
||||||
class PrefabInstance:
|
class PrefabInstance:
|
||||||
|
|
||||||
def __init__(self, name: str=None, prefab_file_name: str=None, container_entity: EditorEntity=EntityId()):
|
def __init__(self, prefab_file_name: str=None, container_entity: EditorEntity=EntityId()):
|
||||||
self.name = name
|
|
||||||
self.prefab_file_name: str = prefab_file_name
|
self.prefab_file_name: str = prefab_file_name
|
||||||
self.container_entity: EditorEntity = container_entity
|
self.container_entity: EditorEntity = container_entity
|
||||||
|
|
||||||
|
def __eq__(self, other):
|
||||||
|
return other and self.container_entity.id == other.container_entity.id
|
||||||
|
|
||||||
|
def __ne__(self, other):
|
||||||
|
return not self.__eq__(other)
|
||||||
|
|
||||||
|
def __hash__(self):
|
||||||
|
return hash(self.container_entity.id)
|
||||||
|
|
||||||
"""
|
"""
|
||||||
See if this instance is valid to be used with other prefab operations.
|
See if this instance is valid to be used with other prefab operations.
|
||||||
:return: Whether the target instance is valid or not.
|
:return: Whether the target instance is valid or not.
|
||||||
"""
|
"""
|
||||||
def is_valid() -> bool:
|
def is_valid() -> bool:
|
||||||
return self.container_entity.id.IsValid() and self.name is not None and self.prefab_file_name in Prefab.existing_prefabs
|
return self.container_entity.id.IsValid() and self.prefab_file_name in Prefab.existing_prefabs
|
||||||
|
|
||||||
|
|
||||||
"""
|
"""
|
||||||
Reparent this instance to target parent entity.
|
Reparent this instance to target parent entity.
|
||||||
The function will also check pop up dialog ui in editor to see if there's prefab cyclical dependency error while reparenting prefabs.
|
The function will also check pop up dialog ui in editor to see if there's prefab cyclical dependency error while reparenting prefabs.
|
||||||
:param parent_entity_id: The id of the entity this instance should be a child of in the transform hierarchy next.
|
:param parent_entity_id: The id of the entity this instance should be a child of in the transform hierarchy next.
|
||||||
"""
|
"""
|
||||||
async def ui_reparent_prefab_instance(self, parent_entity_id: EntityId):
|
async def ui_reparent_prefab_instance(self, parent_entity_id: EntityId):
|
||||||
container_entity_name = self.container_entity.get_name()
|
container_entity_id_before_reparent = self.container_entity.id
|
||||||
current_children_entity_ids_having_prefab_name = prefab_test_utils.get_children_ids_by_name(parent_entity_id, container_entity_name)
|
|
||||||
Report.info(f'current_children_entity_ids_having_prefab_name: {current_children_entity_ids_having_prefab_name}')
|
original_parent = EditorEntity(self.container_entity.get_parent_id())
|
||||||
|
original_parent_before_reparent_children_ids = set(original_parent.get_children_ids())
|
||||||
|
|
||||||
|
new_parent = EditorEntity(parent_entity_id)
|
||||||
|
new_parent_before_reparent_children_ids = set(new_parent.get_children_ids())
|
||||||
|
|
||||||
pyside_utils.run_soon(lambda: self.container_entity.set_parent_entity(parent_entity_id))
|
pyside_utils.run_soon(lambda: self.container_entity.set_parent_entity(parent_entity_id))
|
||||||
pyside_utils.run_soon(lambda: prefab_test_utils.wait_for_propagation())
|
pyside_utils.run_soon(lambda: prefab_test_utils.wait_for_propagation())
|
||||||
@@ -60,18 +71,23 @@ class PrefabInstance:
|
|||||||
except pyside_utils.EventLoopTimeoutException:
|
except pyside_utils.EventLoopTimeoutException:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
updated_children_entity_ids_having_prefab_name = prefab_test_utils.get_children_ids_by_name(parent_entity_id, container_entity_name)
|
original_parent_after_reparent_children_ids = set(original_parent.get_children_ids())
|
||||||
Report.info(f'updated_children_entity_ids_having_prefab_name: {updated_children_entity_ids_having_prefab_name}')
|
assert len(original_parent_after_reparent_children_ids) == len(original_parent_before_reparent_children_ids) - 1, \
|
||||||
new_child_with_reparented_prefab_name_added = len(updated_children_entity_ids_having_prefab_name) == len(current_children_entity_ids_having_prefab_name) + 1
|
"The children count of the Prefab Instance's original parent should be decreased by 1."
|
||||||
assert new_child_with_reparented_prefab_name_added, "No entity with reparented prefab name become a child of target parent entity"
|
assert not container_entity_id_before_reparent in original_parent_after_reparent_children_ids, \
|
||||||
|
"This Prefab Instance is still a child entity of its original parent entity."
|
||||||
|
|
||||||
|
new_parent_after_reparent_children_ids = set(new_parent.get_children_ids())
|
||||||
|
assert len(new_parent_after_reparent_children_ids) == len(new_parent_before_reparent_children_ids) + 1, \
|
||||||
|
"The children count of the Prefab Instance's new parent should be increased by 1."
|
||||||
|
|
||||||
updated_container_entity_id = set(updated_children_entity_ids_having_prefab_name).difference(current_children_entity_ids_having_prefab_name).pop()
|
container_entity_id_after_reparent = set(new_parent_after_reparent_children_ids).difference(new_parent_before_reparent_children_ids).pop()
|
||||||
updated_container_entity = EditorEntity(updated_container_entity_id)
|
reparented_container_entity = EditorEntity(container_entity_id_after_reparent)
|
||||||
updated_container_entity_parent_id = updated_container_entity.get_parent_id()
|
reparented_container_entity_parent_id = reparented_container_entity.get_parent_id()
|
||||||
has_correct_parent = updated_container_entity_parent_id.ToString() == parent_entity_id.ToString()
|
has_correct_parent = reparented_container_entity_parent_id.ToString() == parent_entity_id.ToString()
|
||||||
assert has_correct_parent, "Prefab reparented is *not* under the expected parent entity"
|
assert has_correct_parent, "Prefab Instance reparented is *not* under the expected parent entity"
|
||||||
|
|
||||||
self.container_entity = EditorEntity(updated_container_entity_id)
|
self.container_entity = reparented_container_entity
|
||||||
|
|
||||||
# This is a helper class which contains some of the useful information about a prefab template.
|
# This is a helper class which contains some of the useful information about a prefab template.
|
||||||
class Prefab:
|
class Prefab:
|
||||||
@@ -81,7 +97,7 @@ class Prefab:
|
|||||||
def __init__(self, file_name: str):
|
def __init__(self, file_name: str):
|
||||||
self.file_name:str = file_name
|
self.file_name:str = file_name
|
||||||
self.file_path: str = prefab_test_utils.get_prefab_file_path(file_name)
|
self.file_path: str = prefab_test_utils.get_prefab_file_path(file_name)
|
||||||
self.instances: dict = {}
|
self.instances: set[PrefabInstance] = set()
|
||||||
|
|
||||||
"""
|
"""
|
||||||
Check if a prefab is ready to be used to generate its instances.
|
Check if a prefab is ready to be used to generate its instances.
|
||||||
@@ -122,10 +138,10 @@ class Prefab:
|
|||||||
:param entities: The entities that should form the new prefab (along with their descendants).
|
:param entities: The entities that should form the new prefab (along with their descendants).
|
||||||
:param file_name: A unique file name of new prefab.
|
:param file_name: A unique file name of new prefab.
|
||||||
:param prefab_instance_name: A name for the very first instance generated while prefab creation. The default instance name is the same as file_name.
|
:param prefab_instance_name: A name for the very first instance generated while prefab creation. The default instance name is the same as file_name.
|
||||||
:return: An outcome object with an entityId of the new prefab's container entity; on failure, it comes with an error message detailing the cause of the error.
|
:return: Created Prefab object and the very first PrefabInstance object owned by the prefab.
|
||||||
"""
|
"""
|
||||||
@classmethod
|
@classmethod
|
||||||
def create_prefab(cls, entities: list[EditorEntity], file_name: str, prefab_instance_name: str=None) -> Prefab:
|
def create_prefab(cls, entities: list[EditorEntity], file_name: str, prefab_instance_name: str=None) -> (Prefab, PrefabInstance):
|
||||||
assert not Prefab.is_prefab_loaded(file_name), f"Can't create Prefab '{file_name}' since the prefab already exists"
|
assert not Prefab.is_prefab_loaded(file_name), f"Can't create Prefab '{file_name}' since the prefab already exists"
|
||||||
|
|
||||||
new_prefab = Prefab(file_name)
|
new_prefab = Prefab(file_name)
|
||||||
@@ -133,18 +149,18 @@ class Prefab:
|
|||||||
create_prefab_result = prefab.PrefabPublicRequestBus(bus.Broadcast, 'CreatePrefabInMemory', entity_ids, new_prefab.file_path)
|
create_prefab_result = prefab.PrefabPublicRequestBus(bus.Broadcast, 'CreatePrefabInMemory', entity_ids, new_prefab.file_path)
|
||||||
assert create_prefab_result.IsSuccess(), f"Prefab operation 'CreatePrefab' failed. Error: {create_prefab_result.GetError()}"
|
assert create_prefab_result.IsSuccess(), f"Prefab operation 'CreatePrefab' failed. Error: {create_prefab_result.GetError()}"
|
||||||
|
|
||||||
container_entity = EditorEntity(create_prefab_result.GetValue())
|
container_entity_id = create_prefab_result.GetValue()
|
||||||
|
container_entity = EditorEntity(container_entity_id)
|
||||||
|
|
||||||
if prefab_instance_name:
|
if prefab_instance_name:
|
||||||
container_entity.set_name(prefab_instance_name)
|
container_entity.set_name(prefab_instance_name)
|
||||||
else:
|
|
||||||
prefab_instance_name = file_name
|
|
||||||
|
|
||||||
prefab_test_utils.wait_for_propagation()
|
prefab_test_utils.wait_for_propagation()
|
||||||
container_entity_id = prefab_test_utils.find_entity_by_unique_name(prefab_instance_name)
|
|
||||||
new_prefab.instances[prefab_instance_name] = PrefabInstance(prefab_instance_name, file_name, EditorEntity(container_entity_id))
|
new_prefab_instance = PrefabInstance(file_name, EditorEntity(container_entity_id))
|
||||||
|
new_prefab.instances.add(new_prefab_instance)
|
||||||
Prefab.existing_prefabs[file_name] = new_prefab
|
Prefab.existing_prefabs[file_name] = new_prefab
|
||||||
return new_prefab
|
return new_prefab, new_prefab_instance
|
||||||
|
|
||||||
"""
|
"""
|
||||||
Remove target prefab instances.
|
Remove target prefab instances.
|
||||||
@@ -152,22 +168,15 @@ class Prefab:
|
|||||||
"""
|
"""
|
||||||
@classmethod
|
@classmethod
|
||||||
def remove_prefabs(cls, prefab_instances: list[PrefabInstance]):
|
def remove_prefabs(cls, prefab_instances: list[PrefabInstance]):
|
||||||
instances_to_remove_name_counts = Counter()
|
entity_ids_to_remove = []
|
||||||
instances_removed_expected_name_counts = Counter()
|
entity_id_queue = [prefab_instance.container_entity for prefab_instance in prefab_instances]
|
||||||
|
while entity_id_queue:
|
||||||
entities_to_remove = [prefab_instance.container_entity for prefab_instance in prefab_instances]
|
entity = entity_id_queue.pop(0)
|
||||||
while entities_to_remove:
|
|
||||||
entity = entities_to_remove.pop(-1)
|
|
||||||
entity_name = entity.get_name()
|
|
||||||
instances_to_remove_name_counts[entity_name] += 1
|
|
||||||
|
|
||||||
children_entity_ids = entity.get_children_ids()
|
children_entity_ids = entity.get_children_ids()
|
||||||
for child_entity_id in children_entity_ids:
|
for child_entity_id in children_entity_ids:
|
||||||
entities_to_remove.append(EditorEntity(child_entity_id))
|
entity_id_queue.append(EditorEntity(child_entity_id))
|
||||||
|
|
||||||
for entity_name, entity_count in instances_to_remove_name_counts.items():
|
entity_ids_to_remove.append(entity.id)
|
||||||
entities = prefab_test_utils.find_entities_by_name(entity_name)
|
|
||||||
instances_removed_expected_name_counts[entity_name] = len(entities) - entity_count
|
|
||||||
|
|
||||||
container_entity_ids = [prefab_instance.container_entity.id for prefab_instance in prefab_instances]
|
container_entity_ids = [prefab_instance.container_entity.id for prefab_instance in prefab_instances]
|
||||||
delete_prefab_result = prefab.PrefabPublicRequestBus(bus.Broadcast, 'DeleteEntitiesAndAllDescendantsInInstance', container_entity_ids)
|
delete_prefab_result = prefab.PrefabPublicRequestBus(bus.Broadcast, 'DeleteEntitiesAndAllDescendantsInInstance', container_entity_ids)
|
||||||
@@ -175,28 +184,24 @@ class Prefab:
|
|||||||
|
|
||||||
prefab_test_utils.wait_for_propagation()
|
prefab_test_utils.wait_for_propagation()
|
||||||
|
|
||||||
prefab_entities_deleted = True
|
entity_ids_after_delete = set(prefab_test_utils.get_all_entities())
|
||||||
for entity_name, expected_entity_count in instances_removed_expected_name_counts.items():
|
for entity_id_removed in entity_ids_to_remove:
|
||||||
actual_entity_count = len(prefab_test_utils.find_entities_by_name(entity_name))
|
if entity_id_removed in entity_ids_after_delete:
|
||||||
if actual_entity_count is not expected_entity_count:
|
assert prefab_entities_deleted, "Not all entities and descendants in target prefabs are deleted."
|
||||||
prefab_entities_deleted = False
|
|
||||||
break
|
|
||||||
|
|
||||||
assert prefab_entities_deleted, "Not all entities and descendants in target prefabs are deleted."
|
|
||||||
|
|
||||||
for instance in prefab_instances:
|
for instance in prefab_instances:
|
||||||
instance_deleted_prefab = Prefab.get_prefab(instance.prefab_file_name)
|
instance_deleted_prefab = Prefab.get_prefab(instance.prefab_file_name)
|
||||||
instance_deleted_prefab.instances.pop(instance.name)
|
instance_deleted_prefab.instances.remove(instance)
|
||||||
instance = PrefabInstance()
|
instance = PrefabInstance()
|
||||||
|
|
||||||
"""
|
"""
|
||||||
Instantiate an instance of this prefab.
|
Instantiate an instance of this prefab.
|
||||||
:param name: A name for newly instantiated prefab instance. The default instance name is the same as this prefab's file name.
|
|
||||||
:param parent_entity: The entity the prefab should be a child of in the transform hierarchy.
|
:param parent_entity: The entity the prefab should be a child of in the transform hierarchy.
|
||||||
|
:param name: A name for newly instantiated prefab instance. The default instance name is the same as this prefab's file name.
|
||||||
:param prefab_position: The position in world space the prefab should be instantiated in.
|
:param prefab_position: The position in world space the prefab should be instantiated in.
|
||||||
:return: An outcome object with an entityId of the new prefab's container entity; on failure, it comes with an error message detailing the cause of the error.
|
:return: Instantiated PrefabInstance object owned by this prefab.
|
||||||
"""
|
"""
|
||||||
def instantiate(self, name: str=None, parent_entity: EditorEntity=None, prefab_position: Vector3=Vector3()) -> PrefabInstance:
|
def instantiate(self, parent_entity: EditorEntity=None, name: str=None, prefab_position: Vector3=Vector3()) -> PrefabInstance:
|
||||||
parent_entity_id = parent_entity.id if parent_entity is not None else EntityId()
|
parent_entity_id = parent_entity.id if parent_entity is not None else EntityId()
|
||||||
|
|
||||||
instantiate_prefab_result = prefab.PrefabPublicRequestBus(
|
instantiate_prefab_result = prefab.PrefabPublicRequestBus(
|
||||||
@@ -209,13 +214,13 @@ class Prefab:
|
|||||||
|
|
||||||
if name:
|
if name:
|
||||||
container_entity.set_name(name)
|
container_entity.set_name(name)
|
||||||
else:
|
|
||||||
name = self.file_name
|
|
||||||
|
|
||||||
prefab_test_utils.wait_for_propagation()
|
prefab_test_utils.wait_for_propagation()
|
||||||
container_entity_id = prefab_test_utils.find_entity_by_unique_name(name)
|
|
||||||
self.instances[name] = PrefabInstance(name, self.file_name, EditorEntity(container_entity_id))
|
new_prefab_instance = PrefabInstance(self.file_name, EditorEntity(container_entity_id))
|
||||||
|
assert not new_prefab_instance in self.instances, "This prefab instance is already existed before this instantiation."
|
||||||
|
self.instances.add(new_prefab_instance)
|
||||||
|
|
||||||
prefab_test_utils.check_entity_at_position(container_entity_id, prefab_position)
|
prefab_test_utils.check_entity_at_position(container_entity_id, prefab_position)
|
||||||
|
|
||||||
return container_entity_id
|
return new_prefab_instance
|
||||||
|
|||||||
+1
-2
@@ -22,11 +22,10 @@ def Prefab_BasicWorkflow_CreateAndDeletePrefab():
|
|||||||
car_prefab_entities = [car_entity]
|
car_prefab_entities = [car_entity]
|
||||||
|
|
||||||
# Checks for prefab creation passed or not
|
# Checks for prefab creation passed or not
|
||||||
car_prefab = Prefab.create_prefab(
|
_, car = Prefab.create_prefab(
|
||||||
car_prefab_entities, CAR_PREFAB_FILE_NAME)
|
car_prefab_entities, CAR_PREFAB_FILE_NAME)
|
||||||
|
|
||||||
# Checks for prefab deletion passed or not
|
# Checks for prefab deletion passed or not
|
||||||
car = car_prefab.instances[CAR_PREFAB_FILE_NAME]
|
|
||||||
Prefab.remove_prefabs([car])
|
Prefab.remove_prefabs([car])
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|||||||
+2
-4
@@ -28,7 +28,7 @@ def Prefab_BasicWorkflow_CreateAndReparentPrefab():
|
|||||||
car_prefab_entities = [car_entity]
|
car_prefab_entities = [car_entity]
|
||||||
|
|
||||||
# Checks for prefab creation passed or not
|
# Checks for prefab creation passed or not
|
||||||
car_prefab = Prefab.create_prefab(
|
_, car = Prefab.create_prefab(
|
||||||
car_prefab_entities, CAR_PREFAB_FILE_NAME)
|
car_prefab_entities, CAR_PREFAB_FILE_NAME)
|
||||||
|
|
||||||
# Creates another new Entity at the root level
|
# Creates another new Entity at the root level
|
||||||
@@ -36,12 +36,10 @@ def Prefab_BasicWorkflow_CreateAndReparentPrefab():
|
|||||||
wheel_prefab_entities = [wheel_entity]
|
wheel_prefab_entities = [wheel_entity]
|
||||||
|
|
||||||
# Checks for wheel prefab creation passed or not
|
# Checks for wheel prefab creation passed or not
|
||||||
wheel_prefab = Prefab.create_prefab(
|
_, wheel = Prefab.create_prefab(
|
||||||
wheel_prefab_entities, WHEEL_PREFAB_FILE_NAME)
|
wheel_prefab_entities, WHEEL_PREFAB_FILE_NAME)
|
||||||
|
|
||||||
# Checks for prefab reparenting passed or not
|
# Checks for prefab reparenting passed or not
|
||||||
car = car_prefab.instances[CAR_PREFAB_FILE_NAME]
|
|
||||||
wheel = wheel_prefab.instances[WHEEL_PREFAB_FILE_NAME]
|
|
||||||
await wheel.ui_reparent_prefab_instance(car.container_entity.id)
|
await wheel.ui_reparent_prefab_instance(car.container_entity.id)
|
||||||
|
|
||||||
run_test()
|
run_test()
|
||||||
|
|||||||
@@ -22,11 +22,11 @@ def Prefab_BasicWorkflow_InstantiatePrefab():
|
|||||||
# Checks for prefab instantiation passed or not
|
# Checks for prefab instantiation passed or not
|
||||||
test_prefab = Prefab.get_prefab(EXISTING_TEST_PREFAB_FILE_NAME)
|
test_prefab = Prefab.get_prefab(EXISTING_TEST_PREFAB_FILE_NAME)
|
||||||
|
|
||||||
instantiated_test_container_entity_id = test_prefab.instantiate(
|
test_instance = test_prefab.instantiate(
|
||||||
prefab_position=INSTANTIATED_TEST_PREFAB_POSITION)
|
prefab_position=INSTANTIATED_TEST_PREFAB_POSITION)
|
||||||
|
|
||||||
prefab_test_utils.check_entity_children_count(
|
prefab_test_utils.check_entity_children_count(
|
||||||
instantiated_test_container_entity_id,
|
test_instance.container_entity.id,
|
||||||
EXPECTED_TEST_PREFAB_CHILDREN_COUNT)
|
EXPECTED_TEST_PREFAB_CHILDREN_COUNT)
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|||||||
@@ -29,20 +29,8 @@ def find_entities_by_name(entity_name):
|
|||||||
searchFilter.names = [entity_name]
|
searchFilter.names = [entity_name]
|
||||||
return entity.SearchBus(bus.Broadcast, 'SearchEntities', searchFilter)
|
return entity.SearchBus(bus.Broadcast, 'SearchEntities', searchFilter)
|
||||||
|
|
||||||
def find_entity_by_unique_name(entity_name):
|
def get_all_entities():
|
||||||
unique_name_entity_found_result = (
|
return entity.SearchBus(bus.Broadcast, 'SearchEntities', entity.SearchFilter())
|
||||||
"Entity with a unique name found",
|
|
||||||
"Entity with a unique name *not* found")
|
|
||||||
|
|
||||||
entities = find_entities_by_name(entity_name)
|
|
||||||
unique_name_entity_found = len(entities) == 1
|
|
||||||
Report.result(unique_name_entity_found_result, unique_name_entity_found)
|
|
||||||
|
|
||||||
if unique_name_entity_found:
|
|
||||||
return entities[0]
|
|
||||||
else:
|
|
||||||
Report.info(f"{len(entities)} entities with name '{entity_name}' found")
|
|
||||||
return EntityId()
|
|
||||||
|
|
||||||
def check_entity_at_position(entity_id, expected_entity_position):
|
def check_entity_at_position(entity_id, expected_entity_position):
|
||||||
entity_at_expected_position_result = (
|
entity_at_expected_position_result = (
|
||||||
|
|||||||
@@ -551,8 +551,6 @@ namespace AZ
|
|||||||
{
|
{
|
||||||
PrepareShutDown();
|
PrepareShutDown();
|
||||||
|
|
||||||
DispatchEvents();
|
|
||||||
|
|
||||||
// Acquire the asset lock to make sure nobody else is trying to do anything fancy with assets
|
// Acquire the asset lock to make sure nobody else is trying to do anything fancy with assets
|
||||||
AZStd::scoped_lock<AZStd::recursive_mutex> assetLock(m_assetMutex);
|
AZStd::scoped_lock<AZStd::recursive_mutex> assetLock(m_assetMutex);
|
||||||
|
|
||||||
@@ -575,7 +573,10 @@ namespace AZ
|
|||||||
{
|
{
|
||||||
AZ_PROFILE_FUNCTION(AzCore);
|
AZ_PROFILE_FUNCTION(AzCore);
|
||||||
AssetManagerNotificationBus::Broadcast(&AssetManagerNotificationBus::Events::OnAssetEventsDispatchBegin);
|
AssetManagerNotificationBus::Broadcast(&AssetManagerNotificationBus::Events::OnAssetEventsDispatchBegin);
|
||||||
AssetBus::ExecuteQueuedEvents();
|
while (AssetBus::QueuedEventCount())
|
||||||
|
{
|
||||||
|
AssetBus::ExecuteQueuedEvents();
|
||||||
|
}
|
||||||
AssetManagerNotificationBus::Broadcast(&AssetManagerNotificationBus::Events::OnAssetEventsDispatchEnd);
|
AssetManagerNotificationBus::Broadcast(&AssetManagerNotificationBus::Events::OnAssetEventsDispatchEnd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -22,6 +22,7 @@
|
|||||||
#include <AzCore/Time/TimeSystemComponent.h>
|
#include <AzCore/Time/TimeSystemComponent.h>
|
||||||
#include <AzCore/Console/LoggerSystemComponent.h>
|
#include <AzCore/Console/LoggerSystemComponent.h>
|
||||||
#include <AzCore/EBus/EventSchedulerSystemComponent.h>
|
#include <AzCore/EBus/EventSchedulerSystemComponent.h>
|
||||||
|
#include <AzCore/Task/TaskGraphSystemComponent.h>
|
||||||
|
|
||||||
namespace AZ
|
namespace AZ
|
||||||
{
|
{
|
||||||
@@ -41,6 +42,7 @@ namespace AZ
|
|||||||
TimeSystemComponent::CreateDescriptor(),
|
TimeSystemComponent::CreateDescriptor(),
|
||||||
LoggerSystemComponent::CreateDescriptor(),
|
LoggerSystemComponent::CreateDescriptor(),
|
||||||
EventSchedulerSystemComponent::CreateDescriptor(),
|
EventSchedulerSystemComponent::CreateDescriptor(),
|
||||||
|
TaskGraphSystemComponent::CreateDescriptor(),
|
||||||
|
|
||||||
#if !defined(AZCORE_EXCLUDE_LUA)
|
#if !defined(AZCORE_EXCLUDE_LUA)
|
||||||
ScriptSystemComponent::CreateDescriptor(),
|
ScriptSystemComponent::CreateDescriptor(),
|
||||||
@@ -55,6 +57,7 @@ namespace AZ
|
|||||||
azrtti_typeid<TimeSystemComponent>(),
|
azrtti_typeid<TimeSystemComponent>(),
|
||||||
azrtti_typeid<LoggerSystemComponent>(),
|
azrtti_typeid<LoggerSystemComponent>(),
|
||||||
azrtti_typeid<EventSchedulerSystemComponent>(),
|
azrtti_typeid<EventSchedulerSystemComponent>(),
|
||||||
|
azrtti_typeid<TaskGraphSystemComponent>(),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -262,17 +262,17 @@ namespace AZ
|
|||||||
|
|
||||||
#else // !AZ_ENABLE_TRACING
|
#else // !AZ_ENABLE_TRACING
|
||||||
|
|
||||||
#define AZ_Assert(...) AZ_UNUSED(__VA_ARGS__);
|
#define AZ_Assert(...)
|
||||||
#define AZ_Error(...) AZ_UNUSED(__VA_ARGS__);
|
#define AZ_Error(...)
|
||||||
#define AZ_ErrorOnce(...) AZ_UNUSED(__VA_ARGS__);
|
#define AZ_ErrorOnce(...)
|
||||||
#define AZ_Warning(...) AZ_UNUSED(__VA_ARGS__);
|
#define AZ_Warning(...)
|
||||||
#define AZ_WarningOnce(...) AZ_UNUSED(__VA_ARGS__);
|
#define AZ_WarningOnce(...)
|
||||||
#define AZ_TracePrintf(...) AZ_UNUSED(__VA_ARGS__);
|
#define AZ_TracePrintf(...)
|
||||||
#define AZ_TracePrintfOnce(...) AZ_UNUSED(__VA_ARGS__);
|
#define AZ_TracePrintfOnce(...)
|
||||||
|
|
||||||
#define AZ_Verify(...) AZ_UNUSED(__VA_ARGS__);
|
#define AZ_Verify(expression, ...) AZ_UNUSED(expression)
|
||||||
#define AZ_VerifyError(...) AZ_UNUSED(__VA_ARGS__);
|
#define AZ_VerifyError(window, expression, ...) AZ_UNUSED(expression)
|
||||||
#define AZ_VerifyWarning(...) AZ_UNUSED(__VA_ARGS__);
|
#define AZ_VerifyWarning(window, expression, ...) AZ_UNUSED(expression)
|
||||||
|
|
||||||
#endif // AZ_ENABLE_TRACING
|
#endif // AZ_ENABLE_TRACING
|
||||||
|
|
||||||
|
|||||||
@@ -43,10 +43,12 @@ namespace AZ::IO
|
|||||||
|
|
||||||
m_mainLoopDesc = threadDesc;
|
m_mainLoopDesc = threadDesc;
|
||||||
m_mainLoopDesc.m_name = "IO Scheduler";
|
m_mainLoopDesc.m_name = "IO Scheduler";
|
||||||
m_mainLoop = AZStd::thread([this]()
|
m_mainLoop = AZStd::thread(
|
||||||
{
|
m_mainLoopDesc,
|
||||||
Thread_MainLoop();
|
[this]()
|
||||||
}, &m_mainLoopDesc);
|
{
|
||||||
|
Thread_MainLoop();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -644,11 +644,11 @@ JobManagerWorkStealing::ThreadList JobManagerWorkStealing::CreateWorkerThreads(c
|
|||||||
}
|
}
|
||||||
|
|
||||||
info->m_thread = AZStd::thread(
|
info->m_thread = AZStd::thread(
|
||||||
|
threadDesc,
|
||||||
[this, info]()
|
[this, info]()
|
||||||
{
|
{
|
||||||
this->ProcessJobsWorker(info);
|
this->ProcessJobsWorker(info);
|
||||||
},
|
}
|
||||||
&threadDesc
|
|
||||||
);
|
);
|
||||||
|
|
||||||
info->m_threadId = info->m_thread.get_id();
|
info->m_threadId = info->m_thread.get_id();
|
||||||
|
|||||||
@@ -717,7 +717,9 @@ namespace AZ::SettingsRegistryMergeUtils
|
|||||||
if (registry.Get(cacheRootPath, FilePathKey_CacheRootFolder))
|
if (registry.Get(cacheRootPath, FilePathKey_CacheRootFolder))
|
||||||
{
|
{
|
||||||
mergePath = AZStd::move(cacheRootPath);
|
mergePath = AZStd::move(cacheRootPath);
|
||||||
mergePath /= SettingsRegistryInterface::RegistryFolder;
|
AZStd::fixed_string<32> registryFolderLower(SettingsRegistryInterface::RegistryFolder);
|
||||||
|
AZStd::to_lower(registryFolderLower.begin(), registryFolderLower.end());
|
||||||
|
mergePath /= registryFolderLower;
|
||||||
registry.MergeSettingsFolder(mergePath.Native(), specializations, platform, "", scratchBuffer);
|
registry.MergeSettingsFolder(mergePath.Native(), specializations, platform, "", scratchBuffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -190,11 +190,13 @@ namespace AZ
|
|||||||
class TaskWorker
|
class TaskWorker
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
void Spawn(::AZ::TaskExecutor& executor, size_t id, AZStd::semaphore& initSemaphore, bool affinitize)
|
static thread_local TaskWorker* t_worker;
|
||||||
|
|
||||||
|
void Spawn(::AZ::TaskExecutor& executor, uint32_t id, AZStd::semaphore& initSemaphore, bool affinitize)
|
||||||
{
|
{
|
||||||
m_executor = &executor;
|
m_executor = &executor;
|
||||||
|
|
||||||
AZStd::string threadName = AZStd::string::format("TaskWorker %zu", id);
|
AZStd::string threadName = AZStd::string::format("TaskWorker %u", id);
|
||||||
AZStd::thread_desc desc = {};
|
AZStd::thread_desc desc = {};
|
||||||
desc.m_name = threadName.c_str();
|
desc.m_name = threadName.c_str();
|
||||||
if (affinitize)
|
if (affinitize)
|
||||||
@@ -203,12 +205,29 @@ namespace AZ
|
|||||||
}
|
}
|
||||||
m_active.store(true, AZStd::memory_order_release);
|
m_active.store(true, AZStd::memory_order_release);
|
||||||
|
|
||||||
m_thread = AZStd::thread{ [this, &initSemaphore]
|
m_thread = AZStd::thread{ desc,
|
||||||
|
[this, &initSemaphore]
|
||||||
{
|
{
|
||||||
|
t_worker = this;
|
||||||
initSemaphore.release();
|
initSemaphore.release();
|
||||||
Run();
|
Run();
|
||||||
},
|
} };
|
||||||
&desc };
|
}
|
||||||
|
|
||||||
|
// Threads that wait on a graph to complete are disqualified from receiving tasks until the wait finishes
|
||||||
|
void Disable()
|
||||||
|
{
|
||||||
|
m_enabled = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Enable()
|
||||||
|
{
|
||||||
|
m_enabled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Enabled() const
|
||||||
|
{
|
||||||
|
return m_enabled;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Join()
|
void Join()
|
||||||
@@ -222,11 +241,7 @@ namespace AZ
|
|||||||
{
|
{
|
||||||
m_queue.Enqueue(task);
|
m_queue.Enqueue(task);
|
||||||
|
|
||||||
if (!m_busy.exchange(true))
|
m_semaphore.release();
|
||||||
{
|
|
||||||
// The worker was idle prior to enqueueing the task, release the semaphore
|
|
||||||
m_semaphore.release();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -234,7 +249,6 @@ namespace AZ
|
|||||||
{
|
{
|
||||||
while (m_active)
|
while (m_active)
|
||||||
{
|
{
|
||||||
m_busy = false;
|
|
||||||
m_semaphore.acquire();
|
m_semaphore.acquire();
|
||||||
|
|
||||||
if (!m_active)
|
if (!m_active)
|
||||||
@@ -242,8 +256,6 @@ namespace AZ
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_busy = true;
|
|
||||||
|
|
||||||
Task* task = m_queue.TryDequeue();
|
Task* task = m_queue.TryDequeue();
|
||||||
while (task)
|
while (task)
|
||||||
{
|
{
|
||||||
@@ -271,12 +283,15 @@ namespace AZ
|
|||||||
|
|
||||||
AZStd::thread m_thread;
|
AZStd::thread m_thread;
|
||||||
AZStd::atomic<bool> m_active;
|
AZStd::atomic<bool> m_active;
|
||||||
AZStd::atomic<bool> m_busy;
|
AZStd::atomic<bool> m_enabled = true;
|
||||||
AZStd::binary_semaphore m_semaphore;
|
AZStd::binary_semaphore m_semaphore;
|
||||||
|
|
||||||
::AZ::TaskExecutor* m_executor;
|
::AZ::TaskExecutor* m_executor;
|
||||||
TaskQueue m_queue;
|
TaskQueue m_queue;
|
||||||
|
friend class ::AZ::TaskExecutor;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
thread_local TaskWorker* TaskWorker::t_worker = nullptr;
|
||||||
} // namespace Internal
|
} // namespace Internal
|
||||||
|
|
||||||
static EnvironmentVariable<TaskExecutor*> s_executor;
|
static EnvironmentVariable<TaskExecutor*> s_executor;
|
||||||
@@ -291,13 +306,16 @@ namespace AZ
|
|||||||
return **s_executor;
|
return **s_executor;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Create the default executor as part of a component (as in TaskManagerComponent)
|
|
||||||
void TaskExecutor::SetInstance(TaskExecutor* executor)
|
void TaskExecutor::SetInstance(TaskExecutor* executor)
|
||||||
{
|
{
|
||||||
AZ_Assert(!s_executor, "Attempting to set the global task executor more than once");
|
if (!executor)
|
||||||
|
{
|
||||||
s_executor = AZ::Environment::CreateVariable<TaskExecutor*>("GlobalTaskExecutor");
|
s_executor.Reset();
|
||||||
s_executor.Set(executor);
|
}
|
||||||
|
else if (!s_executor) // ignore any calls to set after the first (this happens in unit tests that create new system entities)
|
||||||
|
{
|
||||||
|
s_executor = AZ::Environment::CreateVariable<TaskExecutor*>(s_executorName, executor);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TaskExecutor::TaskExecutor(uint32_t threadCount)
|
TaskExecutor::TaskExecutor(uint32_t threadCount)
|
||||||
@@ -307,14 +325,12 @@ namespace AZ
|
|||||||
|
|
||||||
m_workers = reinterpret_cast<Internal::TaskWorker*>(azmalloc(m_threadCount * sizeof(Internal::TaskWorker)));
|
m_workers = reinterpret_cast<Internal::TaskWorker*>(azmalloc(m_threadCount * sizeof(Internal::TaskWorker)));
|
||||||
|
|
||||||
bool affinitize = m_threadCount == AZStd::thread::hardware_concurrency();
|
|
||||||
|
|
||||||
AZStd::semaphore initSemaphore;
|
AZStd::semaphore initSemaphore;
|
||||||
|
|
||||||
for (size_t i = 0; i != m_threadCount; ++i)
|
for (uint32_t i = 0; i != m_threadCount; ++i)
|
||||||
{
|
{
|
||||||
new (m_workers + i) Internal::TaskWorker{};
|
new (m_workers + i) Internal::TaskWorker{};
|
||||||
m_workers[i].Spawn(*this, i, initSemaphore, affinitize);
|
m_workers[i].Spawn(*this, i, initSemaphore, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (size_t i = 0; i != m_threadCount; ++i)
|
for (size_t i = 0; i != m_threadCount; ++i)
|
||||||
@@ -334,9 +350,21 @@ namespace AZ
|
|||||||
azfree(m_workers);
|
azfree(m_workers);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TaskExecutor::Submit(Internal::CompiledTaskGraph& graph)
|
Internal::TaskWorker* TaskExecutor::GetTaskWorker()
|
||||||
|
{
|
||||||
|
if (Internal::TaskWorker::t_worker && Internal::TaskWorker::t_worker->m_executor == this)
|
||||||
|
{
|
||||||
|
return Internal::TaskWorker::t_worker;
|
||||||
|
}
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TaskExecutor::Submit(Internal::CompiledTaskGraph& graph, TaskGraphEvent* event)
|
||||||
{
|
{
|
||||||
++m_graphsRemaining;
|
++m_graphsRemaining;
|
||||||
|
|
||||||
|
event->m_executor = this; // Used to validate event is not waited for inside a job
|
||||||
|
|
||||||
// Submit all tasks that have no inbound edges
|
// Submit all tasks that have no inbound edges
|
||||||
for (Internal::Task& task : graph.Tasks())
|
for (Internal::Task& task : graph.Tasks())
|
||||||
{
|
{
|
||||||
@@ -352,11 +380,24 @@ namespace AZ
|
|||||||
// TODO: Something more sophisticated is likely needed here.
|
// TODO: Something more sophisticated is likely needed here.
|
||||||
// First, we are completely ignoring affinity.
|
// First, we are completely ignoring affinity.
|
||||||
// Second, some heuristics on core availability will help distribute work more effectively
|
// Second, some heuristics on core availability will help distribute work more effectively
|
||||||
m_workers[++m_lastSubmission % m_threadCount].Enqueue(&task);
|
uint32_t nextWorker = ++m_lastSubmission % m_threadCount;
|
||||||
|
while (!m_workers[nextWorker].Enabled())
|
||||||
|
{
|
||||||
|
// Graphs that are waiting for the completion of a task graph cannot enqueue tasks onto
|
||||||
|
// the thread issuing the wait.
|
||||||
|
nextWorker = ++m_lastSubmission % m_threadCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_workers[nextWorker].Enqueue(&task);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TaskExecutor::ReleaseGraph()
|
void TaskExecutor::ReleaseGraph()
|
||||||
{
|
{
|
||||||
--m_graphsRemaining;
|
--m_graphsRemaining;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TaskExecutor::ReactivateTaskWorker()
|
||||||
|
{
|
||||||
|
GetTaskWorker()->Enable();
|
||||||
|
}
|
||||||
} // namespace AZ
|
} // namespace AZ
|
||||||
|
|||||||
@@ -72,14 +72,19 @@ namespace AZ
|
|||||||
explicit TaskExecutor(uint32_t threadCount = 0);
|
explicit TaskExecutor(uint32_t threadCount = 0);
|
||||||
~TaskExecutor();
|
~TaskExecutor();
|
||||||
|
|
||||||
void Submit(Internal::CompiledTaskGraph& graph);
|
// Submit a task graph for execution. Waitable task graphs cannot enqueue work on the task thread
|
||||||
|
// that is currently active
|
||||||
|
void Submit(Internal::CompiledTaskGraph& graph, TaskGraphEvent* event);
|
||||||
|
|
||||||
void Submit(Internal::Task& task);
|
void Submit(Internal::Task& task);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
friend class Internal::TaskWorker;
|
friend class Internal::TaskWorker;
|
||||||
|
friend class TaskGraphEvent;
|
||||||
|
|
||||||
|
Internal::TaskWorker* GetTaskWorker();
|
||||||
void ReleaseGraph();
|
void ReleaseGraph();
|
||||||
|
void ReactivateTaskWorker();
|
||||||
|
|
||||||
Internal::TaskWorker* m_workers;
|
Internal::TaskWorker* m_workers;
|
||||||
uint32_t m_threadCount = 0;
|
uint32_t m_threadCount = 0;
|
||||||
|
|||||||
@@ -14,6 +14,12 @@ namespace AZ
|
|||||||
{
|
{
|
||||||
using Internal::CompiledTaskGraph;
|
using Internal::CompiledTaskGraph;
|
||||||
|
|
||||||
|
void TaskGraphEvent::Wait()
|
||||||
|
{
|
||||||
|
AZ_Assert(m_executor->GetTaskWorker() == nullptr, "Waiting in a task is unsupported");
|
||||||
|
m_semaphore.acquire();
|
||||||
|
}
|
||||||
|
|
||||||
void TaskToken::PrecedesInternal(TaskToken& comesAfter)
|
void TaskToken::PrecedesInternal(TaskToken& comesAfter)
|
||||||
{
|
{
|
||||||
AZ_Assert(!m_parent.m_submitted, "Cannot mutate a TaskGraph that was previously submitted.");
|
AZ_Assert(!m_parent.m_submitted, "Cannot mutate a TaskGraph that was previously submitted.");
|
||||||
@@ -71,7 +77,7 @@ namespace AZ
|
|||||||
m_compiledTaskGraph->m_tasks[i].Init();
|
m_compiledTaskGraph->m_tasks[i].Init();
|
||||||
}
|
}
|
||||||
|
|
||||||
executor.Submit(*m_compiledTaskGraph);
|
executor.Submit(*m_compiledTaskGraph, waitEvent);
|
||||||
|
|
||||||
if (m_retained)
|
if (m_retained)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -22,10 +22,19 @@ namespace AZ
|
|||||||
namespace Internal
|
namespace Internal
|
||||||
{
|
{
|
||||||
class CompiledTaskGraph;
|
class CompiledTaskGraph;
|
||||||
|
class TaskWorker;
|
||||||
}
|
}
|
||||||
class TaskExecutor;
|
class TaskExecutor;
|
||||||
class TaskGraph;
|
class TaskGraph;
|
||||||
|
|
||||||
|
class TaskGraphActiveInterface
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
AZ_RTTI(TaskGraphActiveInterface, "{08118074-B139-4EF9-B8FD-29F1D6DC9233}");
|
||||||
|
|
||||||
|
virtual bool IsTaskGraphActive() const = 0;
|
||||||
|
};
|
||||||
|
|
||||||
// A TaskToken is returned each time a Task is added to the TaskGraph. TaskTokens are used to
|
// A TaskToken is returned each time a Task is added to the TaskGraph. TaskTokens are used to
|
||||||
// express dependencies between tasks within the graph, and have no purpose after the graph
|
// express dependencies between tasks within the graph, and have no purpose after the graph
|
||||||
// is submitted (simply let them go out of scope)
|
// is submitted (simply let them go out of scope)
|
||||||
@@ -70,9 +79,12 @@ namespace AZ
|
|||||||
private:
|
private:
|
||||||
friend class ::AZ::Internal::CompiledTaskGraph;
|
friend class ::AZ::Internal::CompiledTaskGraph;
|
||||||
friend class TaskGraph;
|
friend class TaskGraph;
|
||||||
|
friend class TaskExecutor;
|
||||||
|
|
||||||
void Signal();
|
void Signal();
|
||||||
|
|
||||||
AZStd::binary_semaphore m_semaphore;
|
AZStd::binary_semaphore m_semaphore;
|
||||||
|
TaskExecutor* m_executor = nullptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
// The TaskGraph encapsulates a set of tasks and their interdependencies. After adding
|
// The TaskGraph encapsulates a set of tasks and their interdependencies. After adding
|
||||||
@@ -89,6 +101,9 @@ namespace AZ
|
|||||||
// Reset the state of the task graph to begin recording tasks and edges again
|
// Reset the state of the task graph to begin recording tasks and edges again
|
||||||
// NOTE: Graph must be in a "settled" state (cannot be in-flight)
|
// NOTE: Graph must be in a "settled" state (cannot be in-flight)
|
||||||
void Reset();
|
void Reset();
|
||||||
|
|
||||||
|
// Returns false if 1 or more tasks have been added to the graph
|
||||||
|
bool IsEmpty();
|
||||||
|
|
||||||
// Add a task to the graph, retrieiving a token that can be used to express dependencies
|
// Add a task to the graph, retrieiving a token that can be used to express dependencies
|
||||||
// between tasks. The first argument specifies the TaskKind, used for tracking the task.
|
// between tasks. The first argument specifies the TaskKind, used for tracking the task.
|
||||||
|
|||||||
@@ -33,11 +33,6 @@ namespace AZ
|
|||||||
return m_semaphore.try_acquire_for(AZStd::chrono::milliseconds{ 0 });
|
return m_semaphore.try_acquire_for(AZStd::chrono::milliseconds{ 0 });
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void TaskGraphEvent::Wait()
|
|
||||||
{
|
|
||||||
m_semaphore.acquire();
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void TaskGraphEvent::Signal()
|
inline void TaskGraphEvent::Signal()
|
||||||
{
|
{
|
||||||
m_semaphore.release();
|
m_semaphore.release();
|
||||||
@@ -59,6 +54,11 @@ namespace AZ
|
|||||||
return { AddTask(descriptor, AZStd::forward<Lambdas>(lambdas))... };
|
return { AddTask(descriptor, AZStd::forward<Lambdas>(lambdas))... };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline bool TaskGraph::IsEmpty()
|
||||||
|
{
|
||||||
|
return m_tasks.empty();
|
||||||
|
}
|
||||||
|
|
||||||
inline void TaskGraph::Detach()
|
inline void TaskGraph::Detach()
|
||||||
{
|
{
|
||||||
m_retained = false;
|
m_retained = false;
|
||||||
|
|||||||
@@ -0,0 +1,88 @@
|
|||||||
|
/*
|
||||||
|
* 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
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <AzCore/Console/IConsole.h>
|
||||||
|
#include <AzCore/Interface/Interface.h>
|
||||||
|
#include <AzCore/Task/TaskGraphSystemComponent.h>
|
||||||
|
#include <AzCore/Serialization/SerializeContext.h>
|
||||||
|
#include <AzCore/Serialization/EditContext.h>
|
||||||
|
|
||||||
|
// Create a cvar as a central location for experimentation with switching from the Job system to TaskGraph system.
|
||||||
|
AZ_CVAR(bool, cl_activateTaskGraph, false, nullptr, AZ::ConsoleFunctorFlags::Null, "Flag clients of TaskGraph to switch between jobs/taskgraph (Note does not disable task graph system)");
|
||||||
|
static constexpr uint32_t TaskExecutorServiceCrc = AZ_CRC_CE("TaskExecutorService");
|
||||||
|
|
||||||
|
namespace AZ
|
||||||
|
{
|
||||||
|
void TaskGraphSystemComponent::Activate()
|
||||||
|
{
|
||||||
|
AZ_Assert(m_taskExecutor == nullptr, "Error multiple activation of the TaskGraphSystemComponent");
|
||||||
|
|
||||||
|
if (Interface<TaskGraphActiveInterface>::Get() == nullptr)
|
||||||
|
{
|
||||||
|
Interface<TaskGraphActiveInterface>::Register(this);
|
||||||
|
m_taskExecutor = aznew TaskExecutor();
|
||||||
|
TaskExecutor::SetInstance(m_taskExecutor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void TaskGraphSystemComponent::Deactivate()
|
||||||
|
{
|
||||||
|
if (&TaskExecutor::Instance() == m_taskExecutor) // check that our instance is the global instance (not always true in unit tests)
|
||||||
|
{
|
||||||
|
m_taskExecutor->SetInstance(nullptr);
|
||||||
|
}
|
||||||
|
if (m_taskExecutor)
|
||||||
|
{
|
||||||
|
azdestroy(m_taskExecutor);
|
||||||
|
m_taskExecutor = nullptr;
|
||||||
|
}
|
||||||
|
if (Interface<TaskGraphActiveInterface>::Get() == this)
|
||||||
|
{
|
||||||
|
Interface<TaskGraphActiveInterface>::Unregister(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void TaskGraphSystemComponent::GetProvidedServices(ComponentDescriptor::DependencyArrayType& provided)
|
||||||
|
{
|
||||||
|
provided.push_back(TaskExecutorServiceCrc);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TaskGraphSystemComponent::GetIncompatibleServices(ComponentDescriptor::DependencyArrayType& incompatible)
|
||||||
|
{
|
||||||
|
incompatible.push_back(TaskExecutorServiceCrc);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TaskGraphSystemComponent::GetDependentServices([[maybe_unused]] ComponentDescriptor::DependencyArrayType& dependent)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void TaskGraphSystemComponent::Reflect(ReflectContext* context)
|
||||||
|
{
|
||||||
|
if (SerializeContext* serializeContext = azrtti_cast<SerializeContext*>(context))
|
||||||
|
{
|
||||||
|
serializeContext->Class<TaskGraphSystemComponent, AZ::Component>()
|
||||||
|
->Version(1)
|
||||||
|
;
|
||||||
|
|
||||||
|
if (AZ::EditContext* ec = serializeContext->GetEditContext())
|
||||||
|
{
|
||||||
|
ec->Class<TaskGraphSystemComponent>
|
||||||
|
("TaskGraph", "System component to create the default executor")
|
||||||
|
->ClassElement(AZ::Edit::ClassElements::EditorData, "")
|
||||||
|
->Attribute(AZ::Edit::Attributes::Category, "Engine")
|
||||||
|
->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC_CE("System"))
|
||||||
|
;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TaskGraphSystemComponent::IsTaskGraphActive() const
|
||||||
|
{
|
||||||
|
return cl_activateTaskGraph;
|
||||||
|
}
|
||||||
|
} // namespace AZ
|
||||||
@@ -0,0 +1,47 @@
|
|||||||
|
/*
|
||||||
|
* 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
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <AzCore/Component/Component.h>
|
||||||
|
#include <AzCore/Math/Crc.h>
|
||||||
|
#include <AzCore/Task/TaskExecutor.h>
|
||||||
|
#include <AzCore/Task/TaskGraph.h>
|
||||||
|
|
||||||
|
namespace AZ
|
||||||
|
{
|
||||||
|
class TaskGraphSystemComponent
|
||||||
|
: public Component
|
||||||
|
, public TaskGraphActiveInterface
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
AZ_COMPONENT(AZ::TaskGraphSystemComponent, "{5D56B829-1FEB-43D5-A0BD-E33C0497EFE2}")
|
||||||
|
|
||||||
|
TaskGraphSystemComponent() = default;
|
||||||
|
|
||||||
|
// Implement TaskGraphActiveInterface
|
||||||
|
bool IsTaskGraphActive() const override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
// Component base
|
||||||
|
void Activate() override;
|
||||||
|
void Deactivate() override;
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
/// \ref ComponentDescriptor::GetProvidedServices
|
||||||
|
static void GetProvidedServices(ComponentDescriptor::DependencyArrayType& provided);
|
||||||
|
/// \ref ComponentDescriptor::GetIncompatibleServices
|
||||||
|
static void GetIncompatibleServices(ComponentDescriptor::DependencyArrayType& incompatible);
|
||||||
|
/// \ref ComponentDescriptor::GetDependentServices
|
||||||
|
static void GetDependentServices(ComponentDescriptor::DependencyArrayType& dependent);
|
||||||
|
/// \red ComponentDescriptor::Reflect
|
||||||
|
static void Reflect(ReflectContext* reflection);
|
||||||
|
|
||||||
|
AZ::TaskExecutor* m_taskExecutor = nullptr;
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -633,6 +633,8 @@ set(FILES
|
|||||||
Task/TaskGraph.cpp
|
Task/TaskGraph.cpp
|
||||||
Task/TaskGraph.h
|
Task/TaskGraph.h
|
||||||
Task/TaskGraph.inl
|
Task/TaskGraph.inl
|
||||||
|
Task/TaskGraphSystemComponent.h
|
||||||
|
Task/TaskGraphSystemComponent.cpp
|
||||||
Threading/ThreadSafeDeque.h
|
Threading/ThreadSafeDeque.h
|
||||||
Threading/ThreadSafeDeque.inl
|
Threading/ThreadSafeDeque.inl
|
||||||
Threading/ThreadSafeObject.h
|
Threading/ThreadSafeObject.h
|
||||||
|
|||||||
@@ -87,12 +87,6 @@ namespace AZStd
|
|||||||
|
|
||||||
// construct/copy/destroy:
|
// construct/copy/destroy:
|
||||||
thread();
|
thread();
|
||||||
/**
|
|
||||||
* \note thread_desc is AZStd extension.
|
|
||||||
*/
|
|
||||||
template <class F>
|
|
||||||
explicit thread(F&& f, const thread_desc* desc = 0);
|
|
||||||
|
|
||||||
~thread();
|
~thread();
|
||||||
|
|
||||||
thread(thread&& rhs)
|
thread(thread&& rhs)
|
||||||
@@ -108,6 +102,15 @@ namespace AZStd
|
|||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<class F, class... Args, typename = AZStd::enable_if_t<!AZStd::is_convertible_v<AZStd::decay_t<F>, thread_desc>>>
|
||||||
|
explicit thread(F&& f, Args&&... args);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \note thread_desc is AZStd extension.
|
||||||
|
*/
|
||||||
|
template<class F, class... Args>
|
||||||
|
thread(const thread_desc& desc, F&& f, Args&&... args);
|
||||||
|
|
||||||
// Till we fully have RVALUES
|
// Till we fully have RVALUES
|
||||||
template <class F>
|
template <class F>
|
||||||
explicit thread(Internal::thread_move_t<F> f);
|
explicit thread(Internal::thread_move_t<F> f);
|
||||||
@@ -138,8 +141,8 @@ namespace AZStd
|
|||||||
//thread(AZStd::delegate<void ()> d,const thread_desc* desc = 0);
|
//thread(AZStd::delegate<void ()> d,const thread_desc* desc = 0);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
thread(thread&);
|
thread(const thread&) = delete;
|
||||||
thread& operator=(thread&);
|
thread& operator=(const thread&) = delete;
|
||||||
|
|
||||||
native_thread_data_type m_thread;
|
native_thread_data_type m_thread;
|
||||||
};
|
};
|
||||||
|
|||||||
+15
-5
@@ -10,6 +10,8 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <sched.h>
|
#include <sched.h>
|
||||||
|
|
||||||
|
#include <AzCore/std/tuple.h>
|
||||||
|
|
||||||
namespace AZStd
|
namespace AZStd
|
||||||
{
|
{
|
||||||
namespace Internal
|
namespace Internal
|
||||||
@@ -22,12 +24,20 @@ namespace AZStd
|
|||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
// thread
|
// thread
|
||||||
template <class F>
|
template<class F, class... Args, typename>
|
||||||
inline thread::thread(F&& f, const thread_desc* desc)
|
thread::thread(F&& f, Args&&... args)
|
||||||
|
: thread(thread_desc{}, AZStd::forward<F>(f), AZStd::forward<Args>(args)...)
|
||||||
|
{}
|
||||||
|
|
||||||
|
template<class F, class... Args>
|
||||||
|
thread::thread(const thread_desc& desc, F&& f, Args&&... args)
|
||||||
{
|
{
|
||||||
Internal::thread_info* ti = Internal::create_thread_info(AZStd::forward<F>(f));
|
auto threadfunc = [fn = AZStd::forward<F>(f), argsTuple = AZStd::make_tuple(AZStd::forward<Args>(args)...)]() mutable -> void
|
||||||
ti->m_name = desc ? desc->m_name : nullptr;
|
{
|
||||||
m_thread = Internal::create_thread(desc, ti);
|
AZStd::apply(AZStd::move(fn), AZStd::move(argsTuple));
|
||||||
|
};
|
||||||
|
Internal::thread_info* ti = Internal::create_thread_info(AZStd::move(threadfunc));
|
||||||
|
m_thread = Internal::create_thread(&desc, ti);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool thread::joinable() const
|
inline bool thread::joinable() const
|
||||||
|
|||||||
+15
-4
@@ -18,6 +18,8 @@ extern "C"
|
|||||||
AZ_DLL_IMPORT unsigned long __stdcall GetCurrentThreadId(void);
|
AZ_DLL_IMPORT unsigned long __stdcall GetCurrentThreadId(void);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#include <AzCore/std/tuple.h>
|
||||||
|
|
||||||
namespace AZStd
|
namespace AZStd
|
||||||
{
|
{
|
||||||
namespace Internal
|
namespace Internal
|
||||||
@@ -30,11 +32,20 @@ namespace AZStd
|
|||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
// thread
|
// thread
|
||||||
template <class F>
|
template<class F, class... Args, typename>
|
||||||
inline thread::thread(F&& f, const thread_desc* desc)
|
thread::thread(F&& f, Args&&... args)
|
||||||
|
: thread(thread_desc{}, AZStd::forward<F>(f), AZStd::forward<Args>(args)...)
|
||||||
|
{}
|
||||||
|
|
||||||
|
template<class F, class... Args>
|
||||||
|
thread::thread(const thread_desc& desc, F&& f, Args&&... args)
|
||||||
{
|
{
|
||||||
Internal::thread_info* ti = Internal::create_thread_info(AZStd::forward<F>(f));
|
auto threadfunc = [fn = AZStd::forward<F>(f), argsTuple = AZStd::make_tuple(AZStd::forward<Args>(args)...)]() mutable -> void
|
||||||
m_thread.m_handle = Internal::create_thread(desc, ti, &m_thread.m_id);
|
{
|
||||||
|
AZStd::apply(AZStd::move(fn), AZStd::move(argsTuple));
|
||||||
|
};
|
||||||
|
Internal::thread_info* ti = Internal::create_thread_info(AZStd::move(threadfunc));
|
||||||
|
m_thread.m_handle = Internal::create_thread(&desc, ti, &m_thread.m_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool thread::joinable() const
|
inline bool thread::joinable() const
|
||||||
|
|||||||
@@ -195,18 +195,18 @@ namespace UnitTest
|
|||||||
|
|
||||||
void test_thread_id_for_running_thread_is_not_default_constructed_id()
|
void test_thread_id_for_running_thread_is_not_default_constructed_id()
|
||||||
{
|
{
|
||||||
const thread_desc* desc = m_numThreadDesc ? &m_desc[0] : nullptr;
|
const thread_desc desc = m_numThreadDesc ? m_desc[0] : thread_desc{};
|
||||||
AZStd::thread t(AZStd::bind(&Parallel_Thread::do_nothing, this), desc);
|
AZStd::thread t(desc, AZStd::bind(&Parallel_Thread::do_nothing, this));
|
||||||
AZ_TEST_ASSERT(t.get_id() != AZStd::thread::id());
|
AZ_TEST_ASSERT(t.get_id() != AZStd::thread::id());
|
||||||
t.join();
|
t.join();
|
||||||
}
|
}
|
||||||
|
|
||||||
void test_different_threads_have_different_ids()
|
void test_different_threads_have_different_ids()
|
||||||
{
|
{
|
||||||
const thread_desc* desc1 = m_numThreadDesc ? &m_desc[0] : nullptr;
|
const thread_desc desc1 = m_numThreadDesc ? m_desc[0] : thread_desc{};
|
||||||
const thread_desc* desc2 = m_numThreadDesc ? &m_desc[1] : nullptr;
|
const thread_desc desc2 = m_numThreadDesc ? m_desc[1] : thread_desc{};
|
||||||
AZStd::thread t(AZStd::bind(&Parallel_Thread::do_nothing, this), desc1);
|
AZStd::thread t(desc1, AZStd::bind(&Parallel_Thread::do_nothing, this));
|
||||||
AZStd::thread t2(AZStd::bind(&Parallel_Thread::do_nothing, this), desc2);
|
AZStd::thread t2(desc2, AZStd::bind(&Parallel_Thread::do_nothing, this));
|
||||||
AZ_TEST_ASSERT(t.get_id() != t2.get_id());
|
AZ_TEST_ASSERT(t.get_id() != t2.get_id());
|
||||||
t.join();
|
t.join();
|
||||||
t2.join();
|
t2.join();
|
||||||
@@ -214,13 +214,13 @@ namespace UnitTest
|
|||||||
|
|
||||||
void test_thread_ids_have_a_total_order()
|
void test_thread_ids_have_a_total_order()
|
||||||
{
|
{
|
||||||
const thread_desc* desc1 = m_numThreadDesc ? &m_desc[0] : nullptr;
|
const thread_desc desc1 = m_numThreadDesc ? m_desc[0] : thread_desc{};
|
||||||
const thread_desc* desc2 = m_numThreadDesc ? &m_desc[1] : nullptr;
|
const thread_desc desc2 = m_numThreadDesc ? m_desc[1] : thread_desc{};
|
||||||
const thread_desc* desc3 = m_numThreadDesc ? &m_desc[2] : nullptr;
|
const thread_desc desc3 = m_numThreadDesc ? m_desc[2] : thread_desc{};
|
||||||
|
|
||||||
AZStd::thread t(AZStd::bind(&Parallel_Thread::do_nothing, this), desc1);
|
AZStd::thread t(desc1, AZStd::bind(&Parallel_Thread::do_nothing, this));
|
||||||
AZStd::thread t2(AZStd::bind(&Parallel_Thread::do_nothing, this), desc2);
|
AZStd::thread t2(desc2, AZStd::bind(&Parallel_Thread::do_nothing, this));
|
||||||
AZStd::thread t3(AZStd::bind(&Parallel_Thread::do_nothing, this), desc3);
|
AZStd::thread t3(desc3, AZStd::bind(&Parallel_Thread::do_nothing, this));
|
||||||
AZ_TEST_ASSERT(t.get_id() != t2.get_id());
|
AZ_TEST_ASSERT(t.get_id() != t2.get_id());
|
||||||
AZ_TEST_ASSERT(t.get_id() != t3.get_id());
|
AZ_TEST_ASSERT(t.get_id() != t3.get_id());
|
||||||
AZ_TEST_ASSERT(t2.get_id() != t3.get_id());
|
AZ_TEST_ASSERT(t2.get_id() != t3.get_id());
|
||||||
@@ -313,10 +313,10 @@ namespace UnitTest
|
|||||||
|
|
||||||
void test_thread_id_of_running_thread_returned_by_this_thread_get_id()
|
void test_thread_id_of_running_thread_returned_by_this_thread_get_id()
|
||||||
{
|
{
|
||||||
const thread_desc* desc1 = m_numThreadDesc ? &m_desc[0] : nullptr;
|
const thread_desc desc1 = m_numThreadDesc ? m_desc[0] : thread_desc{};
|
||||||
|
|
||||||
AZStd::thread::id id;
|
AZStd::thread::id id;
|
||||||
AZStd::thread t(AZStd::bind(&Parallel_Thread::get_thread_id, this, &id), desc1);
|
AZStd::thread t(desc1, AZStd::bind(&Parallel_Thread::get_thread_id, this, &id));
|
||||||
AZStd::thread::id t_id = t.get_id();
|
AZStd::thread::id t_id = t.get_id();
|
||||||
t.join();
|
t.join();
|
||||||
AZ_TEST_ASSERT(id == t_id);
|
AZ_TEST_ASSERT(id == t_id);
|
||||||
@@ -366,10 +366,10 @@ namespace UnitTest
|
|||||||
|
|
||||||
void test_move_on_construction()
|
void test_move_on_construction()
|
||||||
{
|
{
|
||||||
const thread_desc* desc1 = m_numThreadDesc ? &m_desc[0] : nullptr;
|
const thread_desc desc1 = m_numThreadDesc ? m_desc[0] : thread_desc{};
|
||||||
AZStd::thread::id the_id;
|
AZStd::thread::id the_id;
|
||||||
AZStd::thread x;
|
AZStd::thread x;
|
||||||
x = AZStd::thread(AZStd::bind(&Parallel_Thread::do_nothing_id, this, &the_id), desc1);
|
x = AZStd::thread(desc1, AZStd::bind(&Parallel_Thread::do_nothing_id, this, &the_id));
|
||||||
AZStd::thread::id x_id = x.get_id();
|
AZStd::thread::id x_id = x.get_id();
|
||||||
x.join();
|
x.join();
|
||||||
AZ_TEST_ASSERT(the_id == x_id);
|
AZ_TEST_ASSERT(the_id == x_id);
|
||||||
@@ -377,8 +377,8 @@ namespace UnitTest
|
|||||||
|
|
||||||
AZStd::thread make_thread(AZStd::thread::id* the_id)
|
AZStd::thread make_thread(AZStd::thread::id* the_id)
|
||||||
{
|
{
|
||||||
const thread_desc* desc1 = m_numThreadDesc ? &m_desc[0] : nullptr;
|
const thread_desc desc1 = m_numThreadDesc ? m_desc[0] : thread_desc{};
|
||||||
return AZStd::thread(AZStd::bind(&Parallel_Thread::do_nothing_id, this, the_id), desc1);
|
return AZStd::thread(desc1, AZStd::bind(&Parallel_Thread::do_nothing_id, this, the_id));
|
||||||
}
|
}
|
||||||
|
|
||||||
void test_move_from_function_return()
|
void test_move_from_function_return()
|
||||||
@@ -430,9 +430,9 @@ namespace UnitTest
|
|||||||
|
|
||||||
void do_test_creation()
|
void do_test_creation()
|
||||||
{
|
{
|
||||||
const thread_desc* desc1 = m_numThreadDesc ? &m_desc[0] : nullptr;
|
const thread_desc desc1 = m_numThreadDesc ? m_desc[0] : thread_desc{};
|
||||||
m_data = 0;
|
m_data = 0;
|
||||||
AZStd::thread t(AZStd::bind(&Parallel_Thread::simple_thread, this), desc1);
|
AZStd::thread t(desc1, AZStd::bind(&Parallel_Thread::simple_thread, this));
|
||||||
t.join();
|
t.join();
|
||||||
AZ_TEST_ASSERT(m_data == 999);
|
AZ_TEST_ASSERT(m_data == 999);
|
||||||
}
|
}
|
||||||
@@ -445,9 +445,9 @@ namespace UnitTest
|
|||||||
|
|
||||||
void do_test_id_comparison()
|
void do_test_id_comparison()
|
||||||
{
|
{
|
||||||
const thread_desc* desc1 = m_numThreadDesc ? &m_desc[0] : nullptr;
|
const thread_desc desc1 = m_numThreadDesc ? m_desc[0] : thread_desc{};
|
||||||
AZStd::thread::id self = this_thread::get_id();
|
AZStd::thread::id self = this_thread::get_id();
|
||||||
AZStd::thread thrd(AZStd::bind(&Parallel_Thread::comparison_thread, this, self), desc1);
|
AZStd::thread thrd(desc1, AZStd::bind(&Parallel_Thread::comparison_thread, this, self));
|
||||||
thrd.join();
|
thrd.join();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -476,10 +476,10 @@ namespace UnitTest
|
|||||||
|
|
||||||
void do_test_creation_through_reference_wrapper()
|
void do_test_creation_through_reference_wrapper()
|
||||||
{
|
{
|
||||||
const thread_desc* desc1 = m_numThreadDesc ? &m_desc[0] : nullptr;
|
const thread_desc desc1 = m_numThreadDesc ? m_desc[0] : thread_desc{};
|
||||||
non_copyable_functor f;
|
non_copyable_functor f;
|
||||||
|
|
||||||
AZStd::thread thrd(AZStd::ref(f), desc1);
|
AZStd::thread thrd(desc1, AZStd::ref(f));
|
||||||
thrd.join();
|
thrd.join();
|
||||||
AZ_TEST_ASSERT(f.value == 999);
|
AZ_TEST_ASSERT(f.value == 999);
|
||||||
}
|
}
|
||||||
@@ -491,10 +491,10 @@ namespace UnitTest
|
|||||||
|
|
||||||
void test_swap()
|
void test_swap()
|
||||||
{
|
{
|
||||||
const thread_desc* desc1 = m_numThreadDesc ? &m_desc[0] : nullptr;
|
const thread_desc desc1 = m_numThreadDesc ? m_desc[0] : thread_desc{};
|
||||||
const thread_desc* desc2 = m_numThreadDesc ? &m_desc[1] : nullptr;
|
const thread_desc desc2 = m_numThreadDesc ? m_desc[1] : thread_desc{};
|
||||||
AZStd::thread t(AZStd::bind(&Parallel_Thread::simple_thread, this), desc1);
|
AZStd::thread t(desc1, AZStd::bind(&Parallel_Thread::simple_thread, this));
|
||||||
AZStd::thread t2(AZStd::bind(&Parallel_Thread::simple_thread, this), desc2);
|
AZStd::thread t2(desc2, AZStd::bind(&Parallel_Thread::simple_thread, this));
|
||||||
AZStd::thread::id id1 = t.get_id();
|
AZStd::thread::id id1 = t.get_id();
|
||||||
AZStd::thread::id id2 = t2.get_id();
|
AZStd::thread::id id2 = t2.get_id();
|
||||||
|
|
||||||
@@ -512,7 +512,7 @@ namespace UnitTest
|
|||||||
|
|
||||||
void run()
|
void run()
|
||||||
{
|
{
|
||||||
const thread_desc* desc1 = m_numThreadDesc ? &m_desc[0] : nullptr;
|
const thread_desc desc1 = m_numThreadDesc ? m_desc[0] : thread_desc{};
|
||||||
|
|
||||||
// We need to have at least one processor
|
// We need to have at least one processor
|
||||||
AZ_TEST_ASSERT(AZStd::thread::hardware_concurrency() >= 1);
|
AZ_TEST_ASSERT(AZStd::thread::hardware_concurrency() >= 1);
|
||||||
@@ -520,18 +520,18 @@ namespace UnitTest
|
|||||||
// Create thread to increment data till we need to
|
// Create thread to increment data till we need to
|
||||||
m_data = 0;
|
m_data = 0;
|
||||||
m_dataMax = 10;
|
m_dataMax = 10;
|
||||||
AZStd::thread tr(AZStd::bind(&Parallel_Thread::increment_data, this), desc1);
|
AZStd::thread tr(desc1, AZStd::bind(&Parallel_Thread::increment_data, this));
|
||||||
tr.join();
|
tr.join();
|
||||||
AZ_TEST_ASSERT(m_data == m_dataMax);
|
AZ_TEST_ASSERT(m_data == m_dataMax);
|
||||||
|
|
||||||
m_data = 0;
|
m_data = 0;
|
||||||
AZStd::thread trDel(make_delegate(this, &Parallel_Thread::increment_data), desc1);
|
AZStd::thread trDel(desc1, make_delegate(this, &Parallel_Thread::increment_data));
|
||||||
trDel.join();
|
trDel.join();
|
||||||
AZ_TEST_ASSERT(m_data == m_dataMax);
|
AZ_TEST_ASSERT(m_data == m_dataMax);
|
||||||
|
|
||||||
chrono::system_clock::time_point startTime = chrono::system_clock::now();
|
chrono::system_clock::time_point startTime = chrono::system_clock::now();
|
||||||
{
|
{
|
||||||
AZStd::thread tr1(AZStd::bind(&Parallel_Thread::sleep_thread, this, chrono::milliseconds(100)), desc1);
|
AZStd::thread tr1(desc1, AZStd::bind(&Parallel_Thread::sleep_thread, this, chrono::milliseconds(100)));
|
||||||
tr1.join();
|
tr1.join();
|
||||||
}
|
}
|
||||||
auto sleepTime = chrono::system_clock::now() - startTime;
|
auto sleepTime = chrono::system_clock::now() - startTime;
|
||||||
@@ -563,71 +563,71 @@ namespace UnitTest
|
|||||||
{
|
{
|
||||||
MfTest x;
|
MfTest x;
|
||||||
AZStd::function<void ()> func = AZStd::bind(&MfTest::f0, &x);
|
AZStd::function<void ()> func = AZStd::bind(&MfTest::f0, &x);
|
||||||
AZStd::thread(func, desc1).join();
|
AZStd::thread(desc1, func).join();
|
||||||
func = AZStd::bind(&MfTest::f0, AZStd::ref(x));
|
func = AZStd::bind(&MfTest::f0, AZStd::ref(x));
|
||||||
AZStd::thread(func, desc1).join();
|
AZStd::thread(desc1, func).join();
|
||||||
func = AZStd::bind(&MfTest::g0, &x);
|
func = AZStd::bind(&MfTest::g0, &x);
|
||||||
AZStd::thread(func, desc1).join();
|
AZStd::thread(desc1, func).join();
|
||||||
func = AZStd::bind(&MfTest::g0, x);
|
func = AZStd::bind(&MfTest::g0, x);
|
||||||
AZStd::thread(func, desc1).join();
|
AZStd::thread(desc1, func).join();
|
||||||
func = AZStd::bind(&MfTest::g0, AZStd::ref(x));
|
func = AZStd::bind(&MfTest::g0, AZStd::ref(x));
|
||||||
AZStd::thread(func, desc1).join();
|
AZStd::thread(desc1, func).join();
|
||||||
|
|
||||||
//// 1
|
//// 1
|
||||||
//thread( AZStd::bind(&MfTest::f1, &x, 1) , desc1).join();
|
//thread( AZStd::bind(desc1, &MfTest::f1, &x, 1)).join();
|
||||||
//thread( AZStd::bind(&MfTest::f1, AZStd::ref(x), 1) , desc1).join();
|
//thread( AZStd::bind(desc1, &MfTest::f1, AZStd::ref(x), 1)).join();
|
||||||
//thread( AZStd::bind(&MfTest::g1, &x, 1) , desc1).join();
|
//thread( AZStd::bind(desc1, &MfTest::g1, &x, 1)).join();
|
||||||
//thread( AZStd::bind(&MfTest::g1, x, 1) , desc1).join();
|
//thread( AZStd::bind(desc1, &MfTest::g1, x, 1)).join();
|
||||||
//thread( AZStd::bind(&MfTest::g1, AZStd::ref(x), 1) , desc1).join();
|
//thread( AZStd::bind(desc1, &MfTest::g1, AZStd::ref(x), 1)).join();
|
||||||
|
|
||||||
//// 2
|
//// 2
|
||||||
//thread( AZStd::bind(&MfTest::f2, &x, 1, 2) , desc1).join();
|
//thread( AZStd::bind(desc1, &MfTest::f2, &x, 1, 2)).join();
|
||||||
//thread( AZStd::bind(&MfTest::f2, AZStd::ref(x), 1, 2) , desc1).join();
|
//thread( AZStd::bind(desc1, &MfTest::f2, AZStd::ref(x), 1, 2)).join();
|
||||||
//thread( AZStd::bind(&MfTest::g2, &x, 1, 2) , desc1).join();
|
//thread( AZStd::bind(desc1, &MfTest::g2, &x, 1, 2)).join();
|
||||||
//thread( AZStd::bind(&MfTest::g2, x, 1, 2) , desc1).join();
|
//thread( AZStd::bind(desc1, &MfTest::g2, x, 1, 2)).join();
|
||||||
//thread( AZStd::bind(&MfTest::g2, AZStd::ref(x), 1, 2) , desc1).join();
|
//thread( AZStd::bind(desc1, &MfTest::g2, AZStd::ref(x), 1, 2)).join();
|
||||||
|
|
||||||
//// 3
|
//// 3
|
||||||
//thread( AZStd::bind(&MfTest::f3, &x, 1, 2, 3) , desc1).join();
|
//thread( AZStd::bind(desc1, &MfTest::f3, &x, 1, 2, 3)).join();
|
||||||
//thread( AZStd::bind(&MfTest::f3, AZStd::ref(x), 1, 2, 3) , desc1).join();
|
//thread( AZStd::bind(desc1, &MfTest::f3, AZStd::ref(x), 1, 2, 3)).join();
|
||||||
//thread( AZStd::bind(&MfTest::g3, &x, 1, 2, 3) , desc1).join();
|
//thread( AZStd::bind(desc1, &MfTest::g3, &x, 1, 2, 3)).join();
|
||||||
//thread( AZStd::bind(&MfTest::g3, x, 1, 2, 3) , desc1).join();
|
//thread( AZStd::bind(desc1, &MfTest::g3, x, 1, 2, 3)).join();
|
||||||
//thread( AZStd::bind(&MfTest::g3, AZStd::ref(x), 1, 2, 3) , desc1).join();
|
//thread( AZStd::bind(desc1, &MfTest::g3, AZStd::ref(x), 1, 2, 3)).join();
|
||||||
|
|
||||||
//// 4
|
//// 4
|
||||||
//thread( AZStd::bind(&MfTest::f4, &x, 1, 2, 3, 4) , desc1).join();
|
//thread( AZStd::bind(desc1, &MfTest::f4, &x, 1, 2, 3, 4)).join();
|
||||||
//thread( AZStd::bind(&MfTest::f4, AZStd::ref(x), 1, 2, 3, 4) , desc1).join();
|
//thread( AZStd::bind(desc1, &MfTest::f4, AZStd::ref(x), 1, 2, 3, 4)).join();
|
||||||
//thread( AZStd::bind(&MfTest::g4, &x, 1, 2, 3, 4) , desc1).join();
|
//thread( AZStd::bind(desc1, &MfTest::g4, &x, 1, 2, 3, 4)).join();
|
||||||
//thread( AZStd::bind(&MfTest::g4, x, 1, 2, 3, 4) , desc1).join();
|
//thread( AZStd::bind(desc1, &MfTest::g4, x, 1, 2, 3, 4)).join();
|
||||||
//thread( AZStd::bind(&MfTest::g4, AZStd::ref(x), 1, 2, 3, 4) , desc1).join();
|
//thread( AZStd::bind(desc1, &MfTest::g4, AZStd::ref(x), 1, 2, 3, 4)).join();
|
||||||
|
|
||||||
//// 5
|
//// 5
|
||||||
//thread( AZStd::bind(&MfTest::f5, &x, 1, 2, 3, 4, 5) , desc1).join();
|
//thread( AZStd::bind(desc1, &MfTest::f5, &x, 1, 2, 3, 4, 5)).join();
|
||||||
//thread( AZStd::bind(&MfTest::f5, AZStd::ref(x), 1, 2, 3, 4, 5) , desc1).join();
|
//thread( AZStd::bind(desc1, &MfTest::f5, AZStd::ref(x), 1, 2, 3, 4, 5)).join();
|
||||||
//thread( AZStd::bind(&MfTest::g5, &x, 1, 2, 3, 4, 5) , desc1).join();
|
//thread( AZStd::bind(desc1, &MfTest::g5, &x, 1, 2, 3, 4, 5)).join();
|
||||||
//thread( AZStd::bind(&MfTest::g5, x, 1, 2, 3, 4, 5) , desc1).join();
|
//thread( AZStd::bind(desc1, &MfTest::g5, x, 1, 2, 3, 4, 5)).join();
|
||||||
//thread( AZStd::bind(&MfTest::g5, AZStd::ref(x), 1, 2, 3, 4, 5) , desc1).join();
|
//thread( AZStd::bind(desc1, &MfTest::g5, AZStd::ref(x), 1, 2, 3, 4, 5)).join();
|
||||||
|
|
||||||
//// 6
|
//// 6
|
||||||
//thread( AZStd::bind(&MfTest::f6, &x, 1, 2, 3, 4, 5, 6) , desc1).join();
|
//thread( AZStd::bind(desc1, &MfTest::f6, &x, 1, 2, 3, 4, 5, 6)).join();
|
||||||
//thread( AZStd::bind(&MfTest::f6, AZStd::ref(x), 1, 2, 3, 4, 5, 6) , desc1).join();
|
//thread( AZStd::bind(desc1, &MfTest::f6, AZStd::ref(x), 1, 2, 3, 4, 5, 6)).join();
|
||||||
//thread( AZStd::bind(&MfTest::g6, &x, 1, 2, 3, 4, 5, 6) , desc1).join();
|
//thread( AZStd::bind(desc1, &MfTest::g6, &x, 1, 2, 3, 4, 5, 6)).join();
|
||||||
//thread( AZStd::bind(&MfTest::g6, x, 1, 2, 3, 4, 5, 6) , desc1).join();
|
//thread( AZStd::bind(desc1, &MfTest::g6, x, 1, 2, 3, 4, 5, 6)).join();
|
||||||
//thread( AZStd::bind(&MfTest::g6, AZStd::ref(x), 1, 2, 3, 4, 5, 6) , desc1).join();
|
//thread( AZStd::bind(desc1, &MfTest::g6, AZStd::ref(x), 1, 2, 3, 4, 5, 6)).join();
|
||||||
|
|
||||||
//// 7
|
//// 7
|
||||||
//thread( AZStd::bind(&MfTest::f7, &x, 1, 2, 3, 4, 5, 6, 7), desc1).join();
|
//thread( AZStd::bind(desc1, &MfTest::f7, &x, 1, 2, 3, 4, 5, 6, 7)).join();
|
||||||
//thread( AZStd::bind(&MfTest::f7, AZStd::ref(x), 1, 2, 3, 4, 5, 6, 7), desc1).join();
|
//thread( AZStd::bind(desc1, &MfTest::f7, AZStd::ref(x), 1, 2, 3, 4, 5, 6, 7)).join();
|
||||||
//thread( AZStd::bind(&MfTest::g7, &x, 1, 2, 3, 4, 5, 6, 7), desc1).join();
|
//thread( AZStd::bind(desc1, &MfTest::g7, &x, 1, 2, 3, 4, 5, 6, 7)).join();
|
||||||
//thread( AZStd::bind(&MfTest::g7, x, 1, 2, 3, 4, 5, 6, 7), desc1).join();
|
//thread( AZStd::bind(desc1, &MfTest::g7, x, 1, 2, 3, 4, 5, 6, 7)).join();
|
||||||
//thread( AZStd::bind(&MfTest::g7, AZStd::ref(x), 1, 2, 3, 4, 5, 6, 7), desc1).join();
|
//thread( AZStd::bind(desc1, &MfTest::g7, AZStd::ref(x), 1, 2, 3, 4, 5, 6, 7)).join();
|
||||||
|
|
||||||
//// 8
|
//// 8
|
||||||
//thread( AZStd::bind(&MfTest::f8, &x, 1, 2, 3, 4, 5, 6, 7, 8) , desc1).join();
|
//thread( AZStd::bind(desc1, &MfTest::f8, &x, 1, 2, 3, 4, 5, 6, 7, 8)).join();
|
||||||
//thread( AZStd::bind(&MfTest::f8, AZStd::ref(x), 1, 2, 3, 4, 5, 6, 7, 8) , desc1).join();
|
//thread( AZStd::bind(desc1, &MfTest::f8, AZStd::ref(x), 1, 2, 3, 4, 5, 6, 7, 8)).join();
|
||||||
//thread( AZStd::bind(&MfTest::g8, &x, 1, 2, 3, 4, 5, 6, 7, 8) , desc1).join();
|
//thread( AZStd::bind(desc1, &MfTest::g8, &x, 1, 2, 3, 4, 5, 6, 7, 8)).join();
|
||||||
//thread( AZStd::bind(&MfTest::g8, x, 1, 2, 3, 4, 5, 6, 7, 8) , desc1).join();
|
//thread( AZStd::bind(desc1, &MfTest::g8, x, 1, 2, 3, 4, 5, 6, 7, 8)).join();
|
||||||
//thread( AZStd::bind(&MfTest::g8, AZStd::ref(x), 1, 2, 3, 4, 5, 6, 7, 8) , desc1).join();
|
//thread( AZStd::bind(desc1, &MfTest::g8, AZStd::ref(x), 1, 2, 3, 4, 5, 6, 7, 8)).join();
|
||||||
|
|
||||||
AZ_TEST_ASSERT(x.m_hash == 1366);
|
AZ_TEST_ASSERT(x.m_hash == 1366);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -151,7 +151,7 @@ namespace UnitTest
|
|||||||
AZStd::thread m_threads[m_maxNumThreads];
|
AZStd::thread m_threads[m_maxNumThreads];
|
||||||
for (unsigned int i = 0; i < m_maxNumThreads; ++i)
|
for (unsigned int i = 0; i < m_maxNumThreads; ++i)
|
||||||
{
|
{
|
||||||
m_threads[i] = AZStd::thread(AZStd::bind(&SystemAllocatorTest::ThreadFunc, this), &m_desc[i]);
|
m_threads[i] = AZStd::thread(m_desc[i], AZStd::bind(&SystemAllocatorTest::ThreadFunc, this));
|
||||||
// give some time offset to the threads so we can test alloc and dealloc at the same time.
|
// give some time offset to the threads so we can test alloc and dealloc at the same time.
|
||||||
//AZStd::this_thread::sleep_for(AZStd::chrono::microseconds(500));
|
//AZStd::this_thread::sleep_for(AZStd::chrono::microseconds(500));
|
||||||
}
|
}
|
||||||
@@ -286,7 +286,7 @@ namespace UnitTest
|
|||||||
AZStd::thread m_threads[m_maxNumThreads];
|
AZStd::thread m_threads[m_maxNumThreads];
|
||||||
for (unsigned int i = 0; i < m_maxNumThreads; ++i)
|
for (unsigned int i = 0; i < m_maxNumThreads; ++i)
|
||||||
{
|
{
|
||||||
m_threads[i] = AZStd::thread(AZStd::bind(&SystemAllocatorTest::ThreadFunc, this), &m_desc[i]);
|
m_threads[i] = AZStd::thread(m_desc[i], AZStd::bind(&SystemAllocatorTest::ThreadFunc, this));
|
||||||
// give some time offset to the threads so we can test alloc and dealloc at the same time.
|
// give some time offset to the threads so we can test alloc and dealloc at the same time.
|
||||||
AZStd::this_thread::sleep_for(AZStd::chrono::microseconds(500));
|
AZStd::this_thread::sleep_for(AZStd::chrono::microseconds(500));
|
||||||
}
|
}
|
||||||
@@ -724,7 +724,7 @@ namespace UnitTest
|
|||||||
AZStd::thread m_threads[m_maxNumThreads];
|
AZStd::thread m_threads[m_maxNumThreads];
|
||||||
for (unsigned int i = 0; i < m_maxNumThreads; ++i)
|
for (unsigned int i = 0; i < m_maxNumThreads; ++i)
|
||||||
{
|
{
|
||||||
m_threads[i] = AZStd::thread(AZStd::bind(&ThreadPoolAllocatorTest::AllocDeallocFunc, this), &m_desc[i]);
|
m_threads[i] = AZStd::thread(m_desc[i], AZStd::bind(&ThreadPoolAllocatorTest::AllocDeallocFunc, this));
|
||||||
}
|
}
|
||||||
|
|
||||||
for (unsigned int i = 0; i < m_maxNumThreads; ++i)
|
for (unsigned int i = 0; i < m_maxNumThreads; ++i)
|
||||||
@@ -743,12 +743,12 @@ namespace UnitTest
|
|||||||
|
|
||||||
for (unsigned int i = m_maxNumThreads/2; i <m_maxNumThreads; ++i)
|
for (unsigned int i = m_maxNumThreads/2; i <m_maxNumThreads; ++i)
|
||||||
{
|
{
|
||||||
m_threads[i] = AZStd::thread(AZStd::bind(&ThreadPoolAllocatorTest::SharedDeAlloc, this), &m_desc[i]);
|
m_threads[i] = AZStd::thread(m_desc[i], AZStd::bind(&ThreadPoolAllocatorTest::SharedDeAlloc, this));
|
||||||
}
|
}
|
||||||
|
|
||||||
for (unsigned int i = 0; i < m_maxNumThreads/2; ++i)
|
for (unsigned int i = 0; i < m_maxNumThreads/2; ++i)
|
||||||
{
|
{
|
||||||
m_threads[i] = AZStd::thread(AZStd::bind(&ThreadPoolAllocatorTest::SharedAlloc, this), &m_desc[i]);
|
m_threads[i] = AZStd::thread(m_desc[i], AZStd::bind(&ThreadPoolAllocatorTest::SharedAlloc, this));
|
||||||
}
|
}
|
||||||
|
|
||||||
for (unsigned int i = 0; i < m_maxNumThreads/2; ++i)
|
for (unsigned int i = 0; i < m_maxNumThreads/2; ++i)
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ namespace UnitTest
|
|||||||
AZ::AllocatorInstance<AZ::PoolAllocator>::Create();
|
AZ::AllocatorInstance<AZ::PoolAllocator>::Create();
|
||||||
AZ::AllocatorInstance<AZ::ThreadPoolAllocator>::Create();
|
AZ::AllocatorInstance<AZ::ThreadPoolAllocator>::Create();
|
||||||
|
|
||||||
m_executor = aznew TaskExecutor(4);
|
m_executor = aznew TaskExecutor();
|
||||||
}
|
}
|
||||||
|
|
||||||
void TearDown() override
|
void TearDown() override
|
||||||
@@ -236,6 +236,82 @@ namespace UnitTest
|
|||||||
EXPECT_EQ(x, 1);
|
EXPECT_EQ(x, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(TaskGraphTestFixture, SingleTask)
|
||||||
|
{
|
||||||
|
AZStd::atomic_int32_t x = 0;
|
||||||
|
|
||||||
|
TaskGraph graph;
|
||||||
|
graph.AddTask(
|
||||||
|
defaultTD,
|
||||||
|
[&x]
|
||||||
|
{
|
||||||
|
x = 1;
|
||||||
|
});
|
||||||
|
|
||||||
|
TaskGraphEvent ev;
|
||||||
|
graph.SubmitOnExecutor(*m_executor, &ev);
|
||||||
|
ev.Wait();
|
||||||
|
|
||||||
|
EXPECT_EQ(1, x);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
TEST_F(TaskGraphTestFixture, SingleTaskChain)
|
||||||
|
{
|
||||||
|
AZStd::atomic_int32_t x = 0;
|
||||||
|
|
||||||
|
TaskGraph graph;
|
||||||
|
auto a = graph.AddTask(
|
||||||
|
defaultTD,
|
||||||
|
[&x]
|
||||||
|
{
|
||||||
|
x += 1;
|
||||||
|
});
|
||||||
|
auto b = graph.AddTask(
|
||||||
|
defaultTD,
|
||||||
|
[&x]
|
||||||
|
{
|
||||||
|
x += 1;
|
||||||
|
});
|
||||||
|
b.Precedes(a);
|
||||||
|
|
||||||
|
TaskGraphEvent ev;
|
||||||
|
graph.SubmitOnExecutor(*m_executor, &ev);
|
||||||
|
ev.Wait();
|
||||||
|
|
||||||
|
EXPECT_EQ(2, x);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(TaskGraphTestFixture, MultipleIndependentTaskChains)
|
||||||
|
{
|
||||||
|
AZStd::atomic_int32_t x = 0;
|
||||||
|
constexpr int numChains = 5;
|
||||||
|
|
||||||
|
TaskGraph graph;
|
||||||
|
for( int i = 0; i < numChains; ++i)
|
||||||
|
{
|
||||||
|
auto a = graph.AddTask(
|
||||||
|
defaultTD,
|
||||||
|
[&x]
|
||||||
|
{
|
||||||
|
x += 1;
|
||||||
|
});
|
||||||
|
auto b = graph.AddTask(
|
||||||
|
defaultTD,
|
||||||
|
[&x]
|
||||||
|
{
|
||||||
|
x += 1;
|
||||||
|
});
|
||||||
|
b.Precedes(a);
|
||||||
|
}
|
||||||
|
|
||||||
|
TaskGraphEvent ev;
|
||||||
|
graph.SubmitOnExecutor(*m_executor, &ev);
|
||||||
|
ev.Wait();
|
||||||
|
|
||||||
|
EXPECT_EQ(2*numChains, x);
|
||||||
|
}
|
||||||
|
|
||||||
TEST_F(TaskGraphTestFixture, VariadicInterface)
|
TEST_F(TaskGraphTestFixture, VariadicInterface)
|
||||||
{
|
{
|
||||||
int x = 0;
|
int x = 0;
|
||||||
@@ -388,6 +464,7 @@ namespace UnitTest
|
|||||||
EXPECT_EQ(3, x);
|
EXPECT_EQ(3, x);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Waiting inside a task is disallowed , test that it fails correctly
|
||||||
TEST_F(TaskGraphTestFixture, SpawnSubgraph)
|
TEST_F(TaskGraphTestFixture, SpawnSubgraph)
|
||||||
{
|
{
|
||||||
AZStd::atomic<int> x = 0;
|
AZStd::atomic<int> x = 0;
|
||||||
@@ -434,7 +511,10 @@ namespace UnitTest
|
|||||||
f.Precedes(g);
|
f.Precedes(g);
|
||||||
TaskGraphEvent ev;
|
TaskGraphEvent ev;
|
||||||
subgraph.SubmitOnExecutor(*m_executor, &ev);
|
subgraph.SubmitOnExecutor(*m_executor, &ev);
|
||||||
|
// TaskGraphEvent::Wait asserts if called on a worker thread, suppress & validate assert
|
||||||
|
AZ_TEST_START_TRACE_SUPPRESSION;
|
||||||
ev.Wait();
|
ev.Wait();
|
||||||
|
AZ_TEST_STOP_TRACE_SUPPRESSION(1);
|
||||||
});
|
});
|
||||||
auto d = graph.AddTask(
|
auto d = graph.AddTask(
|
||||||
defaultTD,
|
defaultTD,
|
||||||
@@ -464,8 +544,6 @@ namespace UnitTest
|
|||||||
TaskGraphEvent ev;
|
TaskGraphEvent ev;
|
||||||
graph.SubmitOnExecutor(*m_executor, &ev);
|
graph.SubmitOnExecutor(*m_executor, &ev);
|
||||||
ev.Wait();
|
ev.Wait();
|
||||||
|
|
||||||
EXPECT_EQ(3 | 0b100000, x);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(TaskGraphTestFixture, RetainedGraph)
|
TEST_F(TaskGraphTestFixture, RetainedGraph)
|
||||||
|
|||||||
@@ -28,6 +28,7 @@
|
|||||||
#include <AzCore/NativeUI/NativeUISystemComponent.h>
|
#include <AzCore/NativeUI/NativeUISystemComponent.h>
|
||||||
#include <AzCore/Module/ModuleManagerBus.h>
|
#include <AzCore/Module/ModuleManagerBus.h>
|
||||||
#include <AzCore/Interface/Interface.h>
|
#include <AzCore/Interface/Interface.h>
|
||||||
|
#include <AzCore/Task/TaskGraphSystemComponent.h>
|
||||||
|
|
||||||
#include <AzFramework/Asset/SimpleAsset.h>
|
#include <AzFramework/Asset/SimpleAsset.h>
|
||||||
#include <AzFramework/Asset/AssetBundleManifest.h>
|
#include <AzFramework/Asset/AssetBundleManifest.h>
|
||||||
@@ -295,6 +296,7 @@ namespace AzFramework
|
|||||||
azrtti_typeid<AZ::ScriptSystemComponent>(),
|
azrtti_typeid<AZ::ScriptSystemComponent>(),
|
||||||
azrtti_typeid<AZ::JobManagerComponent>(),
|
azrtti_typeid<AZ::JobManagerComponent>(),
|
||||||
azrtti_typeid<AZ::SliceSystemComponent>(),
|
azrtti_typeid<AZ::SliceSystemComponent>(),
|
||||||
|
azrtti_typeid<AZ::TaskGraphSystemComponent>(),
|
||||||
|
|
||||||
azrtti_typeid<AzFramework::AssetCatalogComponent>(),
|
azrtti_typeid<AzFramework::AssetCatalogComponent>(),
|
||||||
azrtti_typeid<AzFramework::CustomAssetTypeComponent>(),
|
azrtti_typeid<AzFramework::CustomAssetTypeComponent>(),
|
||||||
@@ -477,14 +479,16 @@ namespace AzFramework
|
|||||||
newThreadDesc.m_cpuId = AFFINITY_MASK_USERTHREADS;
|
newThreadDesc.m_cpuId = AFFINITY_MASK_USERTHREADS;
|
||||||
newThreadDesc.m_name = newThreadName;
|
newThreadDesc.m_name = newThreadName;
|
||||||
AZStd::binary_semaphore binarySemaphore;
|
AZStd::binary_semaphore binarySemaphore;
|
||||||
AZStd::thread newThread([&workForNewThread, &binarySemaphore, &newThreadName]
|
AZStd::thread newThread(
|
||||||
{
|
newThreadDesc,
|
||||||
AZ_PROFILE_SCOPE(AzFramework,
|
[&workForNewThread, &binarySemaphore, &newThreadName]
|
||||||
"Application::PumpSystemEventLoopWhileDoingWorkInNewThread:ThreadWorker %s", newThreadName);
|
{
|
||||||
|
AZ_PROFILE_SCOPE(AzFramework,
|
||||||
|
"Application::PumpSystemEventLoopWhileDoingWorkInNewThread:ThreadWorker %s", newThreadName);
|
||||||
|
|
||||||
workForNewThread();
|
workForNewThread();
|
||||||
binarySemaphore.release();
|
binarySemaphore.release();
|
||||||
}, &newThreadDesc);
|
});
|
||||||
while (!binarySemaphore.try_acquire_for(eventPumpFrequency))
|
while (!binarySemaphore.try_acquire_for(eventPumpFrequency))
|
||||||
{
|
{
|
||||||
PumpSystemEventLoopUntilEmpty();
|
PumpSystemEventLoopUntilEmpty();
|
||||||
|
|||||||
@@ -1631,7 +1631,20 @@ namespace AZ::IO
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
ZipDir::CacheFactory factory(ZipDir::ZD_INIT_FAST, nFactoryFlags);
|
ZipDir::InitMethod initType = ZipDir::InitMethod::Default;
|
||||||
|
if (!ZipDir::IsReleaseConfig)
|
||||||
|
{
|
||||||
|
if ((nFlags & INestedArchive::FLAGS_FULL_VALIDATE) != 0)
|
||||||
|
{
|
||||||
|
initType = ZipDir::InitMethod::FullValidation;
|
||||||
|
}
|
||||||
|
else if ((nFlags & INestedArchive::FLAGS_VALIDATE_HEADERS) != 0)
|
||||||
|
{
|
||||||
|
initType = ZipDir::InitMethod::ValidateHeaders;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ZipDir::CacheFactory factory(initType, nFactoryFlags);
|
||||||
|
|
||||||
ZipDir::CachePtr cache = factory.New(szFullPath->c_str());
|
ZipDir::CachePtr cache = factory.New(szFullPath->c_str());
|
||||||
if (cache)
|
if (cache)
|
||||||
|
|||||||
@@ -11,7 +11,9 @@
|
|||||||
|
|
||||||
#include <AzCore/IO/Path/Path_fwd.h>
|
#include <AzCore/IO/Path/Path_fwd.h>
|
||||||
#include <AzCore/Math/Crc.h>
|
#include <AzCore/Math/Crc.h>
|
||||||
|
#include <AzCore/std/containers/vector.h>
|
||||||
#include <AzCore/std/smart_ptr/intrusive_base.h>
|
#include <AzCore/std/smart_ptr/intrusive_base.h>
|
||||||
|
#include <AzCore/std/string/string.h>
|
||||||
#include <AzFramework/Archive/Codec.h>
|
#include <AzFramework/Archive/Codec.h>
|
||||||
|
|
||||||
namespace AZ::IO
|
namespace AZ::IO
|
||||||
@@ -71,6 +73,13 @@ namespace AZ::IO
|
|||||||
// multiple times
|
// multiple times
|
||||||
FLAGS_DONT_COMPACT = 1 << 5,
|
FLAGS_DONT_COMPACT = 1 << 5,
|
||||||
|
|
||||||
|
// if this is set, validate header data when opening the archive
|
||||||
|
FLAGS_VALIDATE_HEADERS = 1 << 9,
|
||||||
|
|
||||||
|
// if this is set, validate header data when opening the archive and validate CRCs when decompressing
|
||||||
|
// & reading files.
|
||||||
|
FLAGS_FULL_VALIDATE = 1 << 10,
|
||||||
|
|
||||||
// Disable a pak file without unloading it, this flag is used in combination with patches and multiplayer
|
// Disable a pak file without unloading it, this flag is used in combination with patches and multiplayer
|
||||||
// to ensure that specific paks stay in the position(to keep the same priority) but being disabled
|
// to ensure that specific paks stay in the position(to keep the same priority) but being disabled
|
||||||
// when running multiplayer
|
// when running multiplayer
|
||||||
@@ -128,6 +137,10 @@ namespace AZ::IO
|
|||||||
// Deletes all files and directories in the archive.
|
// Deletes all files and directories in the archive.
|
||||||
virtual int RemoveAll() = 0;
|
virtual int RemoveAll() = 0;
|
||||||
|
|
||||||
|
// Summary:
|
||||||
|
// Lists all the files in the archive.
|
||||||
|
virtual int ListAllFiles(AZStd::vector<AZ::IO::Path>& outFileEntries) = 0;
|
||||||
|
|
||||||
// Summary:
|
// Summary:
|
||||||
// Finds the file; you don't have to close the returned handle.
|
// Finds the file; you don't have to close the returned handle.
|
||||||
// Returns:
|
// Returns:
|
||||||
|
|||||||
@@ -89,11 +89,51 @@ namespace AZ::IO
|
|||||||
return m_pCache->RemoveDir(fullPath);
|
return m_pCache->RemoveDir(fullPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
int NestedArchive::RemoveAll()
|
int NestedArchive::RemoveAll()
|
||||||
{
|
{
|
||||||
return m_pCache->RemoveAll();
|
return m_pCache->RemoveAll();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
// Helper for 'ListAllFiles' to recursively traverse the FileEntryTree and gather all the files
|
||||||
|
void EnumerateFilesRecursive(AZ::IO::Path currentPath, ZipDir::FileEntryTree* currentTree, AZStd::vector<AZ::IO::Path>& fileList)
|
||||||
|
{
|
||||||
|
// Drill down directories first...
|
||||||
|
for (auto dirIter = currentTree->GetDirBegin(); dirIter != currentTree->GetDirEnd(); ++dirIter)
|
||||||
|
{
|
||||||
|
if (ZipDir::FileEntryTree* subTree = currentTree->GetDirEntry(dirIter);
|
||||||
|
subTree != nullptr)
|
||||||
|
{
|
||||||
|
EnumerateFilesRecursive(currentPath / currentTree->GetDirName(dirIter), subTree, fileList);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Then enumerate the files in current directory...
|
||||||
|
for (auto fileIter = currentTree->GetFileBegin(); fileIter != currentTree->GetFileEnd(); ++fileIter)
|
||||||
|
{
|
||||||
|
fileList.emplace_back(currentPath / currentTree->GetFileName(fileIter));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
// lists all files in the archive
|
||||||
|
int NestedArchive::ListAllFiles(AZStd::vector<AZ::IO::Path>& outFileEntries)
|
||||||
|
{
|
||||||
|
AZStd::vector<AZ::IO::Path> filesInArchive;
|
||||||
|
|
||||||
|
ZipDir::FileEntryTree* tree = m_pCache->GetRoot();
|
||||||
|
if (!tree)
|
||||||
|
{
|
||||||
|
return ZipDir::ZD_ERROR_UNEXPECTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
EnumerateFilesRecursive(AZ::IO::Path{ AZ::IO::PosixPathSeparator }, tree, filesInArchive);
|
||||||
|
|
||||||
|
AZStd::swap(outFileEntries, filesInArchive);
|
||||||
|
return ZipDir::ZD_ERROR_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
// Adds a new file to the zip or update an existing one
|
// Adds a new file to the zip or update an existing one
|
||||||
// adds a directory (creates several nested directories if needed)
|
// adds a directory (creates several nested directories if needed)
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ namespace AZ::IO
|
|||||||
|
|
||||||
NestedArchive(IArchive* pArchive, AZStd::string_view strBindRoot, ZipDir::CachePtr pCache, uint32_t nFlags = 0);
|
NestedArchive(IArchive* pArchive, AZStd::string_view strBindRoot, ZipDir::CachePtr pCache, uint32_t nFlags = 0);
|
||||||
~NestedArchive() override;
|
~NestedArchive() override;
|
||||||
|
|
||||||
auto GetRootFolderHandle() -> Handle override;
|
auto GetRootFolderHandle() -> Handle override;
|
||||||
|
|
||||||
// Adds a new file to the zip or update an existing one
|
// Adds a new file to the zip or update an existing one
|
||||||
@@ -68,6 +68,9 @@ namespace AZ::IO
|
|||||||
// deletes all files from the archive
|
// deletes all files from the archive
|
||||||
int RemoveAll() override;
|
int RemoveAll() override;
|
||||||
|
|
||||||
|
// lists all the files in the archive
|
||||||
|
int ListAllFiles(AZStd::vector<AZ::IO::Path>& outFileEntries) override;
|
||||||
|
|
||||||
// finds the file; you don't have to close the returned handle
|
// finds the file; you don't have to close the returned handle
|
||||||
Handle FindFile(AZStd::string_view szRelativePath) override;
|
Handle FindFile(AZStd::string_view szRelativePath) override;
|
||||||
|
|
||||||
@@ -79,7 +82,6 @@ namespace AZ::IO
|
|||||||
|
|
||||||
// returns the full path to the archive file
|
// returns the full path to the archive file
|
||||||
AZ::IO::PathView GetFullPath() const override;
|
AZ::IO::PathView GetFullPath() const override;
|
||||||
ZipDir::Cache* GetCache();
|
|
||||||
|
|
||||||
uint32_t GetFlags() const override;
|
uint32_t GetFlags() const override;
|
||||||
bool SetFlags(uint32_t nFlagsToSet) override;
|
bool SetFlags(uint32_t nFlagsToSet) override;
|
||||||
@@ -87,12 +89,15 @@ namespace AZ::IO
|
|||||||
|
|
||||||
bool SetPackAccessible(bool bAccessible) override;
|
bool SetPackAccessible(bool bAccessible) override;
|
||||||
|
|
||||||
|
ZipDir::Cache* GetCache();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
// returns the pointer to the relative file path to be passed
|
// returns the pointer to the relative file path to be passed
|
||||||
// to the underlying Cache pointer. Uses the given buffer to construct the path.
|
// to the underlying Cache pointer. Uses the given buffer to construct the path.
|
||||||
// returns nullptr if the file path is invalid
|
// returns nullptr if the file path is invalid
|
||||||
AZ::IO::FixedMaxPathString AdjustPath(AZStd::string_view szRelativePath);
|
AZ::IO::FixedMaxPathString AdjustPath(AZStd::string_view szRelativePath);
|
||||||
|
|
||||||
|
|
||||||
ZipDir::CachePtr m_pCache;
|
ZipDir::CachePtr m_pCache;
|
||||||
// the binding root may be empty string - in this case, the absolute path binding won't work
|
// the binding root may be empty string - in this case, the absolute path binding won't work
|
||||||
AZ::IO::Path m_strBindRoot;
|
AZ::IO::Path m_strBindRoot;
|
||||||
|
|||||||
@@ -101,10 +101,11 @@ namespace AZ::IO::ZipDir
|
|||||||
FileEntry* operator -> () { return m_pFileEntry; }
|
FileEntry* operator -> () { return m_pFileEntry; }
|
||||||
FileEntryTransactionAdd(Cache* pCache, AZStd::string_view szRelativePath)
|
FileEntryTransactionAdd(Cache* pCache, AZStd::string_view szRelativePath)
|
||||||
: m_pCache(pCache)
|
: m_pCache(pCache)
|
||||||
|
, m_szRelativePath(AZ::IO::PosixPathSeparator)
|
||||||
, m_bCommitted(false)
|
, m_bCommitted(false)
|
||||||
{
|
{
|
||||||
// Update the cache string pool with the relative path to the file
|
// Update the cache string pool with the relative path to the file
|
||||||
auto pathIt = m_pCache->m_relativePathPool.emplace(AZ::IO::PathView(szRelativePath).LexicallyNormal());
|
auto pathIt = m_pCache->m_relativePathPool.emplace(AZ::IO::PathView(szRelativePath, AZ::IO::PosixPathSeparator).LexicallyNormal());
|
||||||
m_szRelativePath = *pathIt.first;
|
m_szRelativePath = *pathIt.first;
|
||||||
// this is the name of the directory - create it or find it
|
// this is the name of the directory - create it or find it
|
||||||
m_pFileEntry = m_pCache->GetRoot()->Add(m_szRelativePath.Native());
|
m_pFileEntry = m_pCache->GetRoot()->Add(m_szRelativePath.Native());
|
||||||
@@ -740,6 +741,16 @@ namespace AZ::IO::ZipDir
|
|||||||
{
|
{
|
||||||
return ZD_ERROR_CORRUPTED_DATA;
|
return ZD_ERROR_CORRUPTED_DATA;
|
||||||
}
|
}
|
||||||
|
if (pFileEntry->bCheckCRCNextRead)
|
||||||
|
{
|
||||||
|
pFileEntry->bCheckCRCNextRead = false;
|
||||||
|
uLong uCRC32 = AZ::Crc32((Bytef*)pUncompressed, nSizeUncompressed);
|
||||||
|
if (uCRC32 != pFileEntry->desc.lCRC32)
|
||||||
|
{
|
||||||
|
AZ_Warning("Archive", false, "ZD_ERROR_CRC32_CHECK: Uncompressed stream CRC32 check failed");
|
||||||
|
return ZD_ERROR_CRC32_CHECK;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ namespace AZ::IO::ZipDir
|
|||||||
// this sets the window size of the blocks of data read from the end of the file to find the Central Directory Record
|
// this sets the window size of the blocks of data read from the end of the file to find the Central Directory Record
|
||||||
// since normally there are no
|
// since normally there are no
|
||||||
static constexpr size_t CDRSearchWindowSize = 0x100;
|
static constexpr size_t CDRSearchWindowSize = 0x100;
|
||||||
CacheFactory::CacheFactory(InitMethodEnum nInitMethod, uint32_t nFlags)
|
CacheFactory::CacheFactory(InitMethod nInitMethod, uint32_t nFlags)
|
||||||
{
|
{
|
||||||
m_nCDREndPos = 0;
|
m_nCDREndPos = 0;
|
||||||
m_bBuildFileEntryMap = false; // we only need it for validation/debugging
|
m_bBuildFileEntryMap = false; // we only need it for validation/debugging
|
||||||
@@ -448,7 +448,6 @@ namespace AZ::IO::ZipDir
|
|||||||
// builds up the m_mapFileEntries
|
// builds up the m_mapFileEntries
|
||||||
bool CacheFactory::BuildFileEntryMap()
|
bool CacheFactory::BuildFileEntryMap()
|
||||||
{
|
{
|
||||||
|
|
||||||
Seek(m_CDREnd.lCDROffset);
|
Seek(m_CDREnd.lCDROffset);
|
||||||
|
|
||||||
if (m_CDREnd.lCDRSize == 0)
|
if (m_CDREnd.lCDRSize == 0)
|
||||||
@@ -530,14 +529,6 @@ namespace AZ::IO::ZipDir
|
|||||||
{
|
{
|
||||||
// Add this file entry.
|
// Add this file entry.
|
||||||
char* str = reinterpret_cast<char*>(pFileName);
|
char* str = reinterpret_cast<char*>(pFileName);
|
||||||
for (int i = 0; i < pFile->nFileNameLength; i++)
|
|
||||||
{
|
|
||||||
str[i] = std::tolower(str[i], std::locale());
|
|
||||||
if (str[i] == AZ_WRONG_FILESYSTEM_SEPARATOR)
|
|
||||||
{
|
|
||||||
str[i] = AZ_CORRECT_FILESYSTEM_SEPARATOR;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
str[pFile->nFileNameLength] = 0; // Not standard!, may overwrite signature of the next memory record data in zip.
|
str[pFile->nFileNameLength] = 0; // Not standard!, may overwrite signature of the next memory record data in zip.
|
||||||
AddFileEntry(str, pFile, extra);
|
AddFileEntry(str, pFile, extra);
|
||||||
}
|
}
|
||||||
@@ -574,11 +565,7 @@ namespace AZ::IO::ZipDir
|
|||||||
|
|
||||||
FileEntryBase fileEntry(*pFileHeader, extra);
|
FileEntryBase fileEntry(*pFileHeader, extra);
|
||||||
|
|
||||||
// when using encrypted headers we should always initialize data offsets from CDR
|
InitDataOffset(fileEntry, pFileHeader);
|
||||||
if ((m_encryptedHeaders != ZipFile::HEADERS_NOT_ENCRYPTED || m_nInitMethod >= ZD_INIT_FULL) && pFileHeader->desc.lSizeCompressed)
|
|
||||||
{
|
|
||||||
InitDataOffset(fileEntry, pFileHeader);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (m_bBuildFileEntryMap)
|
if (m_bBuildFileEntryMap)
|
||||||
{
|
{
|
||||||
@@ -606,142 +593,81 @@ namespace AZ::IO::ZipDir
|
|||||||
{
|
{
|
||||||
Seek(pFileHeader->lLocalHeaderOffset);
|
Seek(pFileHeader->lLocalHeaderOffset);
|
||||||
|
|
||||||
// read the local file header and the name (for validation) into the buffer
|
// Read only the LocalFileHeader w/ no additional bytes ('name' or 'extra' fields)
|
||||||
AZStd::vector<char>pBuffer;
|
AZStd::vector<char> buffer;
|
||||||
uint32_t nBufferLength = sizeof(ZipFile::LocalFileHeader) + pFileHeader->nFileNameLength;
|
uint32_t bufferLen = sizeof(ZipFile::LocalFileHeader);
|
||||||
pBuffer.resize(nBufferLength);
|
buffer.resize_no_construct(bufferLen);
|
||||||
Read(&pBuffer[0], nBufferLength);
|
Read(buffer.data(), bufferLen);
|
||||||
|
|
||||||
// validate the local file header (compare with the CDR file header - they should contain basically the same information)
|
const auto* localFileHeader = reinterpret_cast<const ZipFile::LocalFileHeader*>(buffer.data());
|
||||||
const auto* pLocalFileHeader = reinterpret_cast<const ZipFile::LocalFileHeader*>(&pBuffer[0]);
|
|
||||||
if (pFileHeader->desc != pLocalFileHeader->desc
|
// set the correct file data offset...
|
||||||
|| pFileHeader->nMethod != pLocalFileHeader->nMethod
|
fileEntry.nFileDataOffset = pFileHeader->lLocalHeaderOffset + sizeof(ZipFile::LocalFileHeader) +
|
||||||
|| pFileHeader->nFileNameLength != pLocalFileHeader->nFileNameLength
|
localFileHeader->nFileNameLength + localFileHeader->nExtraFieldLength;
|
||||||
// for a tough validation, we can compare the timestamps of the local and central directory entries
|
|
||||||
// but we won't do that for backward compatibility with ZipDir
|
fileEntry.nEOFOffset = fileEntry.nFileDataOffset + fileEntry.desc.lSizeCompressed;
|
||||||
//|| pFileHeader->nLastModDate != pLocalFileHeader->nLastModDate
|
|
||||||
//|| pFileHeader->nLastModTime != pLocalFileHeader->nLastModTime
|
if (m_nInitMethod != ZipDir::InitMethod::Default)
|
||||||
)
|
|
||||||
{
|
{
|
||||||
AZ_Warning("Archive", false, "ZD_ERROR_VALIDATION_FAILED:"
|
if (m_nInitMethod == ZipDir::InitMethod::FullValidation)
|
||||||
" The local file header descriptor doesn't match the basic parameters declared in the global file header in the file."
|
{
|
||||||
" The archive content is misconsistent and may be damaged. Please try to repair the archive");
|
// Mark the FileEntry to check CRC when the next read occurs
|
||||||
return;
|
fileEntry.bCheckCRCNextRead = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Timestamps
|
||||||
|
if (pFileHeader->nLastModDate != localFileHeader->nLastModDate
|
||||||
|
|| pFileHeader->nLastModTime != localFileHeader->nLastModTime)
|
||||||
|
{
|
||||||
|
AZ_Warning("Archive", false, "ZD_ERROR_VALIDATION_FAILED: (%s)\n"
|
||||||
|
" The local file header's modification timestamps don't match that of the global file header in the archive."
|
||||||
|
" The archive timestamps are inconsistent and may be damaged. Check the archive file.", m_szFilename.c_str());
|
||||||
|
// don't return here, it may be ok.
|
||||||
|
}
|
||||||
|
|
||||||
|
// Validate data
|
||||||
|
if (pFileHeader->desc != localFileHeader->desc // this checks CRCs and compressed/uncompressed sizes
|
||||||
|
|| pFileHeader->nMethod != localFileHeader->nMethod
|
||||||
|
|| pFileHeader->nFileNameLength != localFileHeader->nFileNameLength)
|
||||||
|
{
|
||||||
|
AZ_Warning("Archive", false, "ZD_ERROR_VALIDATION_FAILED: (%s)\n"
|
||||||
|
" The local file header descriptor doesn't match basic parameters declared in the global file header in the file."
|
||||||
|
" The archive content is inconsistent and may be damaged. Please try to repair the archive.", m_szFilename.c_str());
|
||||||
|
// return here because further checks aren't worse than this.
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read extra data
|
||||||
|
uint32_t extraDataLen = localFileHeader->nFileNameLength + localFileHeader->nExtraFieldLength;
|
||||||
|
buffer.resize_no_construct(buffer.size() + extraDataLen);
|
||||||
|
Read(buffer.data() + buffer.size(), extraDataLen);
|
||||||
|
|
||||||
|
// Compare local file name with the CDR file name, they should match
|
||||||
|
AZStd::string_view zipFileName{ buffer.data() + sizeof(ZipFile::LocalFileHeader), localFileHeader->nFileNameLength };
|
||||||
|
AZStd::string_view cdrFileName{ reinterpret_cast<const char*>(pFileHeader + 1), pFileHeader->nFileNameLength };
|
||||||
|
if (zipFileName != cdrFileName)
|
||||||
|
{
|
||||||
|
AZ_Warning("Archive", false, "ZD_ERROR_VALIDATION_FAILED: (%s)\n"
|
||||||
|
" The file name in the local file header doesn't match the name in the global file header."
|
||||||
|
" The archive content is inconsisten with the directory. Please check the archive.", m_szFilename.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
// CDR and local "extra field" lengths may be different, should we compare them if they are equal?
|
||||||
|
|
||||||
|
// make sure it's the same file and the fileEntry structure is properly initialized
|
||||||
|
AZ_Assert(fileEntry.nFileHeaderOffset == pFileHeader->lLocalHeaderOffset,
|
||||||
|
"The file entry header offset doesn't match the file header local offst (%s)", m_szFilename.c_str());
|
||||||
|
|
||||||
|
if (fileEntry.nFileDataOffset >= m_nCDREndPos)
|
||||||
|
{
|
||||||
|
AZ_Warning("Archive", false, "ZD_ERROR_VALIDATION_FAILED: (%s)\n"
|
||||||
|
" The global file header declares the file which crosses the boundaries of the archive."
|
||||||
|
" The archive is either corrupted or truncated, please try to repair it", m_szFilename.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
// End Validation
|
||||||
}
|
}
|
||||||
|
|
||||||
// now compare the local file name with the one recorded in CDR: they must match.
|
|
||||||
auto CompareNoCase = [](const char lhs, const char rhs) { return std::tolower(lhs, std::locale()) == std::tolower(rhs, std::locale()); };
|
|
||||||
auto zipFileDataBegin = pBuffer.begin() + sizeof(ZipFile::LocalFileHeader);
|
|
||||||
auto zipFileDataEnd = zipFileDataBegin + pFileHeader->nFileNameLength;
|
|
||||||
if (!AZStd::equal(zipFileDataBegin, zipFileDataEnd, reinterpret_cast<const char*>(pFileHeader + 1), CompareNoCase))
|
|
||||||
{
|
|
||||||
// either file name, or the extra field do not match
|
|
||||||
AZ_Warning("Archive", false, "ZD_ERROR_VALIDATION_FAILED:"
|
|
||||||
" The local file header contains file name which does not match the file name of the global file header."
|
|
||||||
" The archive content is misconsistent with its directory. Please repair the archive");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
fileEntry.nFileDataOffset = pFileHeader->lLocalHeaderOffset + sizeof(ZipFile::LocalFileHeader) + pLocalFileHeader->nFileNameLength + pLocalFileHeader->nExtraFieldLength;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// make sure it's the same file and the fileEntry structure is properly initialized
|
|
||||||
AZ_Assert(fileEntry.nFileHeaderOffset == pFileHeader->lLocalHeaderOffset, "The file entry header offset doesn't match the file header local offst");
|
|
||||||
|
|
||||||
fileEntry.nEOFOffset = fileEntry.nFileDataOffset + fileEntry.desc.lSizeCompressed;
|
|
||||||
|
|
||||||
if (fileEntry.nFileDataOffset >= m_nCDREndPos)
|
|
||||||
{
|
|
||||||
AZ_Warning("Archive", false, "ZD_ERROR_VALIDATION_FAILED:"
|
|
||||||
" The global file header declares the file which crosses the boundaries of the archive."
|
|
||||||
" The archive is either corrupted or truncated, please try to repair it");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (m_nInitMethod >= ZD_INIT_VALIDATE)
|
|
||||||
{
|
|
||||||
Validate(fileEntry);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
|
||||||
// reads the file pointed by the given header and entry (they must be coherent)
|
|
||||||
// and decompresses it; then calculates and validates its CRC32
|
|
||||||
void CacheFactory::Validate(const FileEntryBase& fileEntry)
|
|
||||||
{
|
|
||||||
AZStd::vector<char> pBuffer;
|
|
||||||
// validate the file contents
|
|
||||||
// allocate memory for both the compressed data and uncompressed data
|
|
||||||
pBuffer.resize(fileEntry.desc.lSizeCompressed + fileEntry.desc.lSizeUncompressed);
|
|
||||||
char* pUncompressed = &pBuffer[fileEntry.desc.lSizeCompressed];
|
|
||||||
char* pCompressed = &pBuffer[0];
|
|
||||||
|
|
||||||
AZ_Assert(fileEntry.nFileDataOffset != FileEntry::INVALID_DATA_OFFSET, "File entry has invalid data offset of %" PRIx32, FileEntry::INVALID_DATA_OFFSET);
|
|
||||||
Seek(fileEntry.nFileDataOffset);
|
|
||||||
|
|
||||||
Read(pCompressed, fileEntry.desc.lSizeCompressed);
|
|
||||||
|
|
||||||
size_t nDestSize = fileEntry.desc.lSizeUncompressed;
|
|
||||||
int nError = Z_OK;
|
|
||||||
if (fileEntry.nMethod)
|
|
||||||
{
|
|
||||||
nError = ZipRawUncompress(pUncompressed, &nDestSize, pCompressed, fileEntry.desc.lSizeCompressed);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
AZ_Assert(fileEntry.desc.lSizeCompressed == fileEntry.desc.lSizeUncompressed, "Uncompressed file does not have the same commpressed %u and uncompressed file sizes %u",
|
|
||||||
fileEntry.desc.lSizeCompressed, fileEntry.desc.lSizeUncompressed);
|
|
||||||
memcpy(pUncompressed, pCompressed, fileEntry.desc.lSizeUncompressed);
|
|
||||||
}
|
|
||||||
switch (nError)
|
|
||||||
{
|
|
||||||
case Z_OK:
|
|
||||||
break;
|
|
||||||
case Z_MEM_ERROR:
|
|
||||||
AZ_Warning("Archive", false, "ZD_ERROR_ZLIB_NO_MEMORY: ZLib reported out-of-memory error");
|
|
||||||
return;
|
|
||||||
case Z_BUF_ERROR:
|
|
||||||
AZ_Warning("Archive", false, "ZD_ERROR_ZLIB_CORRUPTED_DATA: ZLib reported compressed stream buffer error");
|
|
||||||
return;
|
|
||||||
case Z_DATA_ERROR:
|
|
||||||
AZ_Warning("Archive", false, "ZD_ERROR_ZLIB_CORRUPTED_DATA: ZLib reported compressed stream data error");
|
|
||||||
return;
|
|
||||||
default:
|
|
||||||
AZ_Warning("Archive", false, "ZD_ERROR_ZLIB_FAILED: ZLib reported an unexpected unknown error");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (nDestSize != fileEntry.desc.lSizeUncompressed)
|
|
||||||
{
|
|
||||||
AZ_Warning("Archive", false, "ZD_ERROR_CORRUPTED_DATA: Uncompressed stream doesn't match the size of uncompressed file stored in the archive file headers");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
uLong uCRC32 = AZ::Crc32((Bytef*)pUncompressed, nDestSize);
|
|
||||||
if (uCRC32 != fileEntry.desc.lCRC32)
|
|
||||||
{
|
|
||||||
AZ_Warning("Archive", false, "ZD_ERROR_CRC32_CHECK: Uncompressed stream CRC32 check failed");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
|
||||||
// extracts the file path from the file header with subsequent information
|
|
||||||
// may, or may not, put all letters to lower-case (depending on whether the system is to be case-sensitive or not)
|
|
||||||
// it's the responsibility of the caller to ensure that the file name is in readable valid memory
|
|
||||||
char* CacheFactory::GetFilePath(const char* pFileName, uint16_t nFileNameLength)
|
|
||||||
{
|
|
||||||
static char strResult[AZ_MAX_PATH_LEN];
|
|
||||||
AZ_Assert(nFileNameLength < AZ_MAX_PATH_LEN, "Only filenames shorter than %zu can be copied from filename parameter", AZ_MAX_PATH_LEN);
|
|
||||||
memcpy(strResult, pFileName, nFileNameLength);
|
|
||||||
strResult[nFileNameLength] = 0;
|
|
||||||
for (int i = 0; i < nFileNameLength; i++)
|
|
||||||
{
|
|
||||||
strResult[i] = std::tolower(strResult[i], std::locale{});
|
|
||||||
}
|
|
||||||
|
|
||||||
return strResult;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// seeks in the file relative to the starting position
|
// seeks in the file relative to the starting position
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ namespace AZ::IO::ZipDir
|
|||||||
|
|
||||||
// initializes the internal structures
|
// initializes the internal structures
|
||||||
// nFlags can have FLAGS_READ_ONLY flag, in this case the object will be opened only for reading
|
// nFlags can have FLAGS_READ_ONLY flag, in this case the object will be opened only for reading
|
||||||
CacheFactory(InitMethodEnum nInitMethod, uint32_t nFlags = 0);
|
CacheFactory(InitMethod nInitMethod, uint32_t nFlags = 0);
|
||||||
~CacheFactory();
|
~CacheFactory();
|
||||||
|
|
||||||
// the new function creates a new cache
|
// the new function creates a new cache
|
||||||
@@ -66,28 +66,6 @@ namespace AZ::IO::ZipDir
|
|||||||
// This function can actually modify strFilePath variable, make sure you use a copy of the real path.
|
// This function can actually modify strFilePath variable, make sure you use a copy of the real path.
|
||||||
void AddFileEntry(char* strFilePath, const ZipFile::CDRFileHeader* pFileHeader, const SExtraZipFileData& extra);// throw (ErrorEnum);
|
void AddFileEntry(char* strFilePath, const ZipFile::CDRFileHeader* pFileHeader, const SExtraZipFileData& extra);// throw (ErrorEnum);
|
||||||
|
|
||||||
// extracts the file path from the file header with subsequent information
|
|
||||||
// may, or may not, put all letters to lower-case (depending on whether the system is to be case-sensitive or not)
|
|
||||||
// it's the responsibility of the caller to ensure that the file name is in readable valid memory
|
|
||||||
char* GetFilePath(const ZipFile::CDRFileHeader* pFileHeader)
|
|
||||||
{
|
|
||||||
return GetFilePath((const char*)(pFileHeader + 1), pFileHeader->nFileNameLength);
|
|
||||||
}
|
|
||||||
// extracts the file path from the file header with subsequent information
|
|
||||||
// may, or may not, put all letters to lower-case (depending on whether the system is to be case-sensitive or not)
|
|
||||||
// it's the responsibility of the caller to ensure that the file name is in readable valid memory
|
|
||||||
char* GetFilePath(const ZipFile::LocalFileHeader* pFileHeader)
|
|
||||||
{
|
|
||||||
return GetFilePath((const char*)(pFileHeader + 1), pFileHeader->nFileNameLength);
|
|
||||||
}
|
|
||||||
// extracts the file path from the file header with subsequent information
|
|
||||||
// may, or may not, put all letters to lower-case (depending on whether the system is to be case-sensitive or not)
|
|
||||||
// it's the responsibility of the caller to ensure that the file name is in readable valid memory
|
|
||||||
char* GetFilePath(const char* pFileName, uint16_t nFileNameLength);
|
|
||||||
|
|
||||||
// validates (if the init method has the corresponding value) the given file/header
|
|
||||||
void Validate(const FileEntryBase& fileEntry);
|
|
||||||
|
|
||||||
// initializes the actual data offset in the file in the fileEntry structure
|
// initializes the actual data offset in the file in the fileEntry structure
|
||||||
// searches to the local file header, reads it and calculates the actual offset in the file
|
// searches to the local file header, reads it and calculates the actual offset in the file
|
||||||
void InitDataOffset(FileEntryBase& fileEntry, const ZipFile::CDRFileHeader* pFileHeader);
|
void InitDataOffset(FileEntryBase& fileEntry, const ZipFile::CDRFileHeader* pFileHeader);
|
||||||
@@ -104,7 +82,7 @@ namespace AZ::IO::ZipDir
|
|||||||
AZStd::string m_szFilename;
|
AZStd::string m_szFilename;
|
||||||
CZipFile m_fileExt;
|
CZipFile m_fileExt;
|
||||||
|
|
||||||
InitMethodEnum m_nInitMethod;
|
InitMethod m_nInitMethod;
|
||||||
uint32_t m_nFlags;
|
uint32_t m_nFlags;
|
||||||
ZipFile::CDREnd m_CDREnd;
|
ZipFile::CDREnd m_CDREnd;
|
||||||
|
|
||||||
@@ -129,7 +107,7 @@ namespace AZ::IO::ZipDir
|
|||||||
ZipFile::CryCustomEncryptionHeader m_headerEncryption;
|
ZipFile::CryCustomEncryptionHeader m_headerEncryption;
|
||||||
ZipFile::CrySignedCDRHeader m_headerSignature;
|
ZipFile::CrySignedCDRHeader m_headerSignature;
|
||||||
ZipFile::CryCustomExtendedHeader m_headerExtended;
|
ZipFile::CryCustomExtendedHeader m_headerExtended;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -68,14 +68,14 @@ namespace AZ::IO::ZipDir
|
|||||||
{
|
{
|
||||||
for (FileEntryTree::SubdirMap::iterator it = pTree->GetDirBegin(); it != pTree->GetDirEnd(); ++it)
|
for (FileEntryTree::SubdirMap::iterator it = pTree->GetDirBegin(); it != pTree->GetDirEnd(); ++it)
|
||||||
{
|
{
|
||||||
AddAllFiles(it->second.get(), (AZ::IO::Path(strRoot) / it->first).Native());
|
AddAllFiles(it->second.get(), (AZ::IO::Path(strRoot, AZ::IO::PosixPathSeparator) / it->first).Native());
|
||||||
}
|
}
|
||||||
|
|
||||||
for (FileEntryTree::FileMap::iterator it = pTree->GetFileBegin(); it != pTree->GetFileEnd(); ++it)
|
for (FileEntryTree::FileMap::iterator it = pTree->GetFileBegin(); it != pTree->GetFileEnd(); ++it)
|
||||||
{
|
{
|
||||||
FileRecord rec;
|
FileRecord rec;
|
||||||
rec.pFileEntryBase = pTree->GetFileEntry(it);
|
rec.pFileEntryBase = pTree->GetFileEntry(it);
|
||||||
rec.strPath = (AZ::IO::Path(strRoot) / it->first).Native();
|
rec.strPath = (AZ::IO::Path(strRoot, AZ::IO::PosixPathSeparator) / it->first).Native();
|
||||||
push_back(rec);
|
push_back(rec);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -119,19 +119,28 @@ namespace AZ::IO::ZipDir
|
|||||||
const char* m_szDescription;
|
const char* m_szDescription;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#if defined(_RELEASE)
|
||||||
|
inline static constexpr bool IsReleaseConfig{ true };
|
||||||
|
#else
|
||||||
|
inline static constexpr bool IsReleaseConfig{};
|
||||||
|
#endif // _RELEASE
|
||||||
|
|
||||||
// possible initialization methods
|
// possible initialization methods
|
||||||
enum InitMethodEnum
|
enum class InitMethod
|
||||||
{
|
{
|
||||||
// initialize as fast as possible, with minimal validation
|
// initializes without any sort of extra validation steps
|
||||||
ZD_INIT_FAST,
|
Default,
|
||||||
// after initialization, scan through all file headers, precache the actual file data offset values and validate the headers
|
|
||||||
ZD_INIT_FULL,
|
// initializes with extra validation steps
|
||||||
// scan all file headers and try to decompress the data, searching for corrupted files
|
// not available in RELEASE
|
||||||
ZD_INIT_VALIDATE_IN_MEMORY,
|
// will check CDR and local headers data match
|
||||||
// store archive in memory
|
ValidateHeaders,
|
||||||
ZD_INIT_VALIDATE,
|
|
||||||
// maximum level of validation, checks for integrity of the archive
|
// initializes with extra validation steps
|
||||||
ZD_INIT_VALIDATE_MAX = ZD_INIT_VALIDATE
|
// not available in RELEASE
|
||||||
|
// will check CDR and local headers data match
|
||||||
|
// will check file data CRC matches (when file is read)
|
||||||
|
FullValidation,
|
||||||
};
|
};
|
||||||
|
|
||||||
// Uncompresses raw (without wrapping) data that is compressed with method 8 (deflated) in the Zip file
|
// Uncompresses raw (without wrapping) data that is compressed with method 8 (deflated) in the Zip file
|
||||||
@@ -184,7 +193,11 @@ namespace AZ::IO::ZipDir
|
|||||||
// the offset to the start of the next file's header - this
|
// the offset to the start of the next file's header - this
|
||||||
// can be used to calculate the available space in zip file
|
// can be used to calculate the available space in zip file
|
||||||
uint32_t nEOFOffset{};
|
uint32_t nEOFOffset{};
|
||||||
|
|
||||||
|
// whether to check the CRC upon the next data read
|
||||||
|
bool bCheckCRCNextRead{};
|
||||||
};
|
};
|
||||||
|
|
||||||
// this is the record about the file in the Zip file.
|
// this is the record about the file in the Zip file.
|
||||||
struct FileEntry
|
struct FileEntry
|
||||||
: FileEntryBase
|
: FileEntryBase
|
||||||
|
|||||||
@@ -593,7 +593,7 @@ namespace AzFramework
|
|||||||
|
|
||||||
DebugMessage("StartThread: Starting %s", thread.m_desc.m_name);
|
DebugMessage("StartThread: Starting %s", thread.m_desc.m_name);
|
||||||
thread.m_join = false;
|
thread.m_join = false;
|
||||||
thread.m_thread = AZStd::thread(thread.m_main, &thread.m_desc);
|
thread.m_thread = AZStd::thread(thread.m_desc, thread.m_main);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AssetProcessorConnection::JoinThread(ThreadState& thread, AZStd::condition_variable* wakeUpCondition /* = nullptr */)
|
void AssetProcessorConnection::JoinThread(ThreadState& thread, AZStd::condition_variable* wakeUpCondition /* = nullptr */)
|
||||||
|
|||||||
+1
-1
@@ -319,7 +319,7 @@ namespace AzFramework
|
|||||||
AZStd::thread_desc td;
|
AZStd::thread_desc td;
|
||||||
td.m_name = "TargetManager Thread";
|
td.m_name = "TargetManager Thread";
|
||||||
td.m_cpuId = AFFINITY_MASK_USERTHREADS;
|
td.m_cpuId = AFFINITY_MASK_USERTHREADS;
|
||||||
m_threadHandle = AZStd::thread(AZStd::bind(&TargetManagementComponent::TickThread, this), &td);
|
m_threadHandle = AZStd::thread(td, AZStd::bind(&TargetManagementComponent::TickThread, this));
|
||||||
}
|
}
|
||||||
|
|
||||||
void TargetManagementComponent::Deactivate()
|
void TargetManagementComponent::Deactivate()
|
||||||
|
|||||||
@@ -26,27 +26,29 @@ namespace AzNetworking
|
|||||||
{
|
{
|
||||||
m_running = true;
|
m_running = true;
|
||||||
m_joinable = true;
|
m_joinable = true;
|
||||||
m_thread = AZStd::thread([this]()
|
m_thread = AZStd::thread(
|
||||||
{
|
m_threadDesc,
|
||||||
OnStart();
|
[this]()
|
||||||
while (m_running)
|
|
||||||
{
|
{
|
||||||
const AZ::TimeMs startTimeMs = AZ::GetElapsedTimeMs();
|
OnStart();
|
||||||
OnUpdate(m_updateRate);
|
while (m_running)
|
||||||
const AZ::TimeMs updateTimeMs = AZ::GetElapsedTimeMs() - startTimeMs;
|
{
|
||||||
|
const AZ::TimeMs startTimeMs = AZ::GetElapsedTimeMs();
|
||||||
|
OnUpdate(m_updateRate);
|
||||||
|
const AZ::TimeMs updateTimeMs = AZ::GetElapsedTimeMs() - startTimeMs;
|
||||||
|
|
||||||
if (m_updateRate > updateTimeMs)
|
if (m_updateRate > updateTimeMs)
|
||||||
{
|
{
|
||||||
AZStd::chrono::milliseconds sleepTimeMs(static_cast<int64_t>(m_updateRate - updateTimeMs));
|
AZStd::chrono::milliseconds sleepTimeMs(static_cast<int64_t>(m_updateRate - updateTimeMs));
|
||||||
AZStd::this_thread::sleep_for(sleepTimeMs);
|
AZStd::this_thread::sleep_for(sleepTimeMs);
|
||||||
|
}
|
||||||
|
else if (m_updateRate < updateTimeMs)
|
||||||
|
{
|
||||||
|
AZLOG(NET_TimedThread, "TimedThread bled %d ms", aznumeric_cast<int32_t>(updateTimeMs - m_updateRate));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (m_updateRate < updateTimeMs)
|
OnStop();
|
||||||
{
|
});
|
||||||
AZLOG(NET_TimedThread, "TimedThread bled %d ms", aznumeric_cast<int32_t>(updateTimeMs - m_updateRate));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
OnStop();
|
|
||||||
}, &m_threadDesc);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void TimedThread::Stop()
|
void TimedThread::Stop()
|
||||||
|
|||||||
@@ -12,95 +12,84 @@
|
|||||||
#include <AzCore/EBus/EBus.h>
|
#include <AzCore/EBus/EBus.h>
|
||||||
#include <AzCore/std/string/string.h>
|
#include <AzCore/std/string/string.h>
|
||||||
#include <AzCore/Math/Uuid.h>
|
#include <AzCore/Math/Uuid.h>
|
||||||
|
#include <future>
|
||||||
|
|
||||||
namespace AzToolsFramework
|
namespace AzToolsFramework
|
||||||
{
|
{
|
||||||
// use bind if you need additional context.
|
|
||||||
// Parameters:
|
|
||||||
// bool - If the archive command was successful or not.
|
|
||||||
typedef AZStd::function<void(bool)> ArchiveResponseCallback;
|
|
||||||
// bool - If the archive command was successful or not.
|
|
||||||
// AZStd::string - The console output from the command.
|
|
||||||
typedef AZStd::function<void(bool, AZStd::string)> ArchiveResponseOutputCallback;
|
|
||||||
|
|
||||||
|
|
||||||
//! ArchiveCommands
|
//! ArchiveCommands
|
||||||
//! This bus handles messages relating to archive commands
|
//! This bus handles messages relating to archive commands
|
||||||
//! archive commands are ASYNCHRONOUS
|
//! archive commands are ASYNCHRONOUS
|
||||||
//! archive formats officially supported are .zip
|
//! archive formats officially supported are .zip
|
||||||
//! do not block the main thread waiting for a response, it is not okay
|
|
||||||
//! you will not get a message delivered unless you tick the tickbus anyway!
|
|
||||||
class ArchiveCommands
|
class ArchiveCommands
|
||||||
: public AZ::EBusTraits
|
: public AZ::EBusTraits
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
// EBus Traits
|
||||||
using Bus = AZ::EBus<ArchiveCommands>;
|
|
||||||
|
|
||||||
static const AZ::EBusHandlerPolicy HandlerPolicy = AZ::EBusHandlerPolicy::Single;
|
static const AZ::EBusHandlerPolicy HandlerPolicy = AZ::EBusHandlerPolicy::Single;
|
||||||
static const AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::Single;
|
static const AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::Single;
|
||||||
typedef AZStd::recursive_mutex MutexType;
|
typedef AZStd::recursive_mutex MutexType;
|
||||||
static const bool LocklessDispatch = true;
|
static const bool LocklessDispatch = true;
|
||||||
virtual ~ArchiveCommands() {}
|
|
||||||
|
|
||||||
//! Start an async task to extract an archive to the target directory
|
virtual ~ArchiveCommands() = default;
|
||||||
//! taskHandles are used to cancel a task at some point in the future and are provided by the caller per task.
|
|
||||||
//! Multiple tasks can be associated with the same handle
|
|
||||||
virtual void ExtractArchive(const AZStd::string& archivePath, const AZStd::string& destinationPath, AZ::Uuid taskHandle, const ArchiveResponseCallback& respCallback) = 0;
|
|
||||||
virtual void ExtractArchiveOutput(const AZStd::string& archivePath, const AZStd::string& destinationPath, AZ::Uuid taskHandle, const ArchiveResponseOutputCallback& respCallback) = 0;
|
|
||||||
// Maintaining backwards API compatibility - ExtractArchiveBlocking below passes in extractWithRoot as an option
|
|
||||||
virtual void ExtractArchiveWithoutRoot(const AZStd::string& archivePath, const AZStd::string& destinationPath, AZ::Uuid taskHandle, const ArchiveResponseOutputCallback& respCallback) = 0;
|
|
||||||
|
|
||||||
//! Start a sync task to extract an archive to the target directory
|
//! Create an archive of the target directory (all files and subdirectories)
|
||||||
//! If you do not want to extract the root folder then set extractWithRootDirectory to false.
|
//! @param archivePath The path of the archive to create
|
||||||
virtual bool ExtractArchiveBlocking(const AZStd::string& archivePath, const AZStd::string& destinationPath, bool extractWithRootDirectory) = 0;
|
//! @dirToArchive The directory to be added to the archive
|
||||||
|
//! @return Future (bool) which can obtain the success value of the operation
|
||||||
|
[[nodiscard]] virtual std::future<bool> CreateArchive(
|
||||||
|
const AZStd::string& archivePath,
|
||||||
|
const AZStd::string& dirToArchive) = 0;
|
||||||
|
|
||||||
//! Extract a single file asynchronously from the archive to the destination.
|
//! Extract an archive to the target directory
|
||||||
//! Uses cwd if destinationPath empty. overWrite = true for overwrite existing files, false for skipExisting
|
//! @param archivePath The path of the archive to extract
|
||||||
//! taskHandles are used to cancel a task at some point in the future and are provided by the caller per task.
|
//! @param destinationPath The directory where files will be extracted to
|
||||||
//! Multiple tasks can be associated with the same handle
|
//! @return Future (bool) which can obtain the success value of the operation
|
||||||
virtual void ExtractFile(const AZStd::string& archivePath, const AZStd::string& fileInArchive, const AZStd::string& destinationPath, bool overWrite, AZ::Uuid taskHandle, const ArchiveResponseOutputCallback& respCallback) = 0;
|
[[nodiscard]] virtual std::future<bool> ExtractArchive(
|
||||||
|
const AZStd::string& archivePath,
|
||||||
|
const AZStd::string& destinationPath) = 0;
|
||||||
|
|
||||||
//! Extract a single file from the archive to the destination and block until finished.
|
//! Extract a single file from the archive to the destination
|
||||||
//! Uses cwd if destinationPath empty. overWrite = true for overwrite existing files, false for skipExisting
|
//! Destination path should not be empty
|
||||||
virtual bool ExtractFileBlocking(const AZStd::string& archivePath, const AZStd::string& fileInArchive, const AZStd::string& destinationPath, bool overWrite) = 0;
|
//! @param archivePath The path of the archive to extract from
|
||||||
|
//! @param fileInArchive A path to a file, relative to root of archive
|
||||||
|
//! @param destinationPath The directory where file will be extracted to
|
||||||
|
//! @return Future (bool) which can obtain the success value of the operation
|
||||||
|
[[nodiscard]] virtual std::future<bool> ExtractFile(
|
||||||
|
const AZStd::string& archivePath,
|
||||||
|
const AZStd::string& fileInArchive,
|
||||||
|
const AZStd::string& destinationPath) = 0;
|
||||||
|
|
||||||
//! Start an async task to create an archive of the target directory (recursively)
|
//! Retrieve the list of files contained in an archive (all files and subdirectories)
|
||||||
//! taskHandles are used to cancel a task at some point in the future and are provided by the caller per task.
|
//! @param archivePath The path of the archive to list
|
||||||
//! Multiple tasks can be associated with the same handle.
|
//! @param outFileEntries An out parameter that will contain the file paths found
|
||||||
virtual void CreateArchive(const AZStd::string& archivePath, const AZStd::string& dirToArchive, AZ::Uuid taskHandle, const ArchiveResponseOutputCallback& respCallback) = 0;
|
//! @return True if successful, false otherwise
|
||||||
|
virtual bool ListFilesInArchive(const AZStd::string& archivePath, AZStd::vector<AZStd::string>& outFileEntries) = 0;
|
||||||
|
|
||||||
//! Start a sync task to create an archive of the target directory (recursively)
|
//! Add a file to an archive
|
||||||
virtual bool CreateArchiveBlocking(const AZStd::string& archivePath, const AZStd::string& dirToArchive) = 0;
|
//! The archive might not exist yet
|
||||||
|
//! The file path relative to the working directory will be replicated in the archive
|
||||||
//! Start an async task to retrieve the list of files and their relative paths within an archive (recursively)
|
//! @param archivePath The path of the archive to add to
|
||||||
//! taskHandles are used to cancel a task at some point in the future and are provided by the caller per task.
|
//! @param workingDirectory A directory that will be the starting path of the file to be added
|
||||||
//! Multiple tasks can be associated with the same handle.
|
//! @param fileToAdd A path to the file relative to the working directory
|
||||||
virtual void ListFilesInArchive(const AZStd::string& archivePath, AZStd::vector<AZStd::string>& fileEntries, AZ::Uuid taskHandle, const ArchiveResponseOutputCallback& respCallback) = 0;
|
//! @return Future (bool) which can obtain the success value of the operation
|
||||||
|
[[nodiscard]] virtual std::future<bool> AddFileToArchive(
|
||||||
|
const AZStd::string& archivePath,
|
||||||
|
const AZStd::string& workingDirectory,
|
||||||
|
const AZStd::string& fileToAdd) = 0;
|
||||||
|
|
||||||
//! Start a sync task to retrieve the list of files and their relative paths within an archive (recursively)
|
//! Add files to an archive provided from a file listing
|
||||||
virtual bool ListFilesInArchiveBlocking(const AZStd::string& archivePath, AZStd::vector<AZStd::string>& fileEntries) = 0;
|
//! The archive might not exist yet
|
||||||
|
//! File paths in the file list should be relative to root of the archive
|
||||||
//! Start an async task to add a file to a preexisting archive.
|
//! @param archivePath The path of the archive to add to
|
||||||
//! fileToAdd must be a relative path to the file from the working directory. The path to the file from the root of the archive will be the same as the relative path to the file on disk.
|
//! @param workingDirectory A directory that will be the starting path of the list of files to add
|
||||||
//! taskHandles are used to cancel a task at some point in the future and are provided by the caller per task.
|
//! @param listFilePath Full path to a text file that contains the list of files to add
|
||||||
//! Multiple tasks can be associated with the same handle.
|
//! @return Future (bool) which can obtain the success value of the operation
|
||||||
virtual void AddFileToArchive(const AZStd::string& archivePath, const AZStd::string& workingDirectory, const AZStd::string& fileToAdd, AZ::Uuid taskHandle, const ArchiveResponseOutputCallback& respCallback) = 0;
|
[[nodiscard]] virtual std::future<bool> AddFilesToArchive(
|
||||||
|
const AZStd::string& archivePath,
|
||||||
//! Start a sync task to add a file to a preexisting archive.
|
const AZStd::string& workingDirectory,
|
||||||
//! fileToAdd must be a relative path to the file from the working directory. The path to the file from the root of the archive will be the same as the relative path to the file on disk.
|
const AZStd::string& listFilePath) = 0;
|
||||||
virtual bool AddFileToArchiveBlocking(const AZStd::string& archivePath, const AZStd::string& workingDirectory, const AZStd::string& fileToAdd) = 0;
|
|
||||||
|
|
||||||
//! Start an async task to add files to a archive.
|
|
||||||
//! File paths inside the list file must either be a relative path from the working directory or an absolute path.
|
|
||||||
virtual void AddFilesToArchive(const AZStd::string& archivePath, const AZStd::string& workingDirectory, const AZStd::string& listFilePath, AZ::Uuid taskHandle, const ArchiveResponseOutputCallback& respCallback) = 0;
|
|
||||||
|
|
||||||
//! Start a sync task to add files to an archive.
|
|
||||||
//! File paths inside the list file must either be a relative path from the working directory or an absolute path.
|
|
||||||
virtual bool AddFilesToArchiveBlocking(const AZStd::string& archivePath, const AZStd::string& workingDirectory, const AZStd::string& listFilePath) = 0;
|
|
||||||
|
|
||||||
//! Cancels tasks associtated with the given handle. Blocks until all tasks are cancelled.
|
|
||||||
virtual void CancelTasks(AZ::Uuid taskHandle) = 0;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
using ArchiveCommandsBus = AZ::EBus<ArchiveCommands>;
|
using ArchiveCommandsBus = AZ::EBus<ArchiveCommands>;
|
||||||
|
|
||||||
}; // namespace AzToolsFramework
|
}; // namespace AzToolsFramework
|
||||||
|
|||||||
@@ -12,118 +12,98 @@
|
|||||||
#include <AzCore/Component/ComponentApplicationBus.h>
|
#include <AzCore/Component/ComponentApplicationBus.h>
|
||||||
#include <AzCore/Serialization/EditContext.h>
|
#include <AzCore/Serialization/EditContext.h>
|
||||||
|
|
||||||
#include <AzFramework/StringFunc/StringFunc.h>
|
#include <AzFramework/Archive/INestedArchive.h>
|
||||||
|
#include <AzFramework/Archive/ZipDirStructures.h>
|
||||||
#include <AzFramework/Process/ProcessCommunicator.h>
|
#include <AzFramework/Process/ProcessCommunicator.h>
|
||||||
#include <AzFramework/Process/ProcessWatcher.h>
|
#include <AzFramework/Process/ProcessWatcher.h>
|
||||||
#include <AzFramework/FileFunc/FileFunc.h>
|
#include <AzFramework/FileFunc/FileFunc.h>
|
||||||
|
|
||||||
|
|
||||||
namespace AzToolsFramework
|
namespace AzToolsFramework
|
||||||
{
|
{
|
||||||
// Forward declare platform specific functions
|
constexpr const char s_traceName[] = "ArchiveComponent";
|
||||||
namespace Platform
|
constexpr AZ::u32 s_compressionMethod = AZ::IO::INestedArchive::METHOD_DEFLATE;
|
||||||
|
constexpr AZ::s32 s_compressionLevel = AZ::IO::INestedArchive::LEVEL_NORMAL;
|
||||||
|
constexpr CompressionCodec::Codec s_compressionCodec = CompressionCodec::Codec::ZLIB;
|
||||||
|
|
||||||
|
namespace ArchiveUtils
|
||||||
{
|
{
|
||||||
AZStd::string GetZipExePath();
|
// Read a file's contents into a provided buffer.
|
||||||
AZStd::string GetUnzipExePath();
|
// Does not add a zero byte at the end of the buffer.
|
||||||
|
// returns true if read was successful, false otherwise.
|
||||||
AZStd::string GetCreateArchiveCommand(const AZStd::string& archivePath, const AZStd::string& dirToArchive);
|
bool ReadFile(const AZ::IO::Path& filePath, AZ::IO::OpenMode openMode, AZStd::vector<char>& outBuffer)
|
||||||
AZStd::string GetExtractArchiveCommand(const AZStd::string& archivePath, const AZStd::string& destinationPath, bool includeRoot);
|
|
||||||
AZStd::string GetAddFileToArchiveCommand(const AZStd::string& archivePath, const AZStd::string& file);
|
|
||||||
AZStd::string GetAddFilesToArchiveCommand(const AZStd::string& archivePath, const AZStd::string& listFilePath);
|
|
||||||
AZStd::string GetExtractFileCommand(const AZStd::string& archivePath, const AZStd::string& fileInArchive, const AZStd::string& destinationPath, bool overWrite);
|
|
||||||
AZStd::string GetListFilesInArchiveCommand(const AZStd::string& archivePath);
|
|
||||||
void ParseConsoleOutputFromListFilesInArchive(const AZStd::string& consoleOutput, AZStd::vector<AZStd::string>& fileEntries);
|
|
||||||
}
|
|
||||||
|
|
||||||
const char s_traceName[] = "ArchiveComponent";
|
|
||||||
const unsigned int g_sleepDuration = 1;
|
|
||||||
|
|
||||||
// Echoes all results of stdout and stderr to console and never blocks
|
|
||||||
class ConsoleEchoCommunicator
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
ConsoleEchoCommunicator(AzFramework::ProcessCommunicator* communicator)
|
|
||||||
: m_communicator(communicator)
|
|
||||||
{
|
{
|
||||||
}
|
auto fileIO = AZ::IO::FileIOBase::GetDirectInstance();
|
||||||
|
if (!fileIO)
|
||||||
~ConsoleEchoCommunicator()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
// Call this periodically to drain the buffers
|
|
||||||
void Pump()
|
|
||||||
{
|
|
||||||
if (m_communicator->IsValid())
|
|
||||||
{
|
{
|
||||||
AZ::u32 readBufferSize = 0;
|
return false;
|
||||||
AZStd::string readBuffer;
|
|
||||||
// Don't call readOutput unless there is output or else it will block...
|
|
||||||
readBufferSize = m_communicator->PeekOutput();
|
|
||||||
if (readBufferSize)
|
|
||||||
{
|
|
||||||
readBuffer.resize_no_construct(readBufferSize + 1);
|
|
||||||
readBuffer[readBufferSize] = '\0';
|
|
||||||
m_communicator->ReadOutput(readBuffer.data(), readBufferSize);
|
|
||||||
EchoBuffer(readBuffer);
|
|
||||||
}
|
|
||||||
readBufferSize = m_communicator->PeekError();
|
|
||||||
if (readBufferSize)
|
|
||||||
{
|
|
||||||
readBuffer.resize_no_construct(readBufferSize + 1);
|
|
||||||
readBuffer[readBufferSize] = '\0';
|
|
||||||
m_communicator->ReadError(readBuffer.data(), readBufferSize);
|
|
||||||
EchoBuffer(readBuffer);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
bool success = false;
|
||||||
void EchoBuffer(const AZStd::string& buffer)
|
AZ::IO::HandleType fileHandle = AZ::IO::InvalidHandle;
|
||||||
{
|
if (fileIO->Open(filePath.c_str(), openMode, fileHandle))
|
||||||
size_t startIndex = 0;
|
|
||||||
size_t endIndex = 0;
|
|
||||||
const size_t bufferSize = buffer.size();
|
|
||||||
for (size_t i = 0; i < bufferSize; ++i)
|
|
||||||
{
|
{
|
||||||
if (buffer[i] == '\n' || buffer[i] == '\0')
|
AZ::u64 fileSize = 0;
|
||||||
|
if (fileIO->Size(fileHandle, fileSize) && fileSize != 0)
|
||||||
{
|
{
|
||||||
endIndex = i;
|
outBuffer.resize_no_construct(fileSize);
|
||||||
bool isEmptyMessage = (endIndex - startIndex == 1) && (buffer[startIndex] == '\r');
|
|
||||||
if (!isEmptyMessage)
|
AZ::u64 bytesRead = 0;
|
||||||
|
if (fileIO->Read(fileHandle, outBuffer.data(), fileSize, true, &bytesRead))
|
||||||
{
|
{
|
||||||
AZ_Printf(s_traceName, "%s", buffer.substr(startIndex, endIndex - startIndex).c_str());
|
success = (fileSize == bytesRead);
|
||||||
}
|
}
|
||||||
startIndex = endIndex + 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fileIO->Close(fileHandle);
|
||||||
|
}
|
||||||
|
|
||||||
|
return success;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reads a text file that contains a list of file paths.
|
||||||
|
// Tokenize the file by lines.
|
||||||
|
// Calls the lineVisitor function for each line of the file.
|
||||||
|
void ProcessFileList(const AZ::IO::Path& filePath, AZStd::function<void(AZStd::string_view line)> lineVisitor)
|
||||||
|
{
|
||||||
|
AZStd::vector<char> fileBuffer;
|
||||||
|
if (ReadFile(filePath, AZ::IO::OpenMode::ModeText | AZ::IO::OpenMode::ModeRead, fileBuffer))
|
||||||
|
{
|
||||||
|
AZ::StringFunc::TokenizeVisitor(AZStd::string_view{ fileBuffer.data(), fileBuffer.size() }, lineVisitor, "\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
AzFramework::ProcessCommunicator* m_communicator = nullptr;
|
} // namespace ArchiveUtils
|
||||||
};
|
|
||||||
|
|
||||||
void ArchiveComponent::Activate()
|
void ArchiveComponent::Activate()
|
||||||
{
|
{
|
||||||
m_zipExePath = Platform::GetZipExePath();
|
m_fileIO = AZ::IO::FileIOBase::GetDirectInstance();
|
||||||
m_unzipExePath = Platform::GetUnzipExePath();
|
if (m_fileIO == nullptr)
|
||||||
|
{
|
||||||
|
AZ_Error(s_traceName, false, "Failed to create a LocalFileIO instance!");
|
||||||
|
}
|
||||||
|
|
||||||
ArchiveCommands::Bus::Handler::BusConnect();
|
m_archive = AZ::Interface<AZ::IO::IArchive>::Get();
|
||||||
|
if (m_archive == nullptr)
|
||||||
|
{
|
||||||
|
AZ_Error(s_traceName, false, "Failed to get IArchive interface!");
|
||||||
|
}
|
||||||
|
|
||||||
|
ArchiveCommandsBus::Handler::BusConnect();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ArchiveComponent::Deactivate()
|
void ArchiveComponent::Deactivate()
|
||||||
{
|
{
|
||||||
ArchiveCommands::Bus::Handler::BusDisconnect();
|
ArchiveCommandsBus::Handler::BusDisconnect();
|
||||||
|
|
||||||
AZStd::unique_lock<AZStd::mutex> lock(m_threadControlMutex);
|
m_fileIO = nullptr;
|
||||||
for (auto pair : m_threadInfoMap)
|
m_archive = nullptr;
|
||||||
|
|
||||||
|
for (AZStd::thread& t : m_threads)
|
||||||
{
|
{
|
||||||
ThreadInfo& info = pair.second;
|
t.join();
|
||||||
info.shouldStop = true;
|
|
||||||
m_cv.wait(lock, [&info]() {
|
|
||||||
return info.threads.size() == 0;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
m_threadInfoMap.clear();
|
m_threads = {};
|
||||||
}
|
}
|
||||||
|
|
||||||
void ArchiveComponent::Reflect(AZ::ReflectContext * context)
|
void ArchiveComponent::Reflect(AZ::ReflectContext * context)
|
||||||
@@ -132,7 +112,7 @@ namespace AzToolsFramework
|
|||||||
{
|
{
|
||||||
serializeContext->Class<ArchiveComponent, AZ::Component>()
|
serializeContext->Class<ArchiveComponent, AZ::Component>()
|
||||||
->Version(2)
|
->Version(2)
|
||||||
->Attribute(AZ::Edit::Attributes::SystemComponentTags, AZStd::vector<AZ::Crc32>({ AZ_CRC("AssetBuilder", 0xc739c7d7) }))
|
->Attribute(AZ::Edit::Attributes::SystemComponentTags, AZStd::vector<AZ::Crc32>({ AZ_CRC_CE("AssetBuilder") }))
|
||||||
;
|
;
|
||||||
|
|
||||||
if (AZ::EditContext* editContext = serializeContext->GetEditContext())
|
if (AZ::EditContext* editContext = serializeContext->GetEditContext())
|
||||||
@@ -141,320 +121,480 @@ namespace AzToolsFramework
|
|||||||
"Archive", "Handles creation and extraction of zip archives.")
|
"Archive", "Handles creation and extraction of zip archives.")
|
||||||
->ClassElement(AZ::Edit::ClassElements::EditorData, "")
|
->ClassElement(AZ::Edit::ClassElements::EditorData, "")
|
||||||
->Attribute(AZ::Edit::Attributes::Category, "Editor")
|
->Attribute(AZ::Edit::Attributes::Category, "Editor")
|
||||||
->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC("System", 0xc94d118b))
|
->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC_CE("System"))
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ArchiveComponent::CreateArchive(const AZStd::string& archivePath, const AZStd::string& dirToArchive, AZ::Uuid taskHandle, const ArchiveResponseOutputCallback& respCallback)
|
std::future<bool> ArchiveComponent::CreateArchive(
|
||||||
|
const AZStd::string& archivePath,
|
||||||
|
const AZStd::string& dirToArchive)
|
||||||
{
|
{
|
||||||
AZStd::string commandLineArgs = AZStd::string::format(R"(a -tzip -mx=1 "%s" -r "%s\*")", archivePath.c_str(), dirToArchive.c_str());
|
if (!CheckParamsForCreate(archivePath, dirToArchive))
|
||||||
LaunchZipExe(m_zipExePath, commandLineArgs, respCallback, taskHandle);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ArchiveComponent::CreateArchiveBlocking(const AZStd::string& archivePath, const AZStd::string& dirToArchive)
|
|
||||||
{
|
|
||||||
bool success = false;
|
|
||||||
auto createArchiveCallback = [&success](bool result, AZStd::string consoleOutput) {
|
|
||||||
success = result;
|
|
||||||
};
|
|
||||||
|
|
||||||
AZStd::string commandLineArgs = Platform::GetCreateArchiveCommand(archivePath, dirToArchive);
|
|
||||||
|
|
||||||
if (commandLineArgs.empty())
|
|
||||||
{
|
{
|
||||||
// The platform-specific implementation has already thrown its own error, no need to throw another one
|
std::promise<bool> p;
|
||||||
return false;
|
p.set_value(false);
|
||||||
|
return p.get_future();
|
||||||
}
|
}
|
||||||
|
|
||||||
LaunchZipExe(m_zipExePath, commandLineArgs, createArchiveCallback, AZ::Uuid::CreateNull(), dirToArchive, false);
|
auto FnCreateArchive = [this, archivePath, dirToArchive](std::promise<bool>&& p) -> void
|
||||||
return success;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ArchiveComponent::ExtractArchive(const AZStd::string& archivePath, const AZStd::string& destinationPath, AZ::Uuid taskHandle, const ArchiveResponseCallback& respCallback)
|
|
||||||
{
|
|
||||||
ArchiveResponseOutputCallback responseHandler = [respCallback](bool result, AZStd::string /*outputStr*/) { respCallback(result); };
|
|
||||||
ExtractArchiveOutput(archivePath, destinationPath, taskHandle, responseHandler);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ArchiveComponent::ExtractArchiveOutput(const AZStd::string& archivePath, const AZStd::string& destinationPath, AZ::Uuid taskHandle, const ArchiveResponseOutputCallback& respCallback)
|
|
||||||
{
|
|
||||||
AZStd::string commandLineArgs = Platform::GetExtractArchiveCommand(archivePath, destinationPath, true);
|
|
||||||
|
|
||||||
if (commandLineArgs.empty())
|
|
||||||
{
|
{
|
||||||
// The platform-specific implementation has already thrown its own error, no need to throw another one
|
auto archive = m_archive->OpenArchive(archivePath, {}, AZ::IO::INestedArchive::FLAGS_CREATE_NEW);
|
||||||
return;
|
if (!archive)
|
||||||
}
|
|
||||||
|
|
||||||
LaunchZipExe(m_unzipExePath, commandLineArgs, respCallback, taskHandle);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ArchiveComponent::ExtractArchiveWithoutRoot(const AZStd::string& archivePath, const AZStd::string& destinationPath, AZ::Uuid taskHandle, const ArchiveResponseOutputCallback& respCallback)
|
|
||||||
{
|
|
||||||
AZStd::string commandLineArgs = Platform::GetExtractArchiveCommand(archivePath, destinationPath, false);
|
|
||||||
|
|
||||||
if (commandLineArgs.empty())
|
|
||||||
{
|
|
||||||
// The platform-specific implementation has already thrown its own error, no need to throw another one
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
LaunchZipExe(m_unzipExePath, commandLineArgs, respCallback, taskHandle);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ArchiveComponent::ExtractFile(const AZStd::string& archivePath, const AZStd::string& fileInArchive, const AZStd::string& destinationPath, bool overWrite, AZ::Uuid taskHandle, const ArchiveResponseOutputCallback& respCallback)
|
|
||||||
{
|
|
||||||
AZStd::string commandLineArgs = AzToolsFramework::Platform::GetExtractFileCommand(archivePath, fileInArchive, destinationPath, overWrite);
|
|
||||||
if (commandLineArgs.empty())
|
|
||||||
{
|
|
||||||
// The platform-specific implementation has already thrown its own error, no need to throw another one
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
LaunchZipExe(m_unzipExePath, commandLineArgs, respCallback, taskHandle);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ArchiveComponent::ExtractFileBlocking(const AZStd::string& archivePath, const AZStd::string& fileInArchive, const AZStd::string& destinationPath, bool overWrite)
|
|
||||||
{
|
|
||||||
AZStd::string commandLineArgs = AzToolsFramework::Platform::GetExtractFileCommand(archivePath, fileInArchive, destinationPath, overWrite);
|
|
||||||
if (commandLineArgs.empty())
|
|
||||||
{
|
|
||||||
// The platform-specific implementation has already thrown its own error, no need to throw another one
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool success = false;
|
|
||||||
auto createArchiveCallback = [&success](bool result, AZStd::string consoleOutput) {
|
|
||||||
success = result;
|
|
||||||
};
|
|
||||||
LaunchZipExe(m_unzipExePath, commandLineArgs, createArchiveCallback);
|
|
||||||
return success;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ArchiveComponent::ListFilesInArchive(const AZStd::string& archivePath, AZStd::vector<AZStd::string>& fileEntries, AZ::Uuid taskHandle, const ArchiveResponseOutputCallback& respCallback)
|
|
||||||
{
|
|
||||||
AZStd::string commandLineArgs = Platform::GetListFilesInArchiveCommand(archivePath);
|
|
||||||
|
|
||||||
auto parseOutput = [respCallback, &fileEntries](bool exitCode, AZStd::string consoleOutput)
|
|
||||||
{
|
|
||||||
Platform::ParseConsoleOutputFromListFilesInArchive(consoleOutput, fileEntries);
|
|
||||||
AZ::TickBus::QueueFunction(respCallback, exitCode, AZStd::move(consoleOutput));
|
|
||||||
};
|
|
||||||
LaunchZipExe(m_unzipExePath, commandLineArgs, parseOutput, taskHandle, "", true);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ArchiveComponent::ListFilesInArchiveBlocking(const AZStd::string& archivePath, AZStd::vector<AZStd::string>& fileEntries)
|
|
||||||
{
|
|
||||||
AZStd::string listOutput;
|
|
||||||
AZStd::string commandLineArgs = Platform::GetListFilesInArchiveCommand(archivePath.c_str());
|
|
||||||
bool success = false;
|
|
||||||
|
|
||||||
auto parseOutput = [&success, &fileEntries](bool result, AZStd::string consoleOutput)
|
|
||||||
{
|
|
||||||
Platform::ParseConsoleOutputFromListFilesInArchive(consoleOutput, fileEntries);
|
|
||||||
success = result;
|
|
||||||
};
|
|
||||||
LaunchZipExe(m_unzipExePath, commandLineArgs, parseOutput, AZ::Uuid::CreateNull(), "", true);
|
|
||||||
return success;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ArchiveComponent::AddFileToArchive(const AZStd::string& archivePath, const AZStd::string& workingDirectory, const AZStd::string& fileToAdd, AZ::Uuid taskHandle, const ArchiveResponseOutputCallback& respCallback)
|
|
||||||
{
|
|
||||||
AZStd::string commandLineArgs = Platform::GetAddFileToArchiveCommand(archivePath, fileToAdd);
|
|
||||||
if (commandLineArgs.empty())
|
|
||||||
{
|
|
||||||
// The platform-specific implementation has already thrown its own error, no need to throw another one
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
LaunchZipExe(m_zipExePath, commandLineArgs, respCallback, taskHandle, workingDirectory);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ArchiveComponent::AddFileToArchiveBlocking(const AZStd::string& archivePath, const AZStd::string& workingDirectory, const AZStd::string& fileToAdd)
|
|
||||||
{
|
|
||||||
AZStd::string commandLineArgs = Platform::GetAddFileToArchiveCommand(archivePath, fileToAdd);
|
|
||||||
if (commandLineArgs.empty())
|
|
||||||
{
|
|
||||||
// The platform-specific implementation has already thrown its own error, no need to throw another one
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
bool success = false;
|
|
||||||
auto addFileToArchiveCallback = [&success](bool result, AZStd::string consoleOutput) {
|
|
||||||
success = result;
|
|
||||||
};
|
|
||||||
|
|
||||||
LaunchZipExe(m_zipExePath, commandLineArgs, addFileToArchiveCallback, AZ::Uuid::CreateNull(), workingDirectory);
|
|
||||||
return success;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ArchiveComponent::AddFilesToArchiveBlocking(const AZStd::string& archivePath, const AZStd::string& workingDirectory, const AZStd::string& listFilePath)
|
|
||||||
{
|
|
||||||
bool success = false;
|
|
||||||
|
|
||||||
auto addFileToArchiveCallback = [&success](bool result, AZStd::string consoleOutput) {
|
|
||||||
success = result;
|
|
||||||
};
|
|
||||||
|
|
||||||
AZStd::string commandLineArgs = Platform::GetAddFilesToArchiveCommand(archivePath.c_str(), listFilePath.c_str());
|
|
||||||
|
|
||||||
if (commandLineArgs.empty())
|
|
||||||
{
|
|
||||||
// The platform-specific implementation has already thrown its own error, no need to throw another one
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
LaunchZipExe(m_zipExePath, commandLineArgs, addFileToArchiveCallback, AZ::Uuid::CreateNull(), workingDirectory);
|
|
||||||
return success;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ArchiveComponent::AddFilesToArchive(const AZStd::string& archivePath, const AZStd::string& workingDirectory, const AZStd::string& listFilePath, AZ::Uuid taskHandle, const ArchiveResponseOutputCallback& respCallback)
|
|
||||||
{
|
|
||||||
AZStd::string commandLineArgs = Platform::GetAddFilesToArchiveCommand(archivePath, listFilePath);
|
|
||||||
if (commandLineArgs.empty())
|
|
||||||
{
|
|
||||||
// The platform-specific implementation has already thrown its own error, no need to throw another one
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
LaunchZipExe(m_zipExePath, commandLineArgs, respCallback, taskHandle, workingDirectory);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool ArchiveComponent::ExtractArchiveBlocking(const AZStd::string& archivePath, const AZStd::string& destinationPath, bool extractWithRootDirectory)
|
|
||||||
{
|
|
||||||
AZStd::string commandLineArgs = Platform::GetExtractArchiveCommand(archivePath, destinationPath, extractWithRootDirectory);
|
|
||||||
|
|
||||||
if (commandLineArgs.empty())
|
|
||||||
{
|
|
||||||
// The platform-specific implementation has already thrown its own error, no need to throw another one
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool success = false;
|
|
||||||
auto extractArchiveCallback = [&success](bool result, AZStd::string consoleOutput) {
|
|
||||||
success = result;
|
|
||||||
};
|
|
||||||
|
|
||||||
LaunchZipExe(m_unzipExePath, commandLineArgs, extractArchiveCallback);
|
|
||||||
return success;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ArchiveComponent::CancelTasks(AZ::Uuid taskHandle)
|
|
||||||
{
|
|
||||||
AZStd::unique_lock<AZStd::mutex> lock(m_threadControlMutex);
|
|
||||||
|
|
||||||
auto it = m_threadInfoMap.find(taskHandle);
|
|
||||||
if (it == m_threadInfoMap.end())
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
ThreadInfo& info = it->second;
|
|
||||||
info.shouldStop = true;
|
|
||||||
m_cv.wait(lock, [&info]() {
|
|
||||||
return info.threads.size() == 0;
|
|
||||||
});
|
|
||||||
m_threadInfoMap.erase(it);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ArchiveComponent::LaunchZipExe(const AZStd::string& exePath, const AZStd::string& commandLineArgs, const ArchiveResponseOutputCallback& respCallback, AZ::Uuid taskHandle, const AZStd::string& workingDir, bool captureOutput)
|
|
||||||
{
|
|
||||||
auto sevenZJob = [=]()
|
|
||||||
{
|
|
||||||
if (!taskHandle.IsNull())
|
|
||||||
{
|
{
|
||||||
AZStd::unique_lock<AZStd::mutex> lock(m_threadControlMutex);
|
AZ_Error(s_traceName, false, "Failed to create archive file '%s'", archivePath.c_str());
|
||||||
m_threadInfoMap[taskHandle].threads.insert(AZStd::this_thread::get_id());
|
p.set_value(false);
|
||||||
m_cv.notify_all();
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
AzFramework::ProcessLauncher::ProcessLaunchInfo info;
|
auto foundFiles = AzFramework::FileFunc::FindFilesInPath(dirToArchive, "*", true);
|
||||||
info.m_commandlineParameters = exePath + " " + commandLineArgs;
|
if (!foundFiles.IsSuccess())
|
||||||
|
|
||||||
info.m_showWindow = false;
|
|
||||||
if (!workingDir.empty())
|
|
||||||
{
|
{
|
||||||
info.m_workingDirectory = workingDir;
|
AZ_Error(s_traceName, false, "Failed to find file listing under directory '%d'", dirToArchive.c_str());
|
||||||
|
p.set_value(false);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
AZStd::unique_ptr<AzFramework::ProcessWatcher> watcher(AzFramework::ProcessWatcher::LaunchProcess(info, AzFramework::ProcessCommunicationType::COMMUNICATOR_TYPE_STDINOUT));
|
|
||||||
|
|
||||||
AZStd::string consoleOutput;
|
bool success = true;
|
||||||
AZ::u32 exitCode = static_cast<AZ::u32>(SevenZipExitCode::UserStoppedProcess);
|
AZStd::vector<char> fileBuffer;
|
||||||
if (watcher)
|
const AZ::IO::Path workingPath{ dirToArchive };
|
||||||
|
|
||||||
|
for (const auto& fileName : foundFiles.GetValue())
|
||||||
{
|
{
|
||||||
// callback requires output captured from 7z
|
bool thisSuccess = false;
|
||||||
if (captureOutput)
|
|
||||||
|
AZ::IO::PathView relativePath = AZ::IO::PathView{ fileName }.LexicallyRelative(workingPath);
|
||||||
|
|
||||||
|
AZ::IO::Path fullPath = (workingPath / relativePath);
|
||||||
|
if (ArchiveUtils::ReadFile(fullPath, AZ::IO::OpenMode::ModeRead, fileBuffer))
|
||||||
{
|
{
|
||||||
AZStd::string consoleBuffer;
|
int result = archive->UpdateFile(
|
||||||
while (watcher->IsProcessRunning(&exitCode))
|
relativePath.Native(), fileBuffer.data(), fileBuffer.size(), s_compressionMethod,
|
||||||
{
|
s_compressionLevel, s_compressionCodec);
|
||||||
if (!taskHandle.IsNull())
|
|
||||||
{
|
thisSuccess = (result == AZ::IO::ZipDir::ZD_ERROR_SUCCESS);
|
||||||
AZStd::unique_lock<AZStd::mutex> lock(m_threadControlMutex);
|
AZ_Error(
|
||||||
if (m_threadInfoMap[taskHandle].shouldStop)
|
s_traceName, thisSuccess, "Error %d encountered while adding '%s' to archive '%.*s'", result, fileName.c_str(),
|
||||||
{
|
AZ_STRING_ARG(archive->GetFullPath().Native()));
|
||||||
watcher->TerminateProcess(static_cast<AZ::u32>(SevenZipExitCode::UserStoppedProcess));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
watcher->WaitForProcessToExit(g_sleepDuration, &exitCode);
|
|
||||||
AZ::u32 outputSize = watcher->GetCommunicator()->PeekOutput();
|
|
||||||
if (outputSize)
|
|
||||||
{
|
|
||||||
consoleBuffer.resize(outputSize);
|
|
||||||
watcher->GetCommunicator()->ReadOutput(consoleBuffer.data(), outputSize);
|
|
||||||
consoleOutput += consoleBuffer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ConsoleEchoCommunicator echoCommunicator(watcher->GetCommunicator());
|
AZ_Error(
|
||||||
while (watcher->IsProcessRunning(&exitCode))
|
s_traceName, false, "Error encountered while reading '%s' to add to archive '%.*s'", fileName.c_str(),
|
||||||
{
|
AZ_STRING_ARG(archive->GetFullPath().Native()));
|
||||||
if (!taskHandle.IsNull())
|
|
||||||
{
|
|
||||||
AZStd::unique_lock<AZStd::mutex> lock(m_threadControlMutex);
|
|
||||||
if (m_threadInfoMap[taskHandle].shouldStop)
|
|
||||||
{
|
|
||||||
watcher->TerminateProcess(static_cast<AZ::u32>(SevenZipExitCode::UserStoppedProcess));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
watcher->WaitForProcessToExit(g_sleepDuration, &exitCode);
|
|
||||||
echoCommunicator.Pump();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
success = (success && thisSuccess);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (taskHandle.IsNull())
|
archive.reset();
|
||||||
|
p.set_value(success);
|
||||||
|
};
|
||||||
|
|
||||||
|
// Async task...
|
||||||
|
std::promise<bool> p;
|
||||||
|
std::future<bool> f = p.get_future();
|
||||||
|
|
||||||
|
AZStd::thread_desc threadDesc;
|
||||||
|
threadDesc.m_name = "Archive Task (Create)";
|
||||||
|
m_threads.emplace_back(threadDesc, FnCreateArchive, AZStd::move(p));
|
||||||
|
return f;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
std::future<bool> ArchiveComponent::ExtractArchive(
|
||||||
|
const AZStd::string& archivePath,
|
||||||
|
const AZStd::string& destinationPath)
|
||||||
|
{
|
||||||
|
if (!CheckParamsForExtract(archivePath, destinationPath))
|
||||||
|
{
|
||||||
|
std::promise<bool> p;
|
||||||
|
p.set_value(false);
|
||||||
|
return p.get_future();
|
||||||
|
}
|
||||||
|
|
||||||
|
auto FnExtractArchive = [this, archivePath, destinationPath](std::promise<bool>&& p) -> void
|
||||||
|
{
|
||||||
|
auto archive = m_archive->OpenArchive(archivePath, {}, AZ::IO::INestedArchive::FLAGS_READ_ONLY);
|
||||||
|
if (!archive)
|
||||||
{
|
{
|
||||||
respCallback(exitCode == static_cast<AZ::u32>(SevenZipExitCode::NoError), AZStd::move(consoleOutput));
|
AZ_Error(s_traceName, false, "Failed to open archive file '%s'", archivePath.c_str());
|
||||||
|
p.set_value(false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
AZStd::vector<AZ::IO::Path> filesInArchive;
|
||||||
|
if (int result = archive->ListAllFiles(filesInArchive); result != AZ::IO::ZipDir::ZD_ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
AZ_Error(s_traceName, false, "Failed to get list of files in archive '%s'", archivePath.c_str());
|
||||||
|
p.set_value(false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
AZStd::vector<AZ::u8> fileBuffer;
|
||||||
|
AZ::IO::Path destination{ destinationPath };
|
||||||
|
AZ::u64 fileSize = 0;
|
||||||
|
AZ::u64 numFilesWritten = 0;
|
||||||
|
AZ::u64 bytesWritten = 0;
|
||||||
|
AZ::IO::INestedArchive::Handle srcHandle{};
|
||||||
|
AZ::IO::HandleType dstHandle = AZ::IO::InvalidHandle;
|
||||||
|
constexpr AZ::IO::OpenMode openMode =
|
||||||
|
(AZ::IO::OpenMode::ModeCreatePath | AZ::IO::OpenMode::ModeWrite | AZ::IO::OpenMode::ModeUpdate);
|
||||||
|
|
||||||
|
for (const auto& filePath : filesInArchive)
|
||||||
|
{
|
||||||
|
srcHandle = archive->FindFile(filePath.Native());
|
||||||
|
AZ_Assert(srcHandle != nullptr, "File '%s' does not exist inside archive '%s'", filePath.c_str(), archivePath.c_str());
|
||||||
|
|
||||||
|
fileSize = (srcHandle != nullptr) ? archive->GetFileSize(srcHandle) : 0;
|
||||||
|
fileBuffer.resize_no_construct(fileSize);
|
||||||
|
if (auto result = archive->ReadFile(srcHandle, fileBuffer.data()); result != AZ::IO::ZipDir::ZD_ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
AZ_Error(
|
||||||
|
s_traceName, false, "Failed to read file '%s' in archive '%s' with error %d", filePath.c_str(), archivePath.c_str(),
|
||||||
|
result);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
AZ::IO::Path destinationFile = destination / filePath;
|
||||||
|
if (!m_fileIO->Open(destinationFile.c_str(), openMode, dstHandle))
|
||||||
|
{
|
||||||
|
AZ_Error(s_traceName, false, "Failed to open '%s' for writing", destinationFile.c_str());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!m_fileIO->Write(dstHandle, fileBuffer.data(), fileSize, &bytesWritten))
|
||||||
|
{
|
||||||
|
AZ_Error(s_traceName, false, "Failed to write destination file '%s'", destinationFile.c_str());
|
||||||
|
}
|
||||||
|
else if (bytesWritten == fileSize)
|
||||||
|
{
|
||||||
|
++numFilesWritten;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_fileIO->Close(dstHandle);
|
||||||
|
}
|
||||||
|
|
||||||
|
p.set_value(numFilesWritten == filesInArchive.size());
|
||||||
|
};
|
||||||
|
|
||||||
|
// Async task...
|
||||||
|
std::promise<bool> p;
|
||||||
|
std::future<bool> f = p.get_future();
|
||||||
|
|
||||||
|
AZStd::thread_desc threadDesc;
|
||||||
|
threadDesc.m_name = "Archive Task (Extract)";
|
||||||
|
m_threads.emplace_back(threadDesc, FnExtractArchive, AZStd::move(p));
|
||||||
|
return f;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
std::future<bool> ArchiveComponent::ExtractFile(
|
||||||
|
const AZStd::string& archivePath,
|
||||||
|
const AZStd::string& fileInArchive,
|
||||||
|
const AZStd::string& destinationPath)
|
||||||
|
{
|
||||||
|
if (!CheckParamsForExtract(archivePath, destinationPath))
|
||||||
|
{
|
||||||
|
std::promise<bool> p;
|
||||||
|
p.set_value(false);
|
||||||
|
return p.get_future();
|
||||||
|
}
|
||||||
|
|
||||||
|
auto FnExtractFile = [this, archivePath, fileInArchive, destinationPath](std::promise<bool>&& p) -> void
|
||||||
|
{
|
||||||
|
auto archive = m_archive->OpenArchive(archivePath, {}, AZ::IO::INestedArchive::FLAGS_READ_ONLY);
|
||||||
|
if (!archive)
|
||||||
|
{
|
||||||
|
AZ_Error(s_traceName, false, "Failed to open archive file '%s'", archivePath.c_str());
|
||||||
|
p.set_value(false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
AZ::IO::INestedArchive::Handle fileHandle = archive->FindFile(fileInArchive);
|
||||||
|
if (!fileHandle)
|
||||||
|
{
|
||||||
|
AZ_Error(s_traceName, false, "File '%s' does not exist inside archive '%s'", fileInArchive.c_str(), archivePath.c_str());
|
||||||
|
p.set_value(false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
AZ::u64 fileSize = archive->GetFileSize(fileHandle);
|
||||||
|
AZStd::vector<AZ::u8> fileBuffer;
|
||||||
|
fileBuffer.resize_no_construct(fileSize);
|
||||||
|
|
||||||
|
if (auto result = archive->ReadFile(fileHandle, fileBuffer.data()); result != AZ::IO::ZipDir::ZD_ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
AZ_Error(
|
||||||
|
s_traceName, false, "Failed to read file '%s' in archive '%s' with error %d", fileInArchive.c_str(),
|
||||||
|
archivePath.c_str(), result);
|
||||||
|
p.set_value(false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
AZ::IO::HandleType destFileHandle = AZ::IO::InvalidHandle;
|
||||||
|
AZ::IO::Path destinationFile{ destinationPath };
|
||||||
|
destinationFile /= fileInArchive;
|
||||||
|
AZ::IO::OpenMode openMode = (AZ::IO::OpenMode::ModeCreatePath | AZ::IO::OpenMode::ModeWrite | AZ::IO::OpenMode::ModeUpdate);
|
||||||
|
if (!m_fileIO->Open(destinationFile.c_str(), openMode, destFileHandle))
|
||||||
|
{
|
||||||
|
AZ_Error(s_traceName, false, "Failed to open destination file '%s' for writing", destinationFile.c_str());
|
||||||
|
p.set_value(false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
AZ::u64 bytesWritten = 0;
|
||||||
|
if (!m_fileIO->Write(destFileHandle, fileBuffer.data(), fileSize, &bytesWritten))
|
||||||
|
{
|
||||||
|
AZ_Error(s_traceName, false, "Failed to write destination file '%s'", destinationFile.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
m_fileIO->Close(destFileHandle);
|
||||||
|
p.set_value(bytesWritten == fileSize);
|
||||||
|
};
|
||||||
|
|
||||||
|
// Async task...
|
||||||
|
std::promise<bool> p;
|
||||||
|
std::future<bool> f = p.get_future();
|
||||||
|
|
||||||
|
AZStd::thread_desc threadDesc;
|
||||||
|
threadDesc.m_name = "Archive Task (Extract Single)";
|
||||||
|
m_threads.emplace_back(threadDesc, FnExtractFile, AZStd::move(p));
|
||||||
|
return f;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool ArchiveComponent::ListFilesInArchive(const AZStd::string& archivePath, AZStd::vector<AZStd::string>& outFileEntries)
|
||||||
|
{
|
||||||
|
if (!m_fileIO || !m_archive)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!m_fileIO->Exists(archivePath.c_str()))
|
||||||
|
{
|
||||||
|
AZ_Error(s_traceName, false, "Archive '%s' does not exist!", archivePath.c_str());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto archive = m_archive->OpenArchive(archivePath, {}, AZ::IO::INestedArchive::FLAGS_READ_ONLY);
|
||||||
|
if (!archive)
|
||||||
|
{
|
||||||
|
AZ_Error(s_traceName, false, "Failed to open archive file '%s'", archivePath.c_str());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
AZStd::vector<AZ::IO::Path> fileEntries;
|
||||||
|
int result = archive->ListAllFiles(fileEntries);
|
||||||
|
outFileEntries.clear();
|
||||||
|
for (const auto& path : fileEntries)
|
||||||
|
{
|
||||||
|
outFileEntries.emplace_back(path.String());
|
||||||
|
}
|
||||||
|
return (result == AZ::IO::ZipDir::ZD_ERROR_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
std::future<bool> ArchiveComponent::AddFileToArchive(
|
||||||
|
const AZStd::string& archivePath,
|
||||||
|
const AZStd::string& workingDirectory,
|
||||||
|
const AZStd::string& fileToAdd)
|
||||||
|
{
|
||||||
|
if (!CheckParamsForAdd(workingDirectory, fileToAdd))
|
||||||
|
{
|
||||||
|
std::promise<bool> p;
|
||||||
|
p.set_value(false);
|
||||||
|
return p.get_future();
|
||||||
|
}
|
||||||
|
|
||||||
|
auto FnAddFileToArchive = [this, archivePath, workingDirectory, fileToAdd](std::promise<bool>&& p) -> void
|
||||||
|
{
|
||||||
|
auto archive = m_archive->OpenArchive(archivePath);
|
||||||
|
if (!archive)
|
||||||
|
{
|
||||||
|
AZ_Error(s_traceName, false, "Failed to open archive file '%s'", archivePath.c_str());
|
||||||
|
p.set_value(false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
AZ::IO::Path workingPath{ workingDirectory };
|
||||||
|
AZ::IO::Path fullPath = workingPath / fileToAdd;
|
||||||
|
AZ::IO::PathView relativePath = AZ::IO::PathView{ fullPath }.LexicallyRelative(workingPath);
|
||||||
|
|
||||||
|
AZStd::vector<char> fileBuffer;
|
||||||
|
bool success = false;
|
||||||
|
if (ArchiveUtils::ReadFile(fullPath, AZ::IO::OpenMode::ModeRead, fileBuffer))
|
||||||
|
{
|
||||||
|
int result = archive->UpdateFile(
|
||||||
|
relativePath.Native(), fileBuffer.data(), fileBuffer.size(), s_compressionMethod,
|
||||||
|
s_compressionLevel, s_compressionCodec);
|
||||||
|
|
||||||
|
success = (result == AZ::IO::ZipDir::ZD_ERROR_SUCCESS);
|
||||||
|
AZ_Error(
|
||||||
|
s_traceName, success, "Error %d encountered while adding '%s' to archive '%.*s'", result, fileToAdd.c_str(),
|
||||||
|
AZ_STRING_ARG(archive->GetFullPath().Native()));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
AZ::TickBus::QueueFunction(respCallback, (exitCode == static_cast<AZ::u32>(SevenZipExitCode::NoError)), AZStd::move(consoleOutput));
|
AZ_Error(
|
||||||
|
s_traceName, false, "Error encountered while reading '%s' to add to archive '%.*s'", fileToAdd.c_str(),
|
||||||
|
AZ_STRING_ARG(archive->GetFullPath().Native()));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!taskHandle.IsNull())
|
archive.reset();
|
||||||
{
|
p.set_value(success);
|
||||||
AZStd::unique_lock<AZStd::mutex> lock(m_threadControlMutex);
|
|
||||||
ThreadInfo& tInfo = m_threadInfoMap[taskHandle];
|
|
||||||
tInfo.threads.erase(AZStd::this_thread::get_id());
|
|
||||||
m_cv.notify_all();
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
if (!taskHandle.IsNull())
|
|
||||||
{
|
// Async task...
|
||||||
AZStd::thread processThread(sevenZJob);
|
std::promise<bool> p;
|
||||||
AZStd::unique_lock<AZStd::mutex> lock(m_threadControlMutex);
|
std::future<bool> f = p.get_future();
|
||||||
ThreadInfo& info = m_threadInfoMap[taskHandle];
|
|
||||||
m_cv.wait(lock, [&info, &processThread]() {
|
AZStd::thread_desc threadDesc;
|
||||||
return info.threads.find(processThread.get_id()) != info.threads.end();
|
threadDesc.m_name = "Archive Task (Add Single)";
|
||||||
});
|
m_threads.emplace_back(threadDesc, FnAddFileToArchive, AZStd::move(p));
|
||||||
processThread.detach();
|
return f;
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
sevenZJob();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
std::future<bool> ArchiveComponent::AddFilesToArchive(
|
||||||
|
const AZStd::string& archivePath,
|
||||||
|
const AZStd::string& workingDirectory,
|
||||||
|
const AZStd::string& listFilePath)
|
||||||
|
{
|
||||||
|
if (!CheckParamsForAdd(workingDirectory, listFilePath))
|
||||||
|
{
|
||||||
|
std::promise<bool> p;
|
||||||
|
p.set_value(false);
|
||||||
|
return p.get_future();
|
||||||
|
}
|
||||||
|
|
||||||
|
auto FnAddFilesToArchive = [this, archivePath, workingDirectory, listFilePath](std::promise<bool>&& p) -> void
|
||||||
|
{
|
||||||
|
auto archive = m_archive->OpenArchive(archivePath);
|
||||||
|
if (!archive)
|
||||||
|
{
|
||||||
|
AZ_Error(s_traceName, false, "Failed to open archive file '%s'", archivePath.c_str());
|
||||||
|
p.set_value(false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool success = true; // starts true and turns false when any error is encountered.
|
||||||
|
AZ::IO::Path basePath{ workingDirectory };
|
||||||
|
|
||||||
|
auto PerLineCallback = [&success, &basePath, &archive](AZStd::string_view filePathLine) -> void
|
||||||
|
{
|
||||||
|
AZStd::vector<char> fileBuffer;
|
||||||
|
AZ::IO::Path fullPath = (basePath / filePathLine);
|
||||||
|
if (ArchiveUtils::ReadFile(fullPath, AZ::IO::OpenMode::ModeRead, fileBuffer))
|
||||||
|
{
|
||||||
|
int result = archive->UpdateFile(
|
||||||
|
filePathLine, fileBuffer.data(), fileBuffer.size(), s_compressionMethod,
|
||||||
|
s_compressionLevel, s_compressionCodec);
|
||||||
|
|
||||||
|
bool thisSuccess = (result == AZ::IO::ZipDir::ZD_ERROR_SUCCESS);
|
||||||
|
success = (success && thisSuccess);
|
||||||
|
AZ_Error(
|
||||||
|
s_traceName, thisSuccess, "Error %d encountered while adding '%.*s' to archive '%.*s'", result,
|
||||||
|
AZ_STRING_ARG(filePathLine), AZ_STRING_ARG(archive->GetFullPath().Native()));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
AZ_Error(
|
||||||
|
s_traceName, false, "Error encountered while reading '%.*s' to add to archive '%.*s'", AZ_STRING_ARG(filePathLine),
|
||||||
|
AZ_STRING_ARG(archive->GetFullPath().Native()));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
ArchiveUtils::ProcessFileList(listFilePath, PerLineCallback);
|
||||||
|
|
||||||
|
archive.reset();
|
||||||
|
p.set_value(success);
|
||||||
|
};
|
||||||
|
|
||||||
|
// Async task...
|
||||||
|
std::promise<bool> p;
|
||||||
|
std::future<bool> f = p.get_future();
|
||||||
|
|
||||||
|
AZStd::thread_desc threadDesc;
|
||||||
|
threadDesc.m_name = "Archive Task (Add)";
|
||||||
|
m_threads.emplace_back(threadDesc, FnAddFilesToArchive, AZStd::move(p));
|
||||||
|
return f;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool ArchiveComponent::CheckParamsForAdd(const AZStd::string& directory, const AZStd::string& file)
|
||||||
|
{
|
||||||
|
if (!m_fileIO || !m_archive)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!m_fileIO->IsDirectory(directory.c_str()))
|
||||||
|
{
|
||||||
|
AZ_Error(
|
||||||
|
s_traceName, false, "Working directory '%s' is not a directory or doesn't exist!", directory.c_str());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!file.empty())
|
||||||
|
{
|
||||||
|
auto filePath = AZ::IO::Path{ directory } / file;
|
||||||
|
if (!m_fileIO->Exists(filePath.c_str()) || m_fileIO->IsDirectory(filePath.c_str()))
|
||||||
|
{
|
||||||
|
AZ_Error(s_traceName, false, "File list '%s' is a directory or doesn't exist!", filePath.c_str());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ArchiveComponent::CheckParamsForExtract(const AZStd::string& archive, const AZStd::string& directory)
|
||||||
|
{
|
||||||
|
if (!m_fileIO || !m_archive)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!m_fileIO->Exists(archive.c_str()))
|
||||||
|
{
|
||||||
|
AZ_Error(s_traceName, false, "Archive '%s' does not exist!", archive.c_str());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!m_fileIO->Exists(directory.c_str()))
|
||||||
|
{
|
||||||
|
if (!m_fileIO->CreatePath(directory.c_str()))
|
||||||
|
{
|
||||||
|
AZ_Error(s_traceName, false, "Failed to create destination directory '%s'", directory.c_str());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ArchiveComponent::CheckParamsForCreate(const AZStd::string& archive, const AZStd::string& directory)
|
||||||
|
{
|
||||||
|
if (!m_fileIO || !m_archive)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_fileIO->Exists(archive.c_str()))
|
||||||
|
{
|
||||||
|
AZ_Error(s_traceName, false, "Archive file '%s' already exists, cannot create a new archive there!");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!m_fileIO->IsDirectory(directory.c_str()))
|
||||||
|
{
|
||||||
|
AZ_Error(s_traceName, false, "Directory '%s' is not a directory or doesn't exist!", directory.c_str());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace AzToolsFramework
|
} // namespace AzToolsFramework
|
||||||
|
|||||||
@@ -10,80 +10,76 @@
|
|||||||
|
|
||||||
#include <AzCore/base.h>
|
#include <AzCore/base.h>
|
||||||
#include <AzCore/Component/Component.h>
|
#include <AzCore/Component/Component.h>
|
||||||
|
#include <AzCore/IO/FileIO.h>
|
||||||
#include <AzCore/std/parallel/thread.h>
|
#include <AzCore/std/parallel/thread.h>
|
||||||
#include <AzCore/std/parallel/conditional_variable.h>
|
#include <AzCore/std/parallel/conditional_variable.h>
|
||||||
#include <AzCore/std/containers/set.h>
|
#include <AzCore/std/containers/set.h>
|
||||||
#include <AzCore/std/containers/unordered_set.h>
|
#include <AzCore/std/containers/unordered_set.h>
|
||||||
|
|
||||||
|
#include <AzFramework/Archive/IArchive.h>
|
||||||
#include <AzToolsFramework/Archive/ArchiveAPI.h>
|
#include <AzToolsFramework/Archive/ArchiveAPI.h>
|
||||||
|
|
||||||
namespace AzToolsFramework
|
namespace AzToolsFramework
|
||||||
{
|
{
|
||||||
enum class SevenZipExitCode : AZ::u32
|
// the ArchiveComponent's job is to create and manipulate zip archives.
|
||||||
{
|
|
||||||
NoError = 0,
|
|
||||||
Warning = 1,
|
|
||||||
FatalError = 2,
|
|
||||||
CommandLineError = 7,
|
|
||||||
NotEnoughMemory = 8,
|
|
||||||
UserStoppedProcess = 255
|
|
||||||
};
|
|
||||||
|
|
||||||
// the ArchiveComponent's job is to execute zip commands.
|
|
||||||
// it parses the status of zip commands and returns results.
|
|
||||||
class ArchiveComponent
|
class ArchiveComponent
|
||||||
: public AZ::Component
|
: public AZ::Component
|
||||||
, private ArchiveCommands::Bus::Handler
|
, private ArchiveCommandsBus::Handler
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
AZ_COMPONENT(ArchiveComponent, "{A19EEA33-3736-447F-ACF7-DAA4B6A179AA}")
|
AZ_COMPONENT(ArchiveComponent, "{A19EEA33-3736-447F-ACF7-DAA4B6A179AA}");
|
||||||
|
|
||||||
ArchiveComponent() = default;
|
ArchiveComponent() = default;
|
||||||
~ArchiveComponent() override = default;
|
~ArchiveComponent() override = default;
|
||||||
|
|
||||||
|
ArchiveComponent(const ArchiveComponent&) = delete;
|
||||||
|
ArchiveComponent& operator=(const ArchiveComponent&) = delete;
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
// AZ::Component overrides
|
// AZ::Component overrides
|
||||||
void Activate() override;
|
void Activate() override;
|
||||||
void Deactivate() override;
|
void Deactivate() override;
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
private:
|
|
||||||
|
protected:
|
||||||
static void Reflect(AZ::ReflectContext* context);
|
static void Reflect(AZ::ReflectContext* context);
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
// ArchiveCommands::Bus::Handler overrides
|
// ArchiveCommandsBus::Handler overrides
|
||||||
void CreateArchive(const AZStd::string& archivePath, const AZStd::string& dirToArchive, AZ::Uuid taskHandle, const ArchiveResponseOutputCallback& respCallback) override;
|
[[nodiscard]] std::future<bool> CreateArchive(
|
||||||
bool CreateArchiveBlocking(const AZStd::string& archivePath, const AZStd::string& dirToArchive) override;
|
const AZStd::string& archivePath,
|
||||||
bool ExtractArchiveBlocking(const AZStd::string& archivePath, const AZStd::string& destinationPath, bool extractWithRootDirectory) override;
|
const AZStd::string& dirToArchive) override;
|
||||||
void ExtractArchive(const AZStd::string& archivePath, const AZStd::string& destinationPath, AZ::Uuid taskHandle, const ArchiveResponseCallback& respCallback) override;
|
|
||||||
void ExtractArchiveOutput(const AZStd::string& archivePath, const AZStd::string& destinationPath, AZ::Uuid taskHandle, const ArchiveResponseOutputCallback& respCallback) override;
|
[[nodiscard]] std::future<bool> ExtractArchive(
|
||||||
void ExtractArchiveWithoutRoot(const AZStd::string& archivePath, const AZStd::string& destinationPath, AZ::Uuid taskHandle, const ArchiveResponseOutputCallback& respCallback) override;
|
const AZStd::string& archivePath,
|
||||||
void ExtractFile(const AZStd::string& archivePath, const AZStd::string& fileInArchive, const AZStd::string& destinationPath, bool overWrite, AZ::Uuid taskHandle, const ArchiveResponseOutputCallback& respCallback) override;
|
const AZStd::string& destinationPath) override;
|
||||||
bool ExtractFileBlocking(const AZStd::string& archivePath, const AZStd::string& fileInArchive, const AZStd::string& destinationPath, bool overWrite) override;
|
|
||||||
void ListFilesInArchive(const AZStd::string& archivePath, AZStd::vector<AZStd::string>& fileEntries, AZ::Uuid taskHandle, const ArchiveResponseOutputCallback& respCallback) override;
|
[[nodiscard]] std::future<bool> ExtractFile(
|
||||||
bool ListFilesInArchiveBlocking(const AZStd::string& archivePath, AZStd::vector<AZStd::string>& fileEntries) override;
|
const AZStd::string& archivePath,
|
||||||
void AddFileToArchive(const AZStd::string& archivePath, const AZStd::string& workingDirectory, const AZStd::string& fileToAdd, AZ::Uuid taskHandle, const ArchiveResponseOutputCallback& respCallback) override;
|
const AZStd::string& fileInArchive,
|
||||||
bool AddFileToArchiveBlocking(const AZStd::string& archivePath, const AZStd::string& workingDirectory, const AZStd::string& fileToAdd) override;
|
const AZStd::string& destinationPath) override;
|
||||||
bool AddFilesToArchiveBlocking(const AZStd::string& archivePath, const AZStd::string& workingDirectory, const AZStd::string& listFilePath) override;
|
|
||||||
void AddFilesToArchive(const AZStd::string& archivePath, const AZStd::string& workingDirectory, const AZStd::string& listFilePath, AZ::Uuid taskHandle, const ArchiveResponseOutputCallback& respCallback) override;
|
bool ListFilesInArchive(const AZStd::string& archivePath, AZStd::vector<AZStd::string>& outFileEntries) override;
|
||||||
void CancelTasks(AZ::Uuid taskHandle) override;
|
|
||||||
|
[[nodiscard]] std::future<bool> AddFileToArchive(
|
||||||
|
const AZStd::string& archivePath,
|
||||||
|
const AZStd::string& workingDirectory,
|
||||||
|
const AZStd::string& fileToAdd) override;
|
||||||
|
|
||||||
|
[[nodiscard]] std::future<bool> AddFilesToArchive(
|
||||||
|
const AZStd::string& archivePath,
|
||||||
|
const AZStd::string& workingDirectory,
|
||||||
|
const AZStd::string& listFilePath) override;
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
// Launches the input zip exe as a background child process in a detached background thread, if the task handle is not null
|
|
||||||
// otherwise launches input zip exe in the calling thread.
|
|
||||||
void LaunchZipExe(const AZStd::string& exePath, const AZStd::string& commandLineArgs, const ArchiveResponseOutputCallback& respCallback, AZ::Uuid taskHandle = AZ::Uuid::CreateNull(), const AZStd::string& workingDir = "", bool captureOutput = false);
|
|
||||||
|
|
||||||
AZStd::string m_zipExePath;
|
private:
|
||||||
AZStd::string m_unzipExePath;
|
AZ::IO::FileIOBase* m_fileIO = nullptr;
|
||||||
|
AZ::IO::IArchive* m_archive = nullptr;
|
||||||
|
AZStd::vector<AZStd::thread> m_threads;
|
||||||
|
|
||||||
// Struct for tracking background threads/tasks
|
bool CheckParamsForAdd(const AZStd::string& directory, const AZStd::string& file);
|
||||||
struct ThreadInfo
|
bool CheckParamsForExtract(const AZStd::string& archive, const AZStd::string& directory);
|
||||||
{
|
bool CheckParamsForCreate(const AZStd::string& archive, const AZStd::string& directory);
|
||||||
bool shouldStop = false;
|
|
||||||
AZStd::set<AZStd::thread::id> threads;
|
|
||||||
};
|
|
||||||
|
|
||||||
AZStd::mutex m_threadControlMutex; // Guards m_threadInfoMap
|
|
||||||
AZStd::condition_variable m_cv;
|
|
||||||
AZStd::unordered_map<AZ::Uuid, ThreadInfo> m_threadInfoMap;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace AzToolsFramework
|
} // namespace AzToolsFramework
|
||||||
|
|||||||
@@ -16,91 +16,62 @@ namespace AzToolsFramework
|
|||||||
|
|
||||||
void NullArchiveComponent::Activate()
|
void NullArchiveComponent::Activate()
|
||||||
{
|
{
|
||||||
ArchiveCommands::Bus::Handler::BusConnect();
|
ArchiveCommandsBus::Handler::BusConnect();
|
||||||
}
|
}
|
||||||
|
|
||||||
void NullArchiveComponent::Deactivate()
|
void NullArchiveComponent::Deactivate()
|
||||||
{
|
{
|
||||||
ArchiveCommands::Bus::Handler::BusDisconnect();
|
ArchiveCommandsBus::Handler::BusDisconnect();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool NullArchiveComponent::ExtractArchiveBlocking(const AZStd::string& /*archivePath*/, const AZStd::string& /*destinationPath*/, bool /*extractWithRootDirectory*/)
|
std::future<bool> DefaultFuture()
|
||||||
|
{
|
||||||
|
std::promise<bool> p;
|
||||||
|
p.set_value(false);
|
||||||
|
return p.get_future();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::future<bool> NullArchiveComponent::CreateArchive(
|
||||||
|
const AZStd::string& /*archivePath*/,
|
||||||
|
const AZStd::string& /*dirToArchive*/)
|
||||||
|
{
|
||||||
|
return DefaultFuture();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::future<bool> NullArchiveComponent::ExtractArchive(
|
||||||
|
const AZStd::string& /*archivePath*/,
|
||||||
|
const AZStd::string& /*destinationPath*/)
|
||||||
|
{
|
||||||
|
return DefaultFuture();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::future<bool> NullArchiveComponent::ExtractFile(
|
||||||
|
const AZStd::string& /*archivePath*/,
|
||||||
|
const AZStd::string& /*fileInArchive*/,
|
||||||
|
const AZStd::string& /*destinationPath*/)
|
||||||
|
{
|
||||||
|
return DefaultFuture();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool NullArchiveComponent::ListFilesInArchive(const AZStd::string& /*archivePath*/, AZStd::vector<AZStd::string>& /*outFileEntries*/)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void NullArchiveComponent::ExtractArchive(const AZStd::string& /*archivePath*/, const AZStd::string& /*destinationPath*/, AZ::Uuid /*taskHandle*/, const ArchiveResponseCallback& respCallback)
|
std::future<bool> NullArchiveComponent::AddFileToArchive(
|
||||||
|
const AZStd::string& /*archivePath*/,
|
||||||
|
const AZStd::string& /*fileToAdd*/,
|
||||||
|
const AZStd::string& /*pathInArchive*/)
|
||||||
{
|
{
|
||||||
AZ::TickBus::QueueFunction(respCallback, false);
|
return DefaultFuture();
|
||||||
}
|
}
|
||||||
|
|
||||||
void NullArchiveComponent::ExtractArchiveOutput(const AZStd::string& /*archivePath*/, const AZStd::string& /*destinationPath*/, AZ::Uuid /*taskHandle*/, const ArchiveResponseOutputCallback& respCallback)
|
std::future<bool> NullArchiveComponent::AddFilesToArchive(
|
||||||
{
|
const AZStd::string& /*archivePath*/,
|
||||||
AZ::TickBus::QueueFunction(respCallback, false, AZStd::string());
|
const AZStd::string& /*workingDirectory*/,
|
||||||
}
|
const AZStd::string& /*listFilePath*/)
|
||||||
|
|
||||||
void NullArchiveComponent::ExtractArchiveWithoutRoot(const AZStd::string& /*archivePath*/, const AZStd::string& /*destinationPath*/, AZ::Uuid /*taskHandle*/, const ArchiveResponseOutputCallback& respCallback)
|
|
||||||
{
|
|
||||||
AZ::TickBus::QueueFunction(respCallback, false, AZStd::string());
|
|
||||||
}
|
|
||||||
|
|
||||||
void NullArchiveComponent::ExtractFile(const AZStd::string& /*archivePath*/, const AZStd::string& /*fileInArchive*/, const AZStd::string& /*destinationPath*/, bool /*overWrite*/, AZ::Uuid /*taskHandle*/, const ArchiveResponseOutputCallback& respCallback)
|
|
||||||
{
|
|
||||||
// Always report we failed to extract
|
|
||||||
AZ::TickBus::QueueFunction(respCallback, false, AZStd::string());
|
|
||||||
}
|
|
||||||
|
|
||||||
bool NullArchiveComponent::ExtractFileBlocking(const AZStd::string& /*archivePath*/, const AZStd::string& /*fileInArchive*/, const AZStd::string& /*destinationPath*/, bool /*overWrite*/)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void NullArchiveComponent::ListFilesInArchive(const AZStd::string& /*archivePath*/, AZStd::vector<AZStd::string>& /*consoleOutput*/, AZ::Uuid /*taskHandle*/, const ArchiveResponseOutputCallback& respCallback)
|
|
||||||
{
|
|
||||||
// Always report we failed to extract
|
|
||||||
AZ::TickBus::QueueFunction(respCallback, false, AZStd::string());
|
|
||||||
}
|
|
||||||
|
|
||||||
bool NullArchiveComponent::ListFilesInArchiveBlocking(const AZStd::string& /*archivePath*/, AZStd::vector<AZStd::string>& /*consoleOutput*/)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void NullArchiveComponent::AddFileToArchive(const AZStd::string& /*archivePath*/, const AZStd::string& /*fileToAdd*/, const AZStd::string& /*pathInArchive*/, AZ::Uuid /*taskHandle*/, const ArchiveResponseOutputCallback& respCallback)
|
|
||||||
{
|
|
||||||
// Always report we failed to extract
|
|
||||||
AZ::TickBus::QueueFunction(respCallback, false, AZStd::string());
|
|
||||||
}
|
|
||||||
|
|
||||||
bool NullArchiveComponent::AddFileToArchiveBlocking(const AZStd::string& /*archivePath*/, const AZStd::string& /*fileToAdd*/, const AZStd::string& /*pathInArchive*/)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool NullArchiveComponent::AddFilesToArchiveBlocking(const AZStd::string& /*archivePath*/, const AZStd::string& /*workingDirectory*/, const AZStd::string& /*listFilePath*/)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void NullArchiveComponent::AddFilesToArchive(const AZStd::string& /*archivePath*/, const AZStd::string& /*workingDirectory*/, const AZStd::string& /*listFilePath*/, AZ::Uuid /*taskHandle*/, const ArchiveResponseOutputCallback& respCallback)
|
|
||||||
{
|
|
||||||
// Always report we failed to extract
|
|
||||||
AZ::TickBus::QueueFunction(respCallback, false, AZStd::string());
|
|
||||||
}
|
|
||||||
|
|
||||||
void NullArchiveComponent::CreateArchive(const AZStd::string& /*archivePath*/, const AZStd::string& /*dirToArchive*/, AZ::Uuid /*taskHandle*/, const ArchiveResponseOutputCallback& respCallback)
|
|
||||||
{
|
|
||||||
// Always report we failed to extract
|
|
||||||
AZ::TickBus::QueueFunction(respCallback, false, AZStd::string());
|
|
||||||
}
|
|
||||||
|
|
||||||
bool NullArchiveComponent::CreateArchiveBlocking(const AZStd::string& /*archivePath*/, const AZStd::string& /*dirToArchive*/)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void NullArchiveComponent::CancelTasks(AZ::Uuid /*taskHandle*/)
|
|
||||||
{
|
{
|
||||||
|
return DefaultFuture();
|
||||||
}
|
}
|
||||||
|
|
||||||
void NullArchiveComponent::Reflect(AZ::ReflectContext* context)
|
void NullArchiveComponent::Reflect(AZ::ReflectContext* context)
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ namespace AzToolsFramework
|
|||||||
{
|
{
|
||||||
class NullArchiveComponent
|
class NullArchiveComponent
|
||||||
: public AZ::Component
|
: public AZ::Component
|
||||||
, private ArchiveCommands::Bus::Handler
|
, private ArchiveCommandsBus::Handler
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
AZ_COMPONENT(NullArchiveComponent, "{D665B6B1-5FF4-4203-B19F-BBDB82587129}")
|
AZ_COMPONENT(NullArchiveComponent, "{D665B6B1-5FF4-4203-B19F-BBDB82587129}")
|
||||||
@@ -32,23 +32,31 @@ namespace AzToolsFramework
|
|||||||
static void Reflect(AZ::ReflectContext* context);
|
static void Reflect(AZ::ReflectContext* context);
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
// ArchiveCommands::Bus::Handler overrides
|
// ArchiveCommandsBus::Handler overrides
|
||||||
// ArchiveCommands::Bus::Handler overrides
|
[[nodiscard]] std::future<bool> CreateArchive(
|
||||||
void CreateArchive(const AZStd::string& archivePath, const AZStd::string& dirToArchive, AZ::Uuid taskHandle, const ArchiveResponseOutputCallback& respCallback) override;
|
const AZStd::string& archivePath,
|
||||||
bool CreateArchiveBlocking(const AZStd::string& archivePath, const AZStd::string& dirToArchive) override;
|
const AZStd::string& dirToArchive) override;
|
||||||
bool ExtractArchiveBlocking(const AZStd::string& archivePath, const AZStd::string& destinationPath, bool extractWithRootDirectory) override;
|
|
||||||
void ExtractArchive(const AZStd::string& archivePath, const AZStd::string& destinationPath, AZ::Uuid taskHandle, const ArchiveResponseCallback& respCallback) override;
|
[[nodiscard]] std::future<bool> ExtractArchive(
|
||||||
void ExtractArchiveOutput(const AZStd::string& archivePath, const AZStd::string& destinationPath, AZ::Uuid taskHandle, const ArchiveResponseOutputCallback& respCallback) override;
|
const AZStd::string& archivePath,
|
||||||
void ExtractArchiveWithoutRoot(const AZStd::string& archivePath, const AZStd::string& destinationPath, AZ::Uuid taskHandle, const ArchiveResponseOutputCallback& respCallback) override;
|
const AZStd::string& destinationPath) override;
|
||||||
void ExtractFile(const AZStd::string& archivePath, const AZStd::string& fileInArchive, const AZStd::string& destinationPath, bool overWrite, AZ::Uuid taskHandle, const ArchiveResponseOutputCallback& respCallback) override;
|
|
||||||
bool ExtractFileBlocking(const AZStd::string& archivePath, const AZStd::string& fileInArchive, const AZStd::string& destinationPath, bool overWrite) override;
|
[[nodiscard]] std::future<bool> ExtractFile(
|
||||||
void ListFilesInArchive(const AZStd::string& archivePath, AZStd::vector<AZStd::string>& consoleOutput, AZ::Uuid taskHandle, const ArchiveResponseOutputCallback& respCallback) override;
|
const AZStd::string& archivePath,
|
||||||
bool ListFilesInArchiveBlocking(const AZStd::string& archivePath, AZStd::vector<AZStd::string>& consoleOutput) override;
|
const AZStd::string& fileInArchive,
|
||||||
void AddFileToArchive(const AZStd::string& archivePath, const AZStd::string& fileToAdd, const AZStd::string& pathInArchive, AZ::Uuid taskHandle, const ArchiveResponseOutputCallback& respCallback) override;
|
const AZStd::string& destinationPath) override;
|
||||||
bool AddFileToArchiveBlocking(const AZStd::string& archivePath, const AZStd::string& fileToAdd, const AZStd::string& pathInArchive) override;
|
|
||||||
bool AddFilesToArchiveBlocking(const AZStd::string& archivePath, const AZStd::string& workingDirectory, const AZStd::string& listFilePath) override;
|
bool ListFilesInArchive(const AZStd::string& archivePath, AZStd::vector<AZStd::string>& outFileEntries) override;
|
||||||
void AddFilesToArchive(const AZStd::string& archivePath, const AZStd::string& workingDirectory, const AZStd::string& listFilePath, AZ::Uuid taskHandle, const ArchiveResponseOutputCallback& respCallback) override;
|
|
||||||
void CancelTasks(AZ::Uuid taskHandle) override;
|
[[nodiscard]] std::future<bool> AddFileToArchive(
|
||||||
|
const AZStd::string& archivePath,
|
||||||
|
const AZStd::string& workingDirectory,
|
||||||
|
const AZStd::string& fileToAdd) override;
|
||||||
|
|
||||||
|
[[nodiscard]] std::future<bool> AddFilesToArchive(
|
||||||
|
const AZStd::string& archivePath,
|
||||||
|
const AZStd::string& workingDirectory,
|
||||||
|
const AZStd::string& listFilePath) override;
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
};
|
};
|
||||||
} // namespace AzToolsFramework
|
} // namespace AzToolsFramework
|
||||||
|
|||||||
+1
-1
@@ -20,7 +20,7 @@ AZ_PUSH_DISABLE_WARNING(4251, "-Wunknown-warning-option")
|
|||||||
AZ_POP_DISABLE_WARNING
|
AZ_POP_DISABLE_WARNING
|
||||||
|
|
||||||
AZ_CVAR(
|
AZ_CVAR(
|
||||||
bool, ed_useNewAssetBrowserTableView, true, nullptr, AZ::ConsoleFunctorFlags::Null,
|
bool, ed_useNewAssetBrowserTableView, false, nullptr, AZ::ConsoleFunctorFlags::Null,
|
||||||
"Use the new AssetBrowser TableView for searching assets.");
|
"Use the new AssetBrowser TableView for searching assets.");
|
||||||
namespace AzToolsFramework
|
namespace AzToolsFramework
|
||||||
{
|
{
|
||||||
|
|||||||
+1
-1
@@ -290,7 +290,7 @@ namespace AzToolsFramework
|
|||||||
absoluteIconPath = AZ::IO::FixedMaxPath(AZ::Utils::GetEnginePath()) / TreeIconPathOneChild;
|
absoluteIconPath = AZ::IO::FixedMaxPath(AZ::Utils::GetEnginePath()) / TreeIconPathOneChild;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
bool pixmapLoadedSuccess = pixmap.load(absoluteIconPath.c_str());
|
[[maybe_unused]] bool pixmapLoadedSuccess = pixmap.load(absoluteIconPath.c_str());
|
||||||
AZ_Assert(pixmapLoadedSuccess, "Error loading Branch Icons in SearchEntryDelegate");
|
AZ_Assert(pixmapLoadedSuccess, "Error loading Branch Icons in SearchEntryDelegate");
|
||||||
|
|
||||||
m_branchIcons[static_cast<EntryBranchType>(branchType)] = pixmap;
|
m_branchIcons[static_cast<EntryBranchType>(branchType)] = pixmap;
|
||||||
|
|||||||
+17
-10
@@ -32,12 +32,10 @@ namespace AzToolsFramework
|
|||||||
const int NumOfBytesInMB = 1024 * 1024;
|
const int NumOfBytesInMB = 1024 * 1024;
|
||||||
const int ManifestFileSizeBufferInBytes = 10 * 1024; // 10 KB
|
const int ManifestFileSizeBufferInBytes = 10 * 1024; // 10 KB
|
||||||
const float AssetCatalogFileSizeBufferPercentage = 1.0f;
|
const float AssetCatalogFileSizeBufferPercentage = 1.0f;
|
||||||
using ArchiveCommandsBus = AzToolsFramework::ArchiveCommands::Bus;
|
|
||||||
using AssetCatalogRequestBus = AZ::Data::AssetCatalogRequestBus;
|
using AssetCatalogRequestBus = AZ::Data::AssetCatalogRequestBus;
|
||||||
|
|
||||||
const char AssetBundleComponent::DeltaCatalogName[] = "DeltaCatalog.xml";
|
const char AssetBundleComponent::DeltaCatalogName[] = "DeltaCatalog.xml";
|
||||||
|
|
||||||
constexpr int SleepTimeMS = 250;
|
|
||||||
constexpr int InjectFileRetryCount = 4;
|
constexpr int InjectFileRetryCount = 4;
|
||||||
|
|
||||||
|
|
||||||
@@ -136,7 +134,7 @@ namespace AzToolsFramework
|
|||||||
AZ_TracePrintf(logWindowName, "Gathering file entries in source pak file \"%s\".\n", sourcePak.c_str());
|
AZ_TracePrintf(logWindowName, "Gathering file entries in source pak file \"%s\".\n", sourcePak.c_str());
|
||||||
bool result = false;
|
bool result = false;
|
||||||
AZStd::vector<AZStd::string> fileEntries;
|
AZStd::vector<AZStd::string> fileEntries;
|
||||||
ArchiveCommandsBus::BroadcastResult(result, &AzToolsFramework::ArchiveCommands::ListFilesInArchiveBlocking, normalizedSourcePakPath, fileEntries);
|
ArchiveCommandsBus::BroadcastResult(result, &AzToolsFramework::ArchiveCommandsBus::Events::ListFilesInArchive, normalizedSourcePakPath, fileEntries);
|
||||||
// This ebus currently always returns false as the result, as it is believed that the 7z process is
|
// This ebus currently always returns false as the result, as it is believed that the 7z process is
|
||||||
// being terminated by the user instead of ending gracefully. Check against an empty fileList instead
|
// being terminated by the user instead of ending gracefully. Check against an empty fileList instead
|
||||||
// as a result.
|
// as a result.
|
||||||
@@ -606,15 +604,17 @@ namespace AzToolsFramework
|
|||||||
{
|
{
|
||||||
AZ_TracePrintf(logWindowName, "Injecting file (%s) into bundle (%s).\n", filePath.c_str(), archiveFilePath.c_str());
|
AZ_TracePrintf(logWindowName, "Injecting file (%s) into bundle (%s).\n", filePath.c_str(), archiveFilePath.c_str());
|
||||||
bool fileAddedToArchive = false;
|
bool fileAddedToArchive = false;
|
||||||
|
std::future<bool> fileAdded;
|
||||||
int retryCount = InjectFileRetryCount;
|
int retryCount = InjectFileRetryCount;
|
||||||
|
|
||||||
while (!fileAddedToArchive && retryCount)
|
while (!fileAddedToArchive && retryCount)
|
||||||
{
|
{
|
||||||
ArchiveCommandsBus::BroadcastResult(fileAddedToArchive, &AzToolsFramework::ArchiveCommands::AddFileToArchiveBlocking, archiveFilePath, workingDirectory, filePath);
|
ArchiveCommandsBus::BroadcastResult(fileAdded, &AzToolsFramework::ArchiveCommandsBus::Events::AddFileToArchive, archiveFilePath, workingDirectory, filePath);
|
||||||
--retryCount;
|
--retryCount;
|
||||||
|
fileAddedToArchive = fileAdded.get();
|
||||||
if (!fileAddedToArchive && retryCount)
|
if (!fileAddedToArchive && retryCount)
|
||||||
{
|
{
|
||||||
AZ_Error(logWindowName, false, "Failed to insert file (%s) into bundle (%s). Retrying.", filePath.c_str(), archiveFilePath.c_str());
|
AZ_Error(logWindowName, false, "Failed to insert file (%s) into bundle (%s). Retrying.", filePath.c_str(), archiveFilePath.c_str());
|
||||||
AZStd::this_thread::sleep_for(AZStd::chrono::milliseconds(SleepTimeMS));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -627,7 +627,11 @@ namespace AzToolsFramework
|
|||||||
|
|
||||||
bool AssetBundleComponent::InjectFile(const AZStd::string& filePath, const AZStd::string& sourcePak)
|
bool AssetBundleComponent::InjectFile(const AZStd::string& filePath, const AZStd::string& sourcePak)
|
||||||
{
|
{
|
||||||
return InjectFile(filePath, sourcePak, "");
|
// When no working directory is specified, assume that the file being injected goes into the root of the archive.
|
||||||
|
// The filePath should be an absolute path, making the workingDirectory be the path leading up to the file.
|
||||||
|
AZ::IO::PathView fullFilePath{ filePath, AZ::IO::PosixPathSeparator };
|
||||||
|
AZ::IO::Path workingDir{ fullFilePath.ParentPath() };
|
||||||
|
return InjectFile(filePath, sourcePak, workingDir.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AssetBundleComponent::InjectFiles(const AZStd::vector<AZStd::string>& fileEntries, const AZStd::string& sourcePak, const char* workingDirectory)
|
bool AssetBundleComponent::InjectFiles(const AZStd::vector<AZStd::string>& fileEntries, const AZStd::string& sourcePak, const char* workingDirectory)
|
||||||
@@ -668,8 +672,9 @@ namespace AzToolsFramework
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool filesAddedToArchive = false;
|
std::future<bool> filesAdded;
|
||||||
AzToolsFramework::ArchiveCommandsBus::BroadcastResult(filesAddedToArchive, &AzToolsFramework::ArchiveCommands::AddFilesToArchiveBlocking, sourcePak, workingDirectory, listFilePath);
|
AzToolsFramework::ArchiveCommandsBus::BroadcastResult(filesAdded, &AzToolsFramework::ArchiveCommands::AddFilesToArchive, sourcePak, workingDirectory, listFilePath);
|
||||||
|
bool filesAddedToArchive = filesAdded.get();
|
||||||
if (!filesAddedToArchive)
|
if (!filesAddedToArchive)
|
||||||
{
|
{
|
||||||
AZ_Error(logWindowName, false, "Failed to insert files into bundle (%s).\n", sourcePak.c_str());
|
AZ_Error(logWindowName, false, "Failed to insert files into bundle (%s).\n", sourcePak.c_str());
|
||||||
@@ -688,7 +693,6 @@ namespace AzToolsFramework
|
|||||||
{
|
{
|
||||||
// open the manifest and deserialize it
|
// open the manifest and deserialize it
|
||||||
bool manifestExtracted = false;
|
bool manifestExtracted = false;
|
||||||
const bool overwriteExisting = true;
|
|
||||||
|
|
||||||
TemporaryDir tempDir(sourcePak);
|
TemporaryDir tempDir(sourcePak);
|
||||||
if (!tempDir.m_result)
|
if (!tempDir.m_result)
|
||||||
@@ -698,7 +702,10 @@ namespace AzToolsFramework
|
|||||||
|
|
||||||
AZStd::string manifestFilePath;
|
AZStd::string manifestFilePath;
|
||||||
AzFramework::StringFunc::Path::ConstructFull(tempDir.m_tempFolderPath.c_str(), AzFramework::AssetBundleManifest::s_manifestFileName, manifestFilePath, true);
|
AzFramework::StringFunc::Path::ConstructFull(tempDir.m_tempFolderPath.c_str(), AzFramework::AssetBundleManifest::s_manifestFileName, manifestFilePath, true);
|
||||||
ArchiveCommandsBus::BroadcastResult(manifestExtracted, &ArchiveCommandsBus::Events::ExtractFileBlocking, sourcePak, AzFramework::AssetBundleManifest::s_manifestFileName, tempDir.m_tempFolderPath, overwriteExisting);
|
|
||||||
|
std::future<bool> extractResult;
|
||||||
|
ArchiveCommandsBus::BroadcastResult(extractResult, &ArchiveCommandsBus::Events::ExtractFile, sourcePak, AzFramework::AssetBundleManifest::s_manifestFileName, tempDir.m_tempFolderPath);
|
||||||
|
manifestExtracted = extractResult.get();
|
||||||
if (!manifestExtracted)
|
if (!manifestExtracted)
|
||||||
{
|
{
|
||||||
AZ_Error(logWindowName, false, "Failed to extract existing manifest from archive \"%s\".", sourcePak.c_str());
|
AZ_Error(logWindowName, false, "Failed to extract existing manifest from archive \"%s\".", sourcePak.c_str());
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ namespace AzToolsFramework
|
|||||||
//! Returns true if the file at filePath was successfully injected into the bundle at sourcePak
|
//! Returns true if the file at filePath was successfully injected into the bundle at sourcePak
|
||||||
static bool InjectFile(const AZStd::string& filePath, const AZStd::string& sourcePak, const char* workingDirectory);
|
static bool InjectFile(const AZStd::string& filePath, const AZStd::string& sourcePak, const char* workingDirectory);
|
||||||
|
|
||||||
//! Inject the files with relative filePaths which espect to the working directory into the bundle at sourcePak
|
//! Inject the files with relative filePaths with respect to the working directory into the bundle at sourcePak
|
||||||
//! Returns true if the file at filePath was successfully injected into the bundle at sourcePak
|
//! Returns true if the file at filePath was successfully injected into the bundle at sourcePak
|
||||||
static bool InjectFiles(const AZStd::vector<AZStd::string>& fileEntries, const AZStd::string& sourcePak, const char* workingDirectory);
|
static bool InjectFiles(const AZStd::vector<AZStd::string>& fileEntries, const AZStd::string& sourcePak, const char* workingDirectory);
|
||||||
|
|
||||||
|
|||||||
+21
-17
@@ -18,8 +18,9 @@
|
|||||||
#include <AzToolsFramework/API/ToolsApplicationAPI.h>
|
#include <AzToolsFramework/API/ToolsApplicationAPI.h>
|
||||||
#include <AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.h>
|
#include <AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.h>
|
||||||
#include <AzToolsFramework/Prefab/EditorPrefabComponent.h>
|
#include <AzToolsFramework/Prefab/EditorPrefabComponent.h>
|
||||||
#include <AzToolsFramework/Prefab/Instance/InstanceEntityMapperInterface.h>
|
|
||||||
#include <AzToolsFramework/Prefab/Instance/Instance.h>
|
#include <AzToolsFramework/Prefab/Instance/Instance.h>
|
||||||
|
#include <AzToolsFramework/Prefab/Instance/InstanceEntityIdMapper.h>
|
||||||
|
#include <AzToolsFramework/Prefab/Instance/InstanceEntityMapperInterface.h>
|
||||||
#include <AzToolsFramework/Prefab/PrefabDomUtils.h>
|
#include <AzToolsFramework/Prefab/PrefabDomUtils.h>
|
||||||
#include <AzToolsFramework/Prefab/PrefabLoader.h>
|
#include <AzToolsFramework/Prefab/PrefabLoader.h>
|
||||||
#include <AzToolsFramework/Prefab/PrefabSystemComponentInterface.h>
|
#include <AzToolsFramework/Prefab/PrefabSystemComponentInterface.h>
|
||||||
@@ -317,17 +318,18 @@ namespace AzToolsFramework
|
|||||||
const AZStd::vector<AZ::Entity*>& entities, AZStd::vector<AZStd::unique_ptr<Prefab::Instance>>&& nestedPrefabInstances,
|
const AZStd::vector<AZ::Entity*>& entities, AZStd::vector<AZStd::unique_ptr<Prefab::Instance>>&& nestedPrefabInstances,
|
||||||
AZ::IO::PathView filePath, Prefab::InstanceOptionalReference instanceToParentUnder)
|
AZ::IO::PathView filePath, Prefab::InstanceOptionalReference instanceToParentUnder)
|
||||||
{
|
{
|
||||||
AZStd::unique_ptr<Prefab::Instance> createdPrefabInstance =
|
if (!instanceToParentUnder)
|
||||||
m_prefabSystemComponent->CreatePrefab(entities, AZStd::move(nestedPrefabInstances), filePath, nullptr, false);
|
{
|
||||||
|
instanceToParentUnder = *m_rootInstance;
|
||||||
|
}
|
||||||
|
|
||||||
|
AZStd::unique_ptr<Prefab::Instance> createdPrefabInstance = m_prefabSystemComponent->CreatePrefab(
|
||||||
|
entities, AZStd::move(nestedPrefabInstances), filePath, nullptr, instanceToParentUnder, false);
|
||||||
|
|
||||||
if (createdPrefabInstance)
|
if (createdPrefabInstance)
|
||||||
{
|
{
|
||||||
if (!instanceToParentUnder)
|
Prefab::Instance& addedInstance = instanceToParentUnder->get().AddInstance(
|
||||||
{
|
AZStd::move(createdPrefabInstance));
|
||||||
instanceToParentUnder = *m_rootInstance;
|
|
||||||
}
|
|
||||||
|
|
||||||
Prefab::Instance& addedInstance = instanceToParentUnder->get().AddInstance(AZStd::move(createdPrefabInstance));
|
|
||||||
AZ::Entity* containerEntity = addedInstance.m_containerEntity.get();
|
AZ::Entity* containerEntity = addedInstance.m_containerEntity.get();
|
||||||
containerEntity->AddComponent(aznew Prefab::EditorPrefabComponent());
|
containerEntity->AddComponent(aznew Prefab::EditorPrefabComponent());
|
||||||
HandleEntitiesAdded({containerEntity});
|
HandleEntitiesAdded({containerEntity});
|
||||||
@@ -341,16 +343,18 @@ namespace AzToolsFramework
|
|||||||
Prefab::InstanceOptionalReference PrefabEditorEntityOwnershipService::InstantiatePrefab(
|
Prefab::InstanceOptionalReference PrefabEditorEntityOwnershipService::InstantiatePrefab(
|
||||||
AZ::IO::PathView filePath, Prefab::InstanceOptionalReference instanceToParentUnder)
|
AZ::IO::PathView filePath, Prefab::InstanceOptionalReference instanceToParentUnder)
|
||||||
{
|
{
|
||||||
AZStd::unique_ptr<Prefab::Instance> createdPrefabInstance = m_prefabSystemComponent->InstantiatePrefab(filePath);
|
if (!instanceToParentUnder)
|
||||||
|
|
||||||
if (createdPrefabInstance)
|
|
||||||
{
|
{
|
||||||
if (!instanceToParentUnder)
|
instanceToParentUnder = *m_rootInstance;
|
||||||
{
|
}
|
||||||
instanceToParentUnder = *m_rootInstance;
|
|
||||||
}
|
|
||||||
|
|
||||||
Prefab::Instance& addedInstance = instanceToParentUnder->get().AddInstance(AZStd::move(createdPrefabInstance));
|
AZStd::unique_ptr<Prefab::Instance> instantiatedPrefabInstance =
|
||||||
|
m_prefabSystemComponent->InstantiatePrefab(filePath, instanceToParentUnder);
|
||||||
|
|
||||||
|
if (instantiatedPrefabInstance)
|
||||||
|
{
|
||||||
|
Prefab::Instance& addedInstance = instanceToParentUnder->get().AddInstance(
|
||||||
|
AZStd::move(instantiatedPrefabInstance));
|
||||||
HandleEntitiesAdded({addedInstance.m_containerEntity.get()});
|
HandleEntitiesAdded({addedInstance.m_containerEntity.get()});
|
||||||
return addedInstance;
|
return addedInstance;
|
||||||
}
|
}
|
||||||
|
|||||||
+13
-1
@@ -11,6 +11,7 @@
|
|||||||
#include <AzToolsFramework/API/ViewportEditorModeTrackerInterface.h>
|
#include <AzToolsFramework/API/ViewportEditorModeTrackerInterface.h>
|
||||||
#include <AzToolsFramework/FocusMode/FocusModeNotificationBus.h>
|
#include <AzToolsFramework/FocusMode/FocusModeNotificationBus.h>
|
||||||
#include <AzToolsFramework/FocusMode/FocusModeSystemComponent.h>
|
#include <AzToolsFramework/FocusMode/FocusModeSystemComponent.h>
|
||||||
|
#include <AzToolsFramework/API/ViewportEditorModeTrackerInterface.h>
|
||||||
|
|
||||||
namespace AzToolsFramework
|
namespace AzToolsFramework
|
||||||
{
|
{
|
||||||
@@ -73,7 +74,18 @@ namespace AzToolsFramework
|
|||||||
m_focusRoot = entityId;
|
m_focusRoot = entityId;
|
||||||
FocusModeNotificationBus::Broadcast(&FocusModeNotifications::OnEditorFocusChanged, m_focusRoot);
|
FocusModeNotificationBus::Broadcast(&FocusModeNotifications::OnEditorFocusChanged, m_focusRoot);
|
||||||
|
|
||||||
// TODO - If m_focusRoot != AZ::EntityId(), activate focus mode via ViewportEditorModeTrackerInterface; else, deactivate focus mode
|
if (auto tracker = AZ::Interface<ViewportEditorModeTrackerInterface>::Get();
|
||||||
|
tracker != nullptr)
|
||||||
|
{
|
||||||
|
if (!m_focusRoot.IsValid() && entityId.IsValid())
|
||||||
|
{
|
||||||
|
tracker->ActivateMode({ /* DefaultViewportId */ }, ViewportEditorMode::Focus);
|
||||||
|
}
|
||||||
|
else if (m_focusRoot.IsValid() && !entityId.IsValid())
|
||||||
|
{
|
||||||
|
tracker->DeactivateMode({ /* DefaultViewportId */ }, ViewportEditorMode::Focus);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void FocusModeSystemComponent::ClearFocusRoot([[maybe_unused]] AzFramework::EntityContextId entityContextId)
|
void FocusModeSystemComponent::ClearFocusRoot([[maybe_unused]] AzFramework::EntityContextId entityContextId)
|
||||||
|
|||||||
@@ -15,6 +15,7 @@
|
|||||||
#include <AzToolsFramework/Entity/EditorEntityHelpers.h>
|
#include <AzToolsFramework/Entity/EditorEntityHelpers.h>
|
||||||
#include <AzToolsFramework/Prefab/Instance/Instance.h>
|
#include <AzToolsFramework/Prefab/Instance/Instance.h>
|
||||||
#include <AzToolsFramework/Prefab/PrefabDomUtils.h>
|
#include <AzToolsFramework/Prefab/PrefabDomUtils.h>
|
||||||
|
#include <AzToolsFramework/Prefab/Instance/InstanceEntityIdMapper.h>
|
||||||
#include <AzToolsFramework/Prefab/Instance/InstanceEntityMapperInterface.h>
|
#include <AzToolsFramework/Prefab/Instance/InstanceEntityMapperInterface.h>
|
||||||
#include <AzToolsFramework/Prefab/Instance/TemplateInstanceMapperInterface.h>
|
#include <AzToolsFramework/Prefab/Instance/TemplateInstanceMapperInterface.h>
|
||||||
|
|
||||||
@@ -28,24 +29,52 @@ namespace AzToolsFramework
|
|||||||
}
|
}
|
||||||
|
|
||||||
Instance::Instance(AZStd::unique_ptr<AZ::Entity> containerEntity)
|
Instance::Instance(AZStd::unique_ptr<AZ::Entity> containerEntity)
|
||||||
|
: Instance(AZStd::move(containerEntity), AZStd::nullopt, GenerateInstanceAlias())
|
||||||
{
|
{
|
||||||
m_instanceEntityMapper = AZ::Interface<InstanceEntityMapperInterface>::Get();
|
}
|
||||||
|
|
||||||
|
Instance::Instance(InstanceOptionalReference parent)
|
||||||
|
: Instance(nullptr, parent, GenerateInstanceAlias())
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Instance::Instance(InstanceAlias alias)
|
||||||
|
: Instance(nullptr, AZStd::nullopt, AZStd::move(alias))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Instance::Instance(AZStd::unique_ptr<AZ::Entity> containerEntity, InstanceOptionalReference parent)
|
||||||
|
: Instance(AZStd::move(containerEntity), parent, GenerateInstanceAlias())
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Instance::Instance(AZStd::unique_ptr<AZ::Entity> containerEntity, InstanceOptionalReference parent, InstanceAlias alias)
|
||||||
|
: m_parent(parent.has_value() ? &parent->get() : nullptr)
|
||||||
|
, m_alias(AZStd::move(alias))
|
||||||
|
, m_containerEntity(containerEntity ? AZStd::move(containerEntity) : AZStd::make_unique<AZ::Entity>())
|
||||||
|
, m_instanceEntityMapper(AZ::Interface<InstanceEntityMapperInterface>::Get())
|
||||||
|
, m_templateInstanceMapper(AZ::Interface<TemplateInstanceMapperInterface>::Get())
|
||||||
|
{
|
||||||
AZ_Assert(m_instanceEntityMapper,
|
AZ_Assert(m_instanceEntityMapper,
|
||||||
"Instance Entity Mapper Interface could not be found. "
|
"Instance Entity Mapper Interface could not be found. "
|
||||||
"It is a requirement for the Prefab Instance class. "
|
"It is a requirement for the Prefab Instance class. "
|
||||||
"Check that it is being correctly initialized.");
|
"Check that it is being correctly initialized.");
|
||||||
|
|
||||||
m_templateInstanceMapper = AZ::Interface<TemplateInstanceMapperInterface>::Get();
|
|
||||||
|
|
||||||
AZ_Assert(m_templateInstanceMapper,
|
AZ_Assert(m_templateInstanceMapper,
|
||||||
"Template Instance Mapper Interface could not be found. "
|
"Template Instance Mapper Interface could not be found. "
|
||||||
"It is a requirement for the Prefab Instance class. "
|
"It is a requirement for the Prefab Instance class. "
|
||||||
"Check that it is being correctly initialized.");
|
"Check that it is being correctly initialized.");
|
||||||
|
|
||||||
m_alias = GenerateInstanceAlias();
|
if (parent)
|
||||||
m_containerEntity = containerEntity ? AZStd::move(containerEntity)
|
{
|
||||||
: AZStd::make_unique<AZ::Entity>();
|
AliasPath absoluteInstancePath = m_parent->GetAbsoluteInstanceAliasPath();
|
||||||
|
absoluteInstancePath.Append(m_alias);
|
||||||
|
absoluteInstancePath.Append(PrefabDomUtils::ContainerEntityName);
|
||||||
|
|
||||||
|
AZ::EntityId newContainerEntityId = InstanceEntityIdMapper::GenerateEntityIdForAliasPath(absoluteInstancePath);
|
||||||
|
m_containerEntity->SetId(newContainerEntityId);
|
||||||
|
}
|
||||||
|
|
||||||
RegisterEntity(m_containerEntity->GetId(), PrefabDomUtils::ContainerEntityName);
|
RegisterEntity(m_containerEntity->GetId(), PrefabDomUtils::ContainerEntityName);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -69,12 +98,12 @@ namespace AzToolsFramework
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const TemplateId& Instance::GetTemplateId() const
|
TemplateId Instance::GetTemplateId() const
|
||||||
{
|
{
|
||||||
return m_templateId;
|
return m_templateId;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Instance::SetTemplateId(const TemplateId& templateId)
|
void Instance::SetTemplateId(TemplateId templateId)
|
||||||
{
|
{
|
||||||
// If we aren't changing the template Id, there's no need to unregister / re-register
|
// If we aren't changing the template Id, there's no need to unregister / re-register
|
||||||
if (templateId == m_templateId)
|
if (templateId == m_templateId)
|
||||||
@@ -295,20 +324,21 @@ namespace AzToolsFramework
|
|||||||
}
|
}
|
||||||
|
|
||||||
Instance& Instance::AddInstance(AZStd::unique_ptr<Instance> instance)
|
Instance& Instance::AddInstance(AZStd::unique_ptr<Instance> instance)
|
||||||
{
|
|
||||||
InstanceAlias newInstanceAlias = GenerateInstanceAlias();
|
|
||||||
return AddInstance(AZStd::move(instance), newInstanceAlias);
|
|
||||||
}
|
|
||||||
|
|
||||||
Instance& Instance::AddInstance(AZStd::unique_ptr<Instance> instance, InstanceAlias newInstanceAlias)
|
|
||||||
{
|
{
|
||||||
AZ_Assert(instance.get(), "instance argument is nullptr");
|
AZ_Assert(instance.get(), "instance argument is nullptr");
|
||||||
|
|
||||||
|
if (instance->GetInstanceAlias().empty())
|
||||||
|
{
|
||||||
|
instance->m_alias = GenerateInstanceAlias();
|
||||||
|
}
|
||||||
|
|
||||||
AZ_Assert(
|
AZ_Assert(
|
||||||
m_nestedInstances.find(newInstanceAlias) == m_nestedInstances.end(),
|
m_nestedInstances.find(instance->GetInstanceAlias()) == m_nestedInstances.end(),
|
||||||
"InstanceAlias' unique id collision, this should never happen.");
|
"InstanceAlias' unique id collision, this should never happen.");
|
||||||
|
|
||||||
instance->m_parent = this;
|
instance->m_parent = this;
|
||||||
instance->m_alias = newInstanceAlias;
|
auto& alias = instance->GetInstanceAlias();
|
||||||
return *(m_nestedInstances[newInstanceAlias] = std::move(instance));
|
return *(m_nestedInstances[alias] = AZStd::move(instance));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Instance::DetachNestedInstances(const AZStd::function<void(AZStd::unique_ptr<Instance>)>& callback)
|
void Instance::DetachNestedInstances(const AZStd::function<void(AZStd::unique_ptr<Instance>)>& callback)
|
||||||
|
|||||||
@@ -65,6 +65,9 @@ namespace AzToolsFramework
|
|||||||
|
|
||||||
Instance();
|
Instance();
|
||||||
explicit Instance(AZStd::unique_ptr<AZ::Entity> containerEntity);
|
explicit Instance(AZStd::unique_ptr<AZ::Entity> containerEntity);
|
||||||
|
explicit Instance(InstanceOptionalReference parent);
|
||||||
|
explicit Instance(AZStd::unique_ptr<AZ::Entity> containerEntity, InstanceOptionalReference parent);
|
||||||
|
explicit Instance(InstanceAlias alias);
|
||||||
virtual ~Instance();
|
virtual ~Instance();
|
||||||
|
|
||||||
Instance(const Instance& rhs) = delete;
|
Instance(const Instance& rhs) = delete;
|
||||||
@@ -72,8 +75,8 @@ namespace AzToolsFramework
|
|||||||
|
|
||||||
static void Reflect(AZ::ReflectContext* context);
|
static void Reflect(AZ::ReflectContext* context);
|
||||||
|
|
||||||
const TemplateId& GetTemplateId() const;
|
TemplateId GetTemplateId() const;
|
||||||
void SetTemplateId(const TemplateId& templateId);
|
void SetTemplateId(TemplateId templateId);
|
||||||
|
|
||||||
const AZ::IO::Path& GetTemplateSourcePath() const;
|
const AZ::IO::Path& GetTemplateSourcePath() const;
|
||||||
void SetTemplateSourcePath(AZ::IO::PathView sourcePath);
|
void SetTemplateSourcePath(AZ::IO::PathView sourcePath);
|
||||||
@@ -97,7 +100,6 @@ namespace AzToolsFramework
|
|||||||
void Reset();
|
void Reset();
|
||||||
|
|
||||||
Instance& AddInstance(AZStd::unique_ptr<Instance> instance);
|
Instance& AddInstance(AZStd::unique_ptr<Instance> instance);
|
||||||
Instance& AddInstance(AZStd::unique_ptr<Instance> instance, InstanceAlias instanceAlias);
|
|
||||||
AZStd::unique_ptr<Instance> DetachNestedInstance(const InstanceAlias& instanceAlias);
|
AZStd::unique_ptr<Instance> DetachNestedInstance(const InstanceAlias& instanceAlias);
|
||||||
void DetachNestedInstances(const AZStd::function<void(AZStd::unique_ptr<Instance>)>& callback);
|
void DetachNestedInstances(const AZStd::function<void(AZStd::unique_ptr<Instance>)>& callback);
|
||||||
|
|
||||||
@@ -184,6 +186,8 @@ namespace AzToolsFramework
|
|||||||
private:
|
private:
|
||||||
static constexpr const char s_aliasPathSeparator = '/';
|
static constexpr const char s_aliasPathSeparator = '/';
|
||||||
|
|
||||||
|
Instance(AZStd::unique_ptr<AZ::Entity> containerEntity, InstanceOptionalReference parent, InstanceAlias alias);
|
||||||
|
|
||||||
void ClearEntities();
|
void ClearEntities();
|
||||||
|
|
||||||
void RemoveEntities(const AZStd::function<bool(const AZStd::unique_ptr<AZ::Entity>&)>& filter);
|
void RemoveEntities(const AZStd::function<bool(const AZStd::unique_ptr<AZ::Entity>&)>& filter);
|
||||||
|
|||||||
+2
-1
@@ -46,10 +46,11 @@ namespace AzToolsFramework
|
|||||||
//! Updates the template links (updating instances) for the given template and triggers propagation on its instances.
|
//! Updates the template links (updating instances) for the given template and triggers propagation on its instances.
|
||||||
//! @param providedPatch The patch to apply to the template.
|
//! @param providedPatch The patch to apply to the template.
|
||||||
//! @param templateId The id of the template to update.
|
//! @param templateId The id of the template to update.
|
||||||
|
//! @param immediate An optional flag whether to apply the patch immediately (needed for Undo/Redos) or wait until next system tick.
|
||||||
//! @param instanceToExclude An optional reference to an instance of the template being updated that should not be refreshes as part of propagation.
|
//! @param instanceToExclude An optional reference to an instance of the template being updated that should not be refreshes as part of propagation.
|
||||||
//! Defaults to nullopt, which means that all instances will be refreshed.
|
//! Defaults to nullopt, which means that all instances will be refreshed.
|
||||||
//! @return True if the template was patched correctly, false if the operation failed.
|
//! @return True if the template was patched correctly, false if the operation failed.
|
||||||
virtual bool PatchTemplate(PrefabDomValue& providedPatch, TemplateId templateId, InstanceOptionalReference instanceToExclude = AZStd::nullopt) = 0;
|
virtual bool PatchTemplate(PrefabDomValue& providedPatch, TemplateId templateId, bool immediate = false, InstanceOptionalReference instanceToExclude = AZStd::nullopt) = 0;
|
||||||
|
|
||||||
virtual void ApplyPatchesToInstance(const AZ::EntityId& entityId, PrefabDom& patches, const Instance& instanceToAddPatches) = 0;
|
virtual void ApplyPatchesToInstance(const AZ::EntityId& entityId, PrefabDom& patches, const Instance& instanceToAddPatches) = 0;
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -156,7 +156,7 @@ namespace AzToolsFramework
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool InstanceToTemplatePropagator::PatchTemplate(PrefabDomValue& providedPatch, TemplateId templateId, InstanceOptionalReference instanceToExclude)
|
bool InstanceToTemplatePropagator::PatchTemplate(PrefabDomValue& providedPatch, TemplateId templateId, bool immediate, InstanceOptionalReference instanceToExclude)
|
||||||
{
|
{
|
||||||
PrefabDom& templateDomReference = m_prefabSystemComponentInterface->FindTemplateDom(templateId);
|
PrefabDom& templateDomReference = m_prefabSystemComponentInterface->FindTemplateDom(templateId);
|
||||||
|
|
||||||
@@ -178,7 +178,7 @@ namespace AzToolsFramework
|
|||||||
(result.GetOutcome() != AZ::JsonSerializationResult::Outcomes::PartialSkip),
|
(result.GetOutcome() != AZ::JsonSerializationResult::Outcomes::PartialSkip),
|
||||||
"Some of the patches were not successfully applied.");
|
"Some of the patches were not successfully applied.");
|
||||||
m_prefabSystemComponentInterface->SetTemplateDirtyFlag(templateId, true);
|
m_prefabSystemComponentInterface->SetTemplateDirtyFlag(templateId, true);
|
||||||
m_prefabSystemComponentInterface->PropagateTemplateChanges(templateId, instanceToExclude);
|
m_prefabSystemComponentInterface->PropagateTemplateChanges(templateId, immediate, instanceToExclude);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -33,7 +33,7 @@ namespace AzToolsFramework
|
|||||||
|
|
||||||
InstanceOptionalReference GetTopMostInstanceInHierarchy(AZ::EntityId entityId) override;
|
InstanceOptionalReference GetTopMostInstanceInHierarchy(AZ::EntityId entityId) override;
|
||||||
|
|
||||||
bool PatchTemplate(PrefabDomValue& providedPatch, TemplateId templateId, InstanceOptionalReference instanceToExclude = AZStd::nullopt) override;
|
bool PatchTemplate(PrefabDomValue& providedPatch, TemplateId templateId, bool immediate = false, InstanceOptionalReference instanceToExclude = AZStd::nullopt) override;
|
||||||
|
|
||||||
void ApplyPatchesToInstance(const AZ::EntityId& entityId, PrefabDom& patches, const Instance& instanceToAddPatches) override;
|
void ApplyPatchesToInstance(const AZ::EntityId& entityId, PrefabDom& patches, const Instance& instanceToAddPatches) override;
|
||||||
|
|
||||||
|
|||||||
+6
-1
@@ -52,7 +52,7 @@ namespace AzToolsFramework
|
|||||||
AZ::Interface<InstanceUpdateExecutorInterface>::Unregister(this);
|
AZ::Interface<InstanceUpdateExecutorInterface>::Unregister(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
void InstanceUpdateExecutor::AddTemplateInstancesToQueue(TemplateId instanceTemplateId, InstanceOptionalReference instanceToExclude)
|
void InstanceUpdateExecutor::AddTemplateInstancesToQueue(TemplateId instanceTemplateId, bool immediate, InstanceOptionalReference instanceToExclude)
|
||||||
{
|
{
|
||||||
auto findInstancesResult =
|
auto findInstancesResult =
|
||||||
m_templateInstanceMapperInterface->FindInstancesOwnedByTemplate(instanceTemplateId);
|
m_templateInstanceMapperInterface->FindInstancesOwnedByTemplate(instanceTemplateId);
|
||||||
@@ -79,6 +79,11 @@ namespace AzToolsFramework
|
|||||||
m_instancesUpdateQueue.emplace_back(instance);
|
m_instancesUpdateQueue.emplace_back(instance);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (immediate)
|
||||||
|
{
|
||||||
|
UpdateTemplateInstancesInQueue();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void InstanceUpdateExecutor::RemoveTemplateInstanceFromQueue(const Instance* instance)
|
void InstanceUpdateExecutor::RemoveTemplateInstanceFromQueue(const Instance* instance)
|
||||||
|
|||||||
+1
-1
@@ -31,7 +31,7 @@ namespace AzToolsFramework
|
|||||||
|
|
||||||
explicit InstanceUpdateExecutor(int instanceCountToUpdateInBatch = 0);
|
explicit InstanceUpdateExecutor(int instanceCountToUpdateInBatch = 0);
|
||||||
|
|
||||||
void AddTemplateInstancesToQueue(TemplateId instanceTemplateId, InstanceOptionalReference instanceToExclude = AZStd::nullopt) override;
|
void AddTemplateInstancesToQueue(TemplateId instanceTemplateId, bool immediate = false, InstanceOptionalReference instanceToExclude = AZStd::nullopt) override;
|
||||||
bool UpdateTemplateInstancesInQueue() override;
|
bool UpdateTemplateInstancesInQueue() override;
|
||||||
virtual void RemoveTemplateInstanceFromQueue(const Instance* instance) override;
|
virtual void RemoveTemplateInstanceFromQueue(const Instance* instance) override;
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -23,7 +23,7 @@ namespace AzToolsFramework
|
|||||||
virtual ~InstanceUpdateExecutorInterface() = default;
|
virtual ~InstanceUpdateExecutorInterface() = default;
|
||||||
|
|
||||||
// Add all Instances of Template with given Id into a queue for updating them later.
|
// Add all Instances of Template with given Id into a queue for updating them later.
|
||||||
virtual void AddTemplateInstancesToQueue(TemplateId instanceTemplateId, InstanceOptionalReference instanceToExclude = AZStd::nullopt) = 0;
|
virtual void AddTemplateInstancesToQueue(TemplateId instanceTemplateId, bool immediate = false, InstanceOptionalReference instanceToExclude = AZStd::nullopt) = 0;
|
||||||
|
|
||||||
// Update Instances in the waiting queue.
|
// Update Instances in the waiting queue.
|
||||||
virtual bool UpdateTemplateInstancesInQueue() = 0;
|
virtual bool UpdateTemplateInstancesInQueue() = 0;
|
||||||
|
|||||||
+4
-4
@@ -27,7 +27,7 @@ namespace AzToolsFramework
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool TemplateInstanceMapper::RegisterTemplate(const TemplateId& templateId)
|
bool TemplateInstanceMapper::RegisterTemplate(TemplateId templateId)
|
||||||
{
|
{
|
||||||
const bool result = m_templateIdToInstancesMap.emplace(templateId, InstanceSet()).second;
|
const bool result = m_templateIdToInstancesMap.emplace(templateId, InstanceSet()).second;
|
||||||
AZ_Assert(result,
|
AZ_Assert(result,
|
||||||
@@ -39,7 +39,7 @@ namespace AzToolsFramework
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TemplateInstanceMapper::UnregisterTemplate(const TemplateId& templateId)
|
bool TemplateInstanceMapper::UnregisterTemplate(TemplateId templateId)
|
||||||
{
|
{
|
||||||
const bool result = m_templateIdToInstancesMap.erase(templateId) != 0;
|
const bool result = m_templateIdToInstancesMap.erase(templateId) != 0;
|
||||||
AZ_Assert(result,
|
AZ_Assert(result,
|
||||||
@@ -53,7 +53,7 @@ namespace AzToolsFramework
|
|||||||
|
|
||||||
bool TemplateInstanceMapper::RegisterInstanceToTemplate(Instance& instance)
|
bool TemplateInstanceMapper::RegisterInstanceToTemplate(Instance& instance)
|
||||||
{
|
{
|
||||||
const TemplateId& templateId = instance.GetTemplateId();
|
TemplateId templateId = instance.GetTemplateId();
|
||||||
if (templateId == InvalidTemplateId)
|
if (templateId == InvalidTemplateId)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
@@ -79,7 +79,7 @@ namespace AzToolsFramework
|
|||||||
found->second.erase(&instance) != 0;
|
found->second.erase(&instance) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
InstanceSetConstReference TemplateInstanceMapper::FindInstancesOwnedByTemplate(const TemplateId& templateId) const
|
InstanceSetConstReference TemplateInstanceMapper::FindInstancesOwnedByTemplate(TemplateId templateId) const
|
||||||
{
|
{
|
||||||
auto found = m_templateIdToInstancesMap.find(templateId);
|
auto found = m_templateIdToInstancesMap.find(templateId);
|
||||||
|
|
||||||
|
|||||||
+3
-3
@@ -26,10 +26,10 @@ namespace AzToolsFramework
|
|||||||
TemplateInstanceMapper();
|
TemplateInstanceMapper();
|
||||||
~TemplateInstanceMapper() override;
|
~TemplateInstanceMapper() override;
|
||||||
|
|
||||||
InstanceSetConstReference FindInstancesOwnedByTemplate(const TemplateId& templateId) const override;
|
InstanceSetConstReference FindInstancesOwnedByTemplate(TemplateId templateId) const override;
|
||||||
|
|
||||||
bool RegisterTemplate(const TemplateId& templateId);
|
bool RegisterTemplate(TemplateId templateId);
|
||||||
bool UnregisterTemplate(const TemplateId& templateId);
|
bool UnregisterTemplate(TemplateId templateId);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool RegisterInstanceToTemplate(Instance& instance) override;
|
bool RegisterInstanceToTemplate(Instance& instance) override;
|
||||||
|
|||||||
+1
-1
@@ -24,7 +24,7 @@ namespace AzToolsFramework
|
|||||||
AZ_RTTI(TemplateInstanceMapperInterface, "{5DCCCDAA-3441-4266-9670-B349386E0129}");
|
AZ_RTTI(TemplateInstanceMapperInterface, "{5DCCCDAA-3441-4266-9670-B349386E0129}");
|
||||||
|
|
||||||
virtual ~TemplateInstanceMapperInterface() = default;
|
virtual ~TemplateInstanceMapperInterface() = default;
|
||||||
virtual InstanceSetConstReference FindInstancesOwnedByTemplate(const TemplateId& templateId) const = 0;
|
virtual InstanceSetConstReference FindInstancesOwnedByTemplate(TemplateId templateId) const = 0;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
// Only the Instance class is allowed to register and unregister Instances.
|
// Only the Instance class is allowed to register and unregister Instances.
|
||||||
|
|||||||
@@ -122,12 +122,12 @@ namespace AzToolsFramework
|
|||||||
!m_instanceName.empty();
|
!m_instanceName.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
const TemplateId& Link::GetSourceTemplateId() const
|
TemplateId Link::GetSourceTemplateId() const
|
||||||
{
|
{
|
||||||
return m_sourceTemplateId;
|
return m_sourceTemplateId;
|
||||||
}
|
}
|
||||||
|
|
||||||
const TemplateId& Link::GetTargetTemplateId() const
|
TemplateId Link::GetTargetTemplateId() const
|
||||||
{
|
{
|
||||||
return m_targetTemplateId;
|
return m_targetTemplateId;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -48,8 +48,8 @@ namespace AzToolsFramework
|
|||||||
|
|
||||||
bool IsValid() const;
|
bool IsValid() const;
|
||||||
|
|
||||||
const TemplateId& GetSourceTemplateId() const;
|
TemplateId GetSourceTemplateId() const;
|
||||||
const TemplateId& GetTargetTemplateId() const;
|
TemplateId GetTargetTemplateId() const;
|
||||||
|
|
||||||
LinkId GetId() const;
|
LinkId GetId() const;
|
||||||
|
|
||||||
|
|||||||
@@ -1041,7 +1041,7 @@ namespace AzToolsFramework
|
|||||||
PrefabUndoInstance* command = aznew PrefabUndoInstance("Entity/Instance duplication");
|
PrefabUndoInstance* command = aznew PrefabUndoInstance("Entity/Instance duplication");
|
||||||
command->SetParent(undoBatch.GetUndoBatch());
|
command->SetParent(undoBatch.GetUndoBatch());
|
||||||
command->Capture(instanceDomBefore, instanceDomAfter, commonOwningInstance->get().GetTemplateId());
|
command->Capture(instanceDomBefore, instanceDomAfter, commonOwningInstance->get().GetTemplateId());
|
||||||
command->Redo();
|
command->RedoBatched();
|
||||||
|
|
||||||
DuplicateNestedInstancesInInstance(commonOwningInstance->get(),
|
DuplicateNestedInstancesInInstance(commonOwningInstance->get(),
|
||||||
instances, instanceDomAfter, duplicatedEntityAndInstanceIds, newInstanceAliasToOldInstanceMap);
|
instances, instanceDomAfter, duplicatedEntityAndInstanceIds, newInstanceAliasToOldInstanceMap);
|
||||||
|
|||||||
@@ -92,7 +92,17 @@ namespace AzToolsFramework
|
|||||||
|
|
||||||
AZStd::unique_ptr<Instance> PrefabSystemComponent::CreatePrefab(
|
AZStd::unique_ptr<Instance> PrefabSystemComponent::CreatePrefab(
|
||||||
const AZStd::vector<AZ::Entity*>& entities, AZStd::vector<AZStd::unique_ptr<Instance>>&& instancesToConsume,
|
const AZStd::vector<AZ::Entity*>& entities, AZStd::vector<AZStd::unique_ptr<Instance>>&& instancesToConsume,
|
||||||
AZ::IO::PathView filePath, AZStd::unique_ptr<AZ::Entity> containerEntity, bool shouldCreateLinks)
|
AZ::IO::PathView filePath, AZStd::unique_ptr<AZ::Entity> containerEntity, InstanceOptionalReference parent,
|
||||||
|
bool shouldCreateLinks)
|
||||||
|
{
|
||||||
|
AZStd::unique_ptr<Instance> newInstance = AZStd::make_unique<Instance>(AZStd::move(containerEntity), parent);
|
||||||
|
CreatePrefab(entities, AZStd::move(instancesToConsume), filePath, newInstance, shouldCreateLinks);
|
||||||
|
return newInstance;
|
||||||
|
}
|
||||||
|
|
||||||
|
void PrefabSystemComponent::CreatePrefab(
|
||||||
|
const AZStd::vector<AZ::Entity*>& entities, AZStd::vector<AZStd::unique_ptr<Instance>>&& instancesToConsume,
|
||||||
|
AZ::IO::PathView filePath, AZStd::unique_ptr<Instance>& newInstance, bool shouldCreateLinks)
|
||||||
{
|
{
|
||||||
AZ::IO::Path relativeFilePath = m_prefabLoader.GenerateRelativePath(filePath);
|
AZ::IO::Path relativeFilePath = m_prefabLoader.GenerateRelativePath(filePath);
|
||||||
if (GetTemplateIdFromFilePath(relativeFilePath) != InvalidTemplateId)
|
if (GetTemplateIdFromFilePath(relativeFilePath) != InvalidTemplateId)
|
||||||
@@ -101,11 +111,9 @@ namespace AzToolsFramework
|
|||||||
"Filepath %s has already been registered with the Prefab System Component",
|
"Filepath %s has already been registered with the Prefab System Component",
|
||||||
relativeFilePath.c_str());
|
relativeFilePath.c_str());
|
||||||
|
|
||||||
return nullptr;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
AZStd::unique_ptr<Instance> newInstance = AZStd::make_unique<Instance>(AZStd::move(containerEntity));
|
|
||||||
|
|
||||||
for (AZ::Entity* entity : entities)
|
for (AZ::Entity* entity : entities)
|
||||||
{
|
{
|
||||||
AZ_Assert(entity, "Prefab - Null entity passed in during Create Prefab");
|
AZ_Assert(entity, "Prefab - Null entity passed in during Create Prefab");
|
||||||
@@ -136,13 +144,11 @@ namespace AzToolsFramework
|
|||||||
{
|
{
|
||||||
newInstance->SetTemplateId(newTemplateId);
|
newInstance->SetTemplateId(newTemplateId);
|
||||||
}
|
}
|
||||||
|
|
||||||
return newInstance;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void PrefabSystemComponent::PropagateTemplateChanges(TemplateId templateId, InstanceOptionalReference instanceToExclude)
|
void PrefabSystemComponent::PropagateTemplateChanges(TemplateId templateId, bool immediate, InstanceOptionalReference instanceToExclude)
|
||||||
{
|
{
|
||||||
UpdatePrefabInstances(templateId, instanceToExclude);
|
UpdatePrefabInstances(templateId, immediate, instanceToExclude);
|
||||||
|
|
||||||
auto templateIdToLinkIdsIterator = m_templateToLinkIdsMap.find(templateId);
|
auto templateIdToLinkIdsIterator = m_templateToLinkIdsMap.find(templateId);
|
||||||
if (templateIdToLinkIdsIterator != m_templateToLinkIdsMap.end())
|
if (templateIdToLinkIdsIterator != m_templateToLinkIdsMap.end())
|
||||||
@@ -171,9 +177,9 @@ namespace AzToolsFramework
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void PrefabSystemComponent::UpdatePrefabInstances(const TemplateId& templateId, InstanceOptionalReference instanceToExclude)
|
void PrefabSystemComponent::UpdatePrefabInstances(TemplateId templateId, bool immediate, InstanceOptionalReference instanceToExclude)
|
||||||
{
|
{
|
||||||
m_instanceUpdateExecutor.AddTemplateInstancesToQueue(templateId, instanceToExclude);
|
m_instanceUpdateExecutor.AddTemplateInstancesToQueue(templateId, immediate, instanceToExclude);
|
||||||
}
|
}
|
||||||
|
|
||||||
void PrefabSystemComponent::UpdateLinkedInstances(AZStd::queue<LinkIds>& linkIdsQueue)
|
void PrefabSystemComponent::UpdateLinkedInstances(AZStd::queue<LinkIds>& linkIdsQueue)
|
||||||
@@ -256,7 +262,8 @@ namespace AzToolsFramework
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
AZStd::unique_ptr<Instance> PrefabSystemComponent::InstantiatePrefab(AZ::IO::PathView filePath)
|
AZStd::unique_ptr<Instance> PrefabSystemComponent::InstantiatePrefab(
|
||||||
|
AZ::IO::PathView filePath, InstanceOptionalReference parent)
|
||||||
{
|
{
|
||||||
// Retrieve the template id for the source prefab filepath
|
// Retrieve the template id for the source prefab filepath
|
||||||
Prefab::TemplateId templateId = GetTemplateIdFromFilePath(filePath);
|
Prefab::TemplateId templateId = GetTemplateIdFromFilePath(filePath);
|
||||||
@@ -276,10 +283,11 @@ namespace AzToolsFramework
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
return InstantiatePrefab(templateId);
|
return InstantiatePrefab(templateId, parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
AZStd::unique_ptr<Instance> PrefabSystemComponent::InstantiatePrefab(const TemplateId& templateId)
|
AZStd::unique_ptr<Instance> PrefabSystemComponent::InstantiatePrefab(
|
||||||
|
TemplateId templateId, InstanceOptionalReference parent)
|
||||||
{
|
{
|
||||||
TemplateReference instantiatingTemplate = FindTemplate(templateId);
|
TemplateReference instantiatingTemplate = FindTemplate(templateId);
|
||||||
|
|
||||||
@@ -292,7 +300,7 @@ namespace AzToolsFramework
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto newInstance = AZStd::make_unique<Instance>();
|
auto newInstance = AZStd::make_unique<Instance>(parent);
|
||||||
Instance::EntityList newEntities;
|
Instance::EntityList newEntities;
|
||||||
if (!PrefabDomUtils::LoadInstanceFromPrefabDom(*newInstance, newEntities, instantiatingTemplate->get().GetPrefabDom()))
|
if (!PrefabDomUtils::LoadInstanceFromPrefabDom(*newInstance, newEntities, instantiatingTemplate->get().GetPrefabDom()))
|
||||||
{
|
{
|
||||||
@@ -354,7 +362,7 @@ namespace AzToolsFramework
|
|||||||
return newTemplateId;
|
return newTemplateId;
|
||||||
}
|
}
|
||||||
|
|
||||||
TemplateReference PrefabSystemComponent::FindTemplate(const TemplateId& id)
|
TemplateReference PrefabSystemComponent::FindTemplate(TemplateId id)
|
||||||
{
|
{
|
||||||
auto found = m_templateIdMap.find(id);
|
auto found = m_templateIdMap.find(id);
|
||||||
if (found != m_templateIdMap.end())
|
if (found != m_templateIdMap.end())
|
||||||
@@ -466,7 +474,7 @@ namespace AzToolsFramework
|
|||||||
templateToChange.SetFilePath(filePath);
|
templateToChange.SetFilePath(filePath);
|
||||||
}
|
}
|
||||||
|
|
||||||
void PrefabSystemComponent::RemoveTemplate(const TemplateId& templateId)
|
void PrefabSystemComponent::RemoveTemplate(TemplateId templateId)
|
||||||
{
|
{
|
||||||
auto findTemplateResult = FindTemplate(templateId);
|
auto findTemplateResult = FindTemplate(templateId);
|
||||||
if (!findTemplateResult.has_value())
|
if (!findTemplateResult.has_value())
|
||||||
@@ -553,8 +561,8 @@ namespace AzToolsFramework
|
|||||||
}
|
}
|
||||||
|
|
||||||
LinkId PrefabSystemComponent::AddLink(
|
LinkId PrefabSystemComponent::AddLink(
|
||||||
const TemplateId& sourceTemplateId,
|
TemplateId sourceTemplateId,
|
||||||
const TemplateId& targetTemplateId,
|
TemplateId targetTemplateId,
|
||||||
PrefabDomValue::MemberIterator& instanceIterator,
|
PrefabDomValue::MemberIterator& instanceIterator,
|
||||||
InstanceOptionalReference instance)
|
InstanceOptionalReference instance)
|
||||||
{
|
{
|
||||||
@@ -571,10 +579,13 @@ namespace AzToolsFramework
|
|||||||
|
|
||||||
Template& targetTemplate = targetTemplateReference->get();
|
Template& targetTemplate = targetTemplateReference->get();
|
||||||
|
|
||||||
|
#if defined(AZ_ENABLE_TRACING)
|
||||||
Template& sourceTemplate = sourceTemplateReference->get();
|
Template& sourceTemplate = sourceTemplateReference->get();
|
||||||
AZStd::string_view instanceName(instanceIterator->name.GetString(), instanceIterator->name.GetStringLength());
|
AZStd::string_view instanceName(instanceIterator->name.GetString(), instanceIterator->name.GetStringLength());
|
||||||
|
|
||||||
const AZStd::string& targetTemplateFilePath = targetTemplate.GetFilePath().Native();
|
const AZStd::string& targetTemplateFilePath = targetTemplate.GetFilePath().Native();
|
||||||
const AZStd::string& sourceTemplateFilePath = sourceTemplate.GetFilePath().Native();
|
const AZStd::string& sourceTemplateFilePath = sourceTemplate.GetFilePath().Native();
|
||||||
|
#endif
|
||||||
|
|
||||||
LinkId newLinkId = CreateUniqueLinkId();
|
LinkId newLinkId = CreateUniqueLinkId();
|
||||||
Link newLink(newLinkId);
|
Link newLink(newLinkId);
|
||||||
@@ -616,8 +627,8 @@ namespace AzToolsFramework
|
|||||||
}
|
}
|
||||||
|
|
||||||
LinkId PrefabSystemComponent::CreateLink(
|
LinkId PrefabSystemComponent::CreateLink(
|
||||||
const TemplateId& linkTargetId,
|
TemplateId linkTargetId,
|
||||||
const TemplateId& linkSourceId,
|
TemplateId linkSourceId,
|
||||||
const InstanceAlias& instanceAlias,
|
const InstanceAlias& instanceAlias,
|
||||||
const PrefabDomConstReference linkPatches,
|
const PrefabDomConstReference linkPatches,
|
||||||
const LinkId& linkId)
|
const LinkId& linkId)
|
||||||
@@ -774,7 +785,7 @@ namespace AzToolsFramework
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool PrefabSystemComponent::IsTemplateDirty(const TemplateId& templateId)
|
bool PrefabSystemComponent::IsTemplateDirty(TemplateId templateId)
|
||||||
{
|
{
|
||||||
auto templateRef = FindTemplate(templateId);
|
auto templateRef = FindTemplate(templateId);
|
||||||
|
|
||||||
@@ -786,7 +797,7 @@ namespace AzToolsFramework
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PrefabSystemComponent::SetTemplateDirtyFlag(const TemplateId& templateId, bool dirty)
|
void PrefabSystemComponent::SetTemplateDirtyFlag(TemplateId templateId, bool dirty)
|
||||||
{
|
{
|
||||||
auto templateRef = FindTemplate(templateId);
|
auto templateRef = FindTemplate(templateId);
|
||||||
|
|
||||||
@@ -903,8 +914,10 @@ namespace AzToolsFramework
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(AZ_ENABLE_TRACING)
|
||||||
Template& sourceTemplate = sourceTemplateReference->get();
|
Template& sourceTemplate = sourceTemplateReference->get();
|
||||||
Template& targetTemplate = targetTemplateReference->get();
|
Template& targetTemplate = targetTemplateReference->get();
|
||||||
|
#endif
|
||||||
|
|
||||||
AZStd::string_view instanceName(instanceIterator->name.GetString(), instanceIterator->name.GetStringLength());
|
AZStd::string_view instanceName(instanceIterator->name.GetString(), instanceIterator->name.GetStringLength());
|
||||||
|
|
||||||
@@ -940,7 +953,7 @@ namespace AzToolsFramework
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool PrefabSystemComponent::GenerateLinksForNewTemplate(const TemplateId& newTemplateId, Instance& instance)
|
bool PrefabSystemComponent::GenerateLinksForNewTemplate(TemplateId newTemplateId, Instance& instance)
|
||||||
{
|
{
|
||||||
TemplateReference newTemplateReference = FindTemplate(newTemplateId);
|
TemplateReference newTemplateReference = FindTemplate(newTemplateId);
|
||||||
if (!newTemplateReference.has_value())
|
if (!newTemplateReference.has_value())
|
||||||
@@ -980,7 +993,7 @@ namespace AzToolsFramework
|
|||||||
}
|
}
|
||||||
|
|
||||||
const PrefabDomValue& source = instanceSourceReference->get();
|
const PrefabDomValue& source = instanceSourceReference->get();
|
||||||
const TemplateId& nestedTemplateId = GetTemplateIdFromFilePath(source.GetString());
|
TemplateId nestedTemplateId = GetTemplateIdFromFilePath(source.GetString());
|
||||||
if (nestedTemplateId == InvalidTemplateId)
|
if (nestedTemplateId == InvalidTemplateId)
|
||||||
{
|
{
|
||||||
AZ_Error("Prefab", false,
|
AZ_Error("Prefab", false,
|
||||||
|
|||||||
@@ -84,7 +84,7 @@ namespace AzToolsFramework
|
|||||||
* @param id A unique id of a Template.
|
* @param id A unique id of a Template.
|
||||||
* @return Reference of Template if the Template exists.
|
* @return Reference of Template if the Template exists.
|
||||||
*/
|
*/
|
||||||
TemplateReference FindTemplate(const TemplateId& id) override;
|
TemplateReference FindTemplate(TemplateId id) override;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Find Link with given Link id from Prefab System Component.
|
* Find Link with given Link id from Prefab System Component.
|
||||||
@@ -112,7 +112,7 @@ namespace AzToolsFramework
|
|||||||
* Remove the Template associated with the given id from Prefab System Component.
|
* Remove the Template associated with the given id from Prefab System Component.
|
||||||
* @param templateId A unique id of a Template.
|
* @param templateId A unique id of a Template.
|
||||||
*/
|
*/
|
||||||
void RemoveTemplate(const TemplateId& templateId) override;
|
void RemoveTemplate(TemplateId templateId) override;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Remove all Templates from the Prefab System Component.
|
* Remove all Templates from the Prefab System Component.
|
||||||
@@ -121,17 +121,21 @@ namespace AzToolsFramework
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Generates a new Prefab Instance based on the Template whose source is stored in filepath.
|
* Generates a new Prefab Instance based on the Template whose source is stored in filepath.
|
||||||
* @param filePath the path to the prefab source file containing the template being instantiated.
|
* @param filePath The path to the prefab source file containing the template being instantiated.
|
||||||
|
* @param parent Reference of the target instance the instantiated instance will be placed under.
|
||||||
* @return A unique_ptr to the newly instantiated instance. Null if operation failed.
|
* @return A unique_ptr to the newly instantiated instance. Null if operation failed.
|
||||||
*/
|
*/
|
||||||
AZStd::unique_ptr<Instance> InstantiatePrefab(AZ::IO::PathView filePath) override;
|
AZStd::unique_ptr<Instance> InstantiatePrefab(
|
||||||
|
AZ::IO::PathView filePath, InstanceOptionalReference parent = AZStd::nullopt) override;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generates a new Prefab Instance based on the Template referenced by templateId
|
* Generates a new Prefab Instance based on the Template referenced by templateId.
|
||||||
* @param templateId the id of the template being instantiated.
|
* @param templateId The id of the template being instantiated.
|
||||||
|
* @param parent Reference of the target instance the instantiated instance will be placed under.
|
||||||
* @return A unique_ptr to the newly instantiated instance. Null if operation failed.
|
* @return A unique_ptr to the newly instantiated instance. Null if operation failed.
|
||||||
*/
|
*/
|
||||||
AZStd::unique_ptr<Instance> InstantiatePrefab(const TemplateId& templateId) override;
|
AZStd::unique_ptr<Instance> InstantiatePrefab(
|
||||||
|
TemplateId templateId, InstanceOptionalReference parent = AZStd::nullopt) override;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add a new Link into Prefab System Component and create a unique id for it.
|
* Add a new Link into Prefab System Component and create a unique id for it.
|
||||||
@@ -142,8 +146,8 @@ namespace AzToolsFramework
|
|||||||
* @return A unique id for the new Link.
|
* @return A unique id for the new Link.
|
||||||
*/
|
*/
|
||||||
LinkId AddLink(
|
LinkId AddLink(
|
||||||
const TemplateId& sourceTemplateId,
|
TemplateId sourceTemplateId,
|
||||||
const TemplateId& targetTemplateId,
|
TemplateId targetTemplateId,
|
||||||
PrefabDomValue::MemberIterator& instanceIterator,
|
PrefabDomValue::MemberIterator& instanceIterator,
|
||||||
InstanceOptionalReference instance) override;
|
InstanceOptionalReference instance) override;
|
||||||
|
|
||||||
@@ -157,8 +161,8 @@ namespace AzToolsFramework
|
|||||||
* @return A unique id for the new Link.
|
* @return A unique id for the new Link.
|
||||||
*/
|
*/
|
||||||
LinkId CreateLink(
|
LinkId CreateLink(
|
||||||
const TemplateId& linkTargetId,
|
TemplateId linkTargetId,
|
||||||
const TemplateId& linkSourceId,
|
TemplateId linkSourceId,
|
||||||
const InstanceAlias& instanceAlias,
|
const InstanceAlias& instanceAlias,
|
||||||
const PrefabDomConstReference linkPatches,
|
const PrefabDomConstReference linkPatches,
|
||||||
const LinkId& linkId = InvalidLinkId) override;
|
const LinkId& linkId = InvalidLinkId) override;
|
||||||
@@ -181,14 +185,14 @@ namespace AzToolsFramework
|
|||||||
* @param templateId The id of the template to query.
|
* @param templateId The id of the template to query.
|
||||||
* @return The value of the dirty flag on the template.
|
* @return The value of the dirty flag on the template.
|
||||||
*/
|
*/
|
||||||
bool IsTemplateDirty(const TemplateId& templateId) override;
|
bool IsTemplateDirty(TemplateId templateId) override;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the dirty flag of the template to the value provided.
|
* Sets the dirty flag of the template to the value provided.
|
||||||
* @param templateId The id of the template to flag.
|
* @param templateId The id of the template to flag.
|
||||||
* @param dirty The new value of the dirty flag.
|
* @param dirty The new value of the dirty flag.
|
||||||
*/
|
*/
|
||||||
void SetTemplateDirtyFlag(const TemplateId& templateId, bool dirty) override;
|
void SetTemplateDirtyFlag(TemplateId templateId, bool dirty) override;
|
||||||
|
|
||||||
bool AreDirtyTemplatesPresent(TemplateId rootTemplateId) override;
|
bool AreDirtyTemplatesPresent(TemplateId rootTemplateId) override;
|
||||||
|
|
||||||
@@ -200,20 +204,21 @@ namespace AzToolsFramework
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Builds a new Prefab Template out of entities and instances and returns the first instance comprised of
|
* Builds a new Prefab Template out of entities and instances and returns the first instance comprised of
|
||||||
* these entities and instances
|
* these entities and instances.
|
||||||
* @param entities A vector of entities that will be used in the new instance. May be empty
|
* @param entities A vector of entities that will be used in the new instance. May be empty.
|
||||||
* @param instances A vector of Prefab Instances that will be nested in the new instance, will be consumed and moved.
|
* @param instances A vector of Prefab Instances that will be nested in the new instance, will be consumed and moved.
|
||||||
* May be empty
|
* May be empty.
|
||||||
* @param filePath the path to associate the template of the new instance to.
|
* @param filePath The path to associate the template of the new instance to.
|
||||||
* @param containerEntity The container entity for the prefab to be created. It will be created if a nullptr is provided.
|
* @param containerEntity The container entity for the prefab to be created. It will be created if a nullptr is provided.
|
||||||
|
* @param parent Reference of an instance the created instance will be placed under, if given.
|
||||||
* @param shouldCreateLinks The flag indicating if links should be created between the templates of the instance
|
* @param shouldCreateLinks The flag indicating if links should be created between the templates of the instance
|
||||||
* and its nested instances.
|
* and its nested instances.
|
||||||
* @return A pointer to the newly created instance. nullptr on failure
|
* @return A pointer to the newly created instance. nullptr on failure.
|
||||||
*/
|
*/
|
||||||
AZStd::unique_ptr<Instance> CreatePrefab(
|
AZStd::unique_ptr<Instance> CreatePrefab(
|
||||||
const AZStd::vector<AZ::Entity*>& entities, AZStd::vector<AZStd::unique_ptr<Instance>>&& instancesToConsume,
|
const AZStd::vector<AZ::Entity*>& entities, AZStd::vector<AZStd::unique_ptr<Instance>>&& instancesToConsume,
|
||||||
AZ::IO::PathView filePath, AZStd::unique_ptr<AZ::Entity> containerEntity = nullptr,
|
AZ::IO::PathView filePath, AZStd::unique_ptr<AZ::Entity> containerEntity = nullptr,
|
||||||
bool ShouldCreateLinks = true) override;
|
InstanceOptionalReference parent = AZStd::nullopt, bool shouldCreateLinks = true) override;
|
||||||
|
|
||||||
PrefabDom& FindTemplateDom(TemplateId templateId) override;
|
PrefabDom& FindTemplateDom(TemplateId templateId) override;
|
||||||
|
|
||||||
@@ -225,18 +230,36 @@ namespace AzToolsFramework
|
|||||||
*/
|
*/
|
||||||
void UpdatePrefabTemplate(TemplateId templateId, const PrefabDom& updatedDom) override;
|
void UpdatePrefabTemplate(TemplateId templateId, const PrefabDom& updatedDom) override;
|
||||||
|
|
||||||
void PropagateTemplateChanges(TemplateId templateId, InstanceOptionalReference instanceToExclude = AZStd::nullopt) override;
|
void PropagateTemplateChanges(TemplateId templateId, bool immediate = false, InstanceOptionalReference instanceToExclude = AZStd::nullopt) override;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Updates all Instances owned by a Template.
|
* Updates all Instances owned by a Template.
|
||||||
*
|
*
|
||||||
* @param templateId The id of the Template owning Instances to update.
|
* @param templateId The id of the Template owning Instances to update.
|
||||||
|
* @param immediate An optional flag whether to apply the patch immediately (needed for Undo/Redos) or wait until next system tick.
|
||||||
|
* @param instanceToExclude An optional reference to an instance of the template being updated that should not be refreshes as part of propagation.
|
||||||
|
* Defaults to nullopt, which means that all instances will be refreshed.
|
||||||
*/
|
*/
|
||||||
void UpdatePrefabInstances(const TemplateId& templateId, InstanceOptionalReference instanceToExclude = AZStd::nullopt);
|
void UpdatePrefabInstances(TemplateId templateId, bool immediate = false, InstanceOptionalReference instanceToExclude = AZStd::nullopt);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
AZ_DISABLE_COPY_MOVE(PrefabSystemComponent);
|
AZ_DISABLE_COPY_MOVE(PrefabSystemComponent);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Builds a new Prefab Template out of entities and instances and returns the first instance comprised of
|
||||||
|
* these entities and instances.
|
||||||
|
* @param entities A vector of entities that will be used in the new instance. May be empty.
|
||||||
|
* @param instances A vector of Prefab Instances that will be nested in the new instance, will be consumed and moved.
|
||||||
|
* May be empty.
|
||||||
|
* @param filePath The path to associate the template of the new instance to.
|
||||||
|
* @param instance Reference of a pointer to the newly created instance which needs initiation.
|
||||||
|
* @param shouldCreateLinks The flag indicating if links should be created between the templates of the instance
|
||||||
|
* and its nested instances.
|
||||||
|
*/
|
||||||
|
void CreatePrefab(const AZStd::vector<AZ::Entity*>& entities,
|
||||||
|
AZStd::vector<AZStd::unique_ptr<Instance>>&& instancesToConsume, AZ::IO::PathView filePath,
|
||||||
|
AZStd::unique_ptr<Instance>& instance, bool shouldCreateLinks);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Updates all the linked Instances corresponding to the linkIds in the provided queue.
|
* Updates all the linked Instances corresponding to the linkIds in the provided queue.
|
||||||
* Queue gets populated with more linkId lists as linked instances are updated. Updating stops when the queue is empty.
|
* Queue gets populated with more linkId lists as linked instances are updated. Updating stops when the queue is empty.
|
||||||
@@ -310,7 +333,7 @@ namespace AzToolsFramework
|
|||||||
* @param instance The instance that the template was created from. This needs to be editable for inserting linkId into it.
|
* @param instance The instance that the template was created from. This needs to be editable for inserting linkId into it.
|
||||||
* @return bool on whether the operation succeeded
|
* @return bool on whether the operation succeeded
|
||||||
*/
|
*/
|
||||||
bool GenerateLinksForNewTemplate(const TemplateId& newTemplateId, Instance& instance);
|
bool GenerateLinksForNewTemplate(TemplateId newTemplateId, Instance& instance);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a unique Template id for newly created Template.
|
* Create a unique Template id for newly created Template.
|
||||||
|
|||||||
+13
-10
@@ -29,28 +29,28 @@ namespace AzToolsFramework
|
|||||||
public:
|
public:
|
||||||
AZ_RTTI(PrefabSystemComponentInterface, "{8E95A029-67F9-4F74-895F-DDBFE29516A0}");
|
AZ_RTTI(PrefabSystemComponentInterface, "{8E95A029-67F9-4F74-895F-DDBFE29516A0}");
|
||||||
|
|
||||||
virtual TemplateReference FindTemplate(const TemplateId& id) = 0;
|
virtual TemplateReference FindTemplate(TemplateId id) = 0;
|
||||||
virtual LinkReference FindLink(const LinkId& id) = 0;
|
virtual LinkReference FindLink(const LinkId& id) = 0;
|
||||||
|
|
||||||
virtual TemplateId AddTemplate(const AZ::IO::Path& filePath, PrefabDom prefabDom) = 0;
|
virtual TemplateId AddTemplate(const AZ::IO::Path& filePath, PrefabDom prefabDom) = 0;
|
||||||
virtual void UpdateTemplateFilePath(TemplateId templateId, const AZ::IO::PathView& filePath) = 0;
|
virtual void UpdateTemplateFilePath(TemplateId templateId, const AZ::IO::PathView& filePath) = 0;
|
||||||
virtual void RemoveTemplate(const TemplateId& templateId) = 0;
|
virtual void RemoveTemplate(TemplateId templateId) = 0;
|
||||||
virtual void RemoveAllTemplates() = 0;
|
virtual void RemoveAllTemplates() = 0;
|
||||||
|
|
||||||
virtual LinkId AddLink(const TemplateId& sourceTemplateId, const TemplateId& targetTemplateId,
|
virtual LinkId AddLink(TemplateId sourceTemplateId, TemplateId targetTemplateId,
|
||||||
PrefabDomValue::MemberIterator& instanceIterator, InstanceOptionalReference instance) = 0;
|
PrefabDomValue::MemberIterator& instanceIterator, InstanceOptionalReference instance) = 0;
|
||||||
|
|
||||||
//creates a new Link
|
//creates a new Link
|
||||||
virtual LinkId CreateLink(
|
virtual LinkId CreateLink(
|
||||||
const TemplateId& linkTargetId, const TemplateId& linkSourceId, const InstanceAlias& instanceAlias,
|
TemplateId linkTargetId, TemplateId linkSourceId, const InstanceAlias& instanceAlias,
|
||||||
const PrefabDomConstReference linkPatches, const LinkId& linkId = InvalidLinkId) = 0;
|
const PrefabDomConstReference linkPatches, const LinkId& linkId = InvalidLinkId) = 0;
|
||||||
|
|
||||||
virtual void RemoveLink(const LinkId& linkId) = 0;
|
virtual void RemoveLink(const LinkId& linkId) = 0;
|
||||||
|
|
||||||
virtual TemplateId GetTemplateIdFromFilePath(AZ::IO::PathView filePath) const = 0;
|
virtual TemplateId GetTemplateIdFromFilePath(AZ::IO::PathView filePath) const = 0;
|
||||||
|
|
||||||
virtual bool IsTemplateDirty(const TemplateId& templateId) = 0;
|
virtual bool IsTemplateDirty(TemplateId templateId) = 0;
|
||||||
virtual void SetTemplateDirtyFlag(const TemplateId& templateId, bool dirty) = 0;
|
virtual void SetTemplateDirtyFlag(TemplateId templateId, bool dirty) = 0;
|
||||||
|
|
||||||
//! Recursive function to check if the template is dirty or if any dirty templates are presents in the links of the template.
|
//! Recursive function to check if the template is dirty or if any dirty templates are presents in the links of the template.
|
||||||
//! @param rootTemplateId The id of the template provided as the beginning template to check the outgoing links.
|
//! @param rootTemplateId The id of the template provided as the beginning template to check the outgoing links.
|
||||||
@@ -67,13 +67,16 @@ namespace AzToolsFramework
|
|||||||
|
|
||||||
virtual PrefabDom& FindTemplateDom(TemplateId templateId) = 0;
|
virtual PrefabDom& FindTemplateDom(TemplateId templateId) = 0;
|
||||||
virtual void UpdatePrefabTemplate(TemplateId templateId, const PrefabDom& updatedDom) = 0;
|
virtual void UpdatePrefabTemplate(TemplateId templateId, const PrefabDom& updatedDom) = 0;
|
||||||
virtual void PropagateTemplateChanges(TemplateId templateId, InstanceOptionalReference instanceToExclude = AZStd::nullopt) = 0;
|
virtual void PropagateTemplateChanges(TemplateId templateId, bool immediate = false, InstanceOptionalReference instanceToExclude = AZStd::nullopt) = 0;
|
||||||
|
|
||||||
virtual AZStd::unique_ptr<Instance> InstantiatePrefab(AZ::IO::PathView filePath) = 0;
|
virtual AZStd::unique_ptr<Instance> InstantiatePrefab(
|
||||||
virtual AZStd::unique_ptr<Instance> InstantiatePrefab(const TemplateId& templateId) = 0;
|
AZ::IO::PathView filePath, InstanceOptionalReference parent = AZStd::nullopt) = 0;
|
||||||
|
virtual AZStd::unique_ptr<Instance> InstantiatePrefab(
|
||||||
|
TemplateId templateId, InstanceOptionalReference parent = AZStd::nullopt) = 0;
|
||||||
virtual AZStd::unique_ptr<Instance> CreatePrefab(const AZStd::vector<AZ::Entity*>& entities,
|
virtual AZStd::unique_ptr<Instance> CreatePrefab(const AZStd::vector<AZ::Entity*>& entities,
|
||||||
AZStd::vector<AZStd::unique_ptr<Instance>>&& instancesToConsume, AZ::IO::PathView filePath,
|
AZStd::vector<AZStd::unique_ptr<Instance>>&& instancesToConsume, AZ::IO::PathView filePath,
|
||||||
AZStd::unique_ptr<AZ::Entity> containerEntity = nullptr, bool ShouldCreateLinks = true) = 0;
|
AZStd::unique_ptr<AZ::Entity> containerEntity = nullptr, InstanceOptionalReference parent = AZStd::nullopt,
|
||||||
|
bool shouldCreateLinks = true) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ namespace AzToolsFramework
|
|||||||
void PrefabUndoInstance::Capture(
|
void PrefabUndoInstance::Capture(
|
||||||
const PrefabDom& initialState,
|
const PrefabDom& initialState,
|
||||||
const PrefabDom& endState,
|
const PrefabDom& endState,
|
||||||
const TemplateId& templateId)
|
TemplateId templateId)
|
||||||
{
|
{
|
||||||
m_templateId = templateId;
|
m_templateId = templateId;
|
||||||
|
|
||||||
@@ -43,10 +43,15 @@ namespace AzToolsFramework
|
|||||||
|
|
||||||
void PrefabUndoInstance::Undo()
|
void PrefabUndoInstance::Undo()
|
||||||
{
|
{
|
||||||
m_instanceToTemplateInterface->PatchTemplate(m_undoPatch, m_templateId);
|
m_instanceToTemplateInterface->PatchTemplate(m_undoPatch, m_templateId, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void PrefabUndoInstance::Redo()
|
void PrefabUndoInstance::Redo()
|
||||||
|
{
|
||||||
|
m_instanceToTemplateInterface->PatchTemplate(m_redoPatch, m_templateId, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void PrefabUndoInstance::RedoBatched()
|
||||||
{
|
{
|
||||||
m_instanceToTemplateInterface->PatchTemplate(m_redoPatch, m_templateId);
|
m_instanceToTemplateInterface->PatchTemplate(m_redoPatch, m_templateId);
|
||||||
}
|
}
|
||||||
@@ -91,7 +96,7 @@ namespace AzToolsFramework
|
|||||||
void PrefabUndoEntityUpdate::Undo()
|
void PrefabUndoEntityUpdate::Undo()
|
||||||
{
|
{
|
||||||
[[maybe_unused]] bool isPatchApplicationSuccessful =
|
[[maybe_unused]] bool isPatchApplicationSuccessful =
|
||||||
m_instanceToTemplateInterface->PatchTemplate(m_undoPatch, m_templateId);
|
m_instanceToTemplateInterface->PatchTemplate(m_undoPatch, m_templateId, true);
|
||||||
|
|
||||||
AZ_Error(
|
AZ_Error(
|
||||||
"Prefab", isPatchApplicationSuccessful,
|
"Prefab", isPatchApplicationSuccessful,
|
||||||
@@ -102,7 +107,7 @@ namespace AzToolsFramework
|
|||||||
void PrefabUndoEntityUpdate::Redo()
|
void PrefabUndoEntityUpdate::Redo()
|
||||||
{
|
{
|
||||||
[[maybe_unused]] bool isPatchApplicationSuccessful =
|
[[maybe_unused]] bool isPatchApplicationSuccessful =
|
||||||
m_instanceToTemplateInterface->PatchTemplate(m_redoPatch, m_templateId);
|
m_instanceToTemplateInterface->PatchTemplate(m_redoPatch, m_templateId, true);
|
||||||
|
|
||||||
AZ_Error(
|
AZ_Error(
|
||||||
"Prefab", isPatchApplicationSuccessful,
|
"Prefab", isPatchApplicationSuccessful,
|
||||||
@@ -113,7 +118,7 @@ namespace AzToolsFramework
|
|||||||
void PrefabUndoEntityUpdate::Redo(InstanceOptionalReference instanceToExclude)
|
void PrefabUndoEntityUpdate::Redo(InstanceOptionalReference instanceToExclude)
|
||||||
{
|
{
|
||||||
[[maybe_unused]] bool isPatchApplicationSuccessful =
|
[[maybe_unused]] bool isPatchApplicationSuccessful =
|
||||||
m_instanceToTemplateInterface->PatchTemplate(m_redoPatch, m_templateId, instanceToExclude);
|
m_instanceToTemplateInterface->PatchTemplate(m_redoPatch, m_templateId, false, instanceToExclude);
|
||||||
|
|
||||||
AZ_Error(
|
AZ_Error(
|
||||||
"Prefab", isPatchApplicationSuccessful,
|
"Prefab", isPatchApplicationSuccessful,
|
||||||
@@ -136,8 +141,8 @@ namespace AzToolsFramework
|
|||||||
}
|
}
|
||||||
|
|
||||||
void PrefabUndoInstanceLink::Capture(
|
void PrefabUndoInstanceLink::Capture(
|
||||||
const TemplateId& targetId,
|
TemplateId targetId,
|
||||||
const TemplateId& sourceId,
|
TemplateId sourceId,
|
||||||
const InstanceAlias& instanceAlias,
|
const InstanceAlias& instanceAlias,
|
||||||
PrefabDom linkPatches,
|
PrefabDom linkPatches,
|
||||||
const LinkId linkId)
|
const LinkId linkId)
|
||||||
@@ -329,7 +334,7 @@ namespace AzToolsFramework
|
|||||||
|
|
||||||
//propagate the link changes
|
//propagate the link changes
|
||||||
link->get().UpdateTarget();
|
link->get().UpdateTarget();
|
||||||
m_prefabSystemComponentInterface->PropagateTemplateChanges(link->get().GetTargetTemplateId(), instanceToExclude);
|
m_prefabSystemComponentInterface->PropagateTemplateChanges(link->get().GetTargetTemplateId(), false, instanceToExclude);
|
||||||
|
|
||||||
//mark as dirty
|
//mark as dirty
|
||||||
m_prefabSystemComponentInterface->SetTemplateDirtyFlag(link->get().GetTargetTemplateId(), true);
|
m_prefabSystemComponentInterface->SetTemplateDirtyFlag(link->get().GetTargetTemplateId(), true);
|
||||||
|
|||||||
@@ -49,10 +49,11 @@ namespace AzToolsFramework
|
|||||||
void Capture(
|
void Capture(
|
||||||
const PrefabDom& initialState,
|
const PrefabDom& initialState,
|
||||||
const PrefabDom& endState,
|
const PrefabDom& endState,
|
||||||
const TemplateId& templateId);
|
TemplateId templateId);
|
||||||
|
|
||||||
void Undo() override;
|
void Undo() override;
|
||||||
void Redo() override;
|
void Redo() override;
|
||||||
|
void RedoBatched();
|
||||||
};
|
};
|
||||||
|
|
||||||
//! handles entity updates, such as when the values on an entity change
|
//! handles entity updates, such as when the values on an entity change
|
||||||
@@ -95,8 +96,8 @@ namespace AzToolsFramework
|
|||||||
|
|
||||||
//capture for add/remove
|
//capture for add/remove
|
||||||
void Capture(
|
void Capture(
|
||||||
const TemplateId& targetId,
|
TemplateId targetId,
|
||||||
const TemplateId& sourceId,
|
TemplateId sourceId,
|
||||||
const InstanceAlias& instanceAlias,
|
const InstanceAlias& instanceAlias,
|
||||||
PrefabDom linkPatches = PrefabDom(),
|
PrefabDom linkPatches = PrefabDom(),
|
||||||
const LinkId linkId = InvalidLinkId);
|
const LinkId linkId = InvalidLinkId);
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ namespace AzToolsFramework
|
|||||||
PrefabUndoInstance* state = aznew Prefab::PrefabUndoInstance(undoMessage);
|
PrefabUndoInstance* state = aznew Prefab::PrefabUndoInstance(undoMessage);
|
||||||
state->Capture(instanceDomBeforeUpdate, instanceDomAfterUpdate, instance.GetTemplateId());
|
state->Capture(instanceDomBeforeUpdate, instanceDomAfterUpdate, instance.GetTemplateId());
|
||||||
state->SetParent(undoBatch);
|
state->SetParent(undoBatch);
|
||||||
state->Redo();
|
state->RedoBatched();
|
||||||
}
|
}
|
||||||
|
|
||||||
LinkId CreateLink(
|
LinkId CreateLink(
|
||||||
|
|||||||
+1
-1
@@ -1160,7 +1160,7 @@ namespace AzToolsFramework
|
|||||||
AZStd::string unsavedPrefabFileName = unsavedPrefabFileLabel->property("FilePath").toString().toUtf8().data();
|
AZStd::string unsavedPrefabFileName = unsavedPrefabFileLabel->property("FilePath").toString().toUtf8().data();
|
||||||
AzToolsFramework::Prefab::TemplateId unsavedPrefabTemplateId =
|
AzToolsFramework::Prefab::TemplateId unsavedPrefabTemplateId =
|
||||||
s_prefabSystemComponentInterface->GetTemplateIdFromFilePath(unsavedPrefabFileName.data());
|
s_prefabSystemComponentInterface->GetTemplateIdFromFilePath(unsavedPrefabFileName.data());
|
||||||
bool isTemplateSavedSuccessfully = s_prefabLoaderInterface->SaveTemplate(unsavedPrefabTemplateId);
|
[[maybe_unused]] bool isTemplateSavedSuccessfully = s_prefabLoaderInterface->SaveTemplate(unsavedPrefabTemplateId);
|
||||||
AZ_Error("Prefab", isTemplateSavedSuccessfully, "Prefab '%s' could not be saved successfully.", unsavedPrefabFileName.c_str());
|
AZ_Error("Prefab", isTemplateSavedSuccessfully, "Prefab '%s' could not be saved successfully.", unsavedPrefabFileName.c_str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
-230
@@ -1,230 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <AzCore/std/string/string.h>
|
|
||||||
#include <AzCore/Outcome/Outcome.h>
|
|
||||||
#include <AzFramework/StringFunc/StringFunc.h>
|
|
||||||
#include <AzFramework/IO/LocalFileIO.h>
|
|
||||||
|
|
||||||
namespace AzToolsFramework
|
|
||||||
{
|
|
||||||
namespace Platform
|
|
||||||
{
|
|
||||||
[[maybe_unused]] static const char ErrorChannel[] = "ArchiveComponent_Linux";
|
|
||||||
|
|
||||||
static const char ZipExePath[] = R"(/usr/bin/zip)";
|
|
||||||
static const char UnzipExePath[] = R"(/usr/bin/unzip)";
|
|
||||||
|
|
||||||
static const char CreateArchiveCmd[] = "-r \"%s\" . -i *";
|
|
||||||
|
|
||||||
static const char ExtractArchiveCmd[] = R"(-o "%s" -d "%s")";
|
|
||||||
|
|
||||||
static const char AddFileCmd[] = R"("%s" "%s")";
|
|
||||||
|
|
||||||
static const char ExtractFileCmd[] = R"(%s "%s" %s)";
|
|
||||||
static const char ExtractFileDestination[] = R"(%s "%s" "%s" -d "%s")";
|
|
||||||
static const char ExtractOverwrite[] = "-o";
|
|
||||||
static const char ExtractSkipExisting[] = "-n";
|
|
||||||
static const char ListFilesInArchiveCmd[] = "-l %s";
|
|
||||||
|
|
||||||
AZStd::string GetZipExePath()
|
|
||||||
{
|
|
||||||
return ZipExePath;
|
|
||||||
}
|
|
||||||
|
|
||||||
AZStd::string GetUnzipExePath()
|
|
||||||
{
|
|
||||||
return UnzipExePath;
|
|
||||||
}
|
|
||||||
|
|
||||||
AZ::Outcome<AZStd::string, AZStd::string> MakePath(const AZStd::string& path)
|
|
||||||
{
|
|
||||||
// Create the folder if it does not already exist
|
|
||||||
if (!AZ::IO::FileIOBase::GetInstance()->Exists(path.c_str()))
|
|
||||||
{
|
|
||||||
auto result = AZ::IO::FileIOBase::GetInstance()->CreatePath(path.c_str());
|
|
||||||
if (!result)
|
|
||||||
{
|
|
||||||
return AZ::Failure(AZStd::string::format("Path creation failed. Input path: %s \n", path.c_str()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return AZ::Success(path);
|
|
||||||
}
|
|
||||||
|
|
||||||
AZ::Outcome<AZStd::string, AZStd::string> MakeCreateArchivePath(const AZStd::string& archivePath)
|
|
||||||
{
|
|
||||||
// Remove the file name from the input path
|
|
||||||
// /some/folder/path/archive.zip -> /some/folder/path/
|
|
||||||
AZStd::string strippedArchivePath = archivePath;
|
|
||||||
AzFramework::StringFunc::Path::StripFullName(strippedArchivePath);
|
|
||||||
|
|
||||||
if (strippedArchivePath.empty())
|
|
||||||
{
|
|
||||||
return AZ::Failure(AZStd::string::format("Stripped path name is empty. Cancelling path creation. Input path: %s\n", archivePath.c_str()));
|
|
||||||
}
|
|
||||||
|
|
||||||
return MakePath(strippedArchivePath);
|
|
||||||
}
|
|
||||||
|
|
||||||
AZ::Outcome<AZStd::string, AZStd::string> MakeExtractArchivePath(const AZStd::string& archivePath, const AZStd::string& destinationPath, bool includeRoot)
|
|
||||||
{
|
|
||||||
if(!includeRoot)
|
|
||||||
{
|
|
||||||
// Create the folder for the input destination path with no modifications
|
|
||||||
// /path/to/destination/
|
|
||||||
return MakePath(destinationPath);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get the name of the input archive. This will be the name of the root folder for the archive extraction
|
|
||||||
// /some/folder/path/archive.zip -> archive
|
|
||||||
AZStd::string zipFileName;
|
|
||||||
bool result = AzFramework::StringFunc::Path::GetFileName(archivePath.c_str(), zipFileName);
|
|
||||||
if(!result)
|
|
||||||
{
|
|
||||||
return AZ::Failure(AZStd::string::format("Failed to get name of zip file from the archive path. Cancelling path creation. \n Input Archive Path: %s \n", archivePath.c_str()));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Append the root folder name to the end of the destination path
|
|
||||||
// /path/to/destination/ + archive -> /path/to/destination/archive
|
|
||||||
AZStd::string destinationPathWithRoot;
|
|
||||||
result = AzFramework::StringFunc::Path::Join(destinationPath.c_str(), zipFileName.c_str(), destinationPathWithRoot);
|
|
||||||
if(!result)
|
|
||||||
{
|
|
||||||
return AZ::Failure(AZStd::string::format("Failed to append zip file name to the destination path. Cancelling path creation. \n Destination Path: %s \n Zip file name: %s \n", destinationPath.c_str(), zipFileName.c_str()));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Append a separator so that it is formatted like a folder
|
|
||||||
// /path/to/destination/archive -> /path/to/destination/archive/
|
|
||||||
AzFramework::StringFunc::Path::AppendSeparator(destinationPathWithRoot);
|
|
||||||
return MakePath(destinationPathWithRoot);
|
|
||||||
}
|
|
||||||
|
|
||||||
AZStd::string GetCreateArchiveCommand(const AZStd::string& archivePath, const AZStd::string& dirToArchive)
|
|
||||||
{
|
|
||||||
auto pathCreationResult = MakeCreateArchivePath(archivePath);
|
|
||||||
if (!pathCreationResult)
|
|
||||||
{
|
|
||||||
AZ_Error(ErrorChannel, false, "%s", pathCreationResult.GetError().c_str());
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
AZ_UNUSED(dirToArchive);
|
|
||||||
return AZStd::string::format(CreateArchiveCmd, archivePath.c_str());
|
|
||||||
}
|
|
||||||
|
|
||||||
AZStd::string GetExtractArchiveCommand(const AZStd::string& archivePath, const AZStd::string& destinationPath, bool includeRoot)
|
|
||||||
{
|
|
||||||
auto pathCreationResult = MakeExtractArchivePath(archivePath, destinationPath, includeRoot);
|
|
||||||
if (!pathCreationResult)
|
|
||||||
{
|
|
||||||
AZ_Error(ErrorChannel, false, "%s", pathCreationResult.GetError().c_str());
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
return AZStd::string::format(ExtractArchiveCmd, archivePath.c_str(), pathCreationResult.GetValue().c_str());
|
|
||||||
}
|
|
||||||
|
|
||||||
AZStd::string GetAddFilesToArchiveCommand(const AZStd::string& /*archivePath*/, const AZStd::string& /*listFilePath*/)
|
|
||||||
{
|
|
||||||
// Adding files into a archive using a list file is not currently supported
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
|
|
||||||
bool IsAddFilesToArchiveCommandSupported()
|
|
||||||
{
|
|
||||||
// Adding files into a archive using a list file is not currently supported
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
AZStd::string GetAddFileToArchiveCommand(const AZStd::string& archivePath, const AZStd::string& file)
|
|
||||||
{
|
|
||||||
if (!MakeCreateArchivePath(archivePath).IsSuccess())
|
|
||||||
{
|
|
||||||
AZ_Error(ErrorChannel, false, "Unable to make path for ( %s ).\n", archivePath.c_str());
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
return AZStd::string::format(AddFileCmd, archivePath.c_str(), file.c_str());
|
|
||||||
}
|
|
||||||
|
|
||||||
AZStd::string GetExtractFileCommand(const AZStd::string& archivePath, const AZStd::string& fileInArchive, const AZStd::string& destinationPath, bool overWrite)
|
|
||||||
{
|
|
||||||
AZStd::string commandLineArgs;
|
|
||||||
if (destinationPath.empty())
|
|
||||||
{
|
|
||||||
// Extract file in archive from archive path to the current directory, overwriting a file of the same name that exists there.
|
|
||||||
commandLineArgs = AZStd::string::format(ExtractFileCmd, overWrite ? ExtractOverwrite : ExtractSkipExisting, archivePath.c_str(), fileInArchive.c_str());
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (!MakePath(destinationPath).IsSuccess())
|
|
||||||
{
|
|
||||||
AZ_Error(ErrorChannel, false, "Unable to make path ( %s ).\n", destinationPath.c_str());
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
// Extract file in archive from archive path to destinationPath, overwriting a file of the same name that exists there.
|
|
||||||
commandLineArgs = AZStd::string::format(ExtractFileDestination, overWrite ? ExtractOverwrite : ExtractSkipExisting, archivePath.c_str(), fileInArchive.c_str(), destinationPath.c_str());
|
|
||||||
}
|
|
||||||
|
|
||||||
return commandLineArgs;
|
|
||||||
}
|
|
||||||
|
|
||||||
AZStd::string GetListFilesInArchiveCommand(const AZStd::string& archivePath)
|
|
||||||
{
|
|
||||||
AZStd::string commandLineArgs = AZStd::string::format(ListFilesInArchiveCmd, archivePath.c_str());
|
|
||||||
return commandLineArgs;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
Sample Console Output of the unzip list command
|
|
||||||
|
|
||||||
Archive: /var/folders/1q/12nyzqc913qgm532y2c98mnm6w4_qv/T/ArchiveTests-ra8oMy/TestArchive.pak
|
|
||||||
Length Date Time Name
|
|
||||||
--------- ---------- ----- ----
|
|
||||||
0 10-14-2019 15:22 testfolder/
|
|
||||||
1 10-14-2019 15:22 testfolder/folderfile.txt
|
|
||||||
1 10-14-2019 15:22 basicfile.txt
|
|
||||||
1 10-14-2019 15:22 basicfile2.txt
|
|
||||||
0 10-14-2019 15:22 testfolder2/
|
|
||||||
1 10-14-2019 15:22 testfolder2/sharedfolderfile2.txt
|
|
||||||
1 10-14-2019 15:22 testfolder2/sharedfolderfile.txt
|
|
||||||
0 10-14-2019 15:22 testfolder3/
|
|
||||||
0 10-14-2019 15:22 testfolder3/testfolder4/
|
|
||||||
1 10-14-2019 15:22 testfolder3/testfolder4/depthfile.bat
|
|
||||||
--------- -------
|
|
||||||
6 10 files
|
|
||||||
*/
|
|
||||||
|
|
||||||
void ParseConsoleOutputFromListFilesInArchive(const AZStd::string& consoleOutput, AZStd::vector<AZStd::string>& fileEntries)
|
|
||||||
{
|
|
||||||
AZStd::vector<AZStd::string> fileEntryData;
|
|
||||||
AzFramework::StringFunc::Tokenize(consoleOutput.c_str(), fileEntryData, "\n");
|
|
||||||
int startingLineIdx = 3; // first line that might contain the file name
|
|
||||||
for (size_t lineIdx = startingLineIdx; lineIdx < fileEntryData.size(); ++lineIdx)
|
|
||||||
{
|
|
||||||
AZStd::string& line = fileEntryData[lineIdx];
|
|
||||||
AZStd::vector<AZStd::string> lineEntryData;
|
|
||||||
AzFramework::StringFunc::Tokenize(line.c_str(), lineEntryData, " ");
|
|
||||||
AZStd::string& fileName = lineEntryData.back();
|
|
||||||
|
|
||||||
if(fileName.back() == AZ_CORRECT_FILESYSTEM_SEPARATOR)
|
|
||||||
{
|
|
||||||
// if the filename ends with a separator
|
|
||||||
// than it indicates that this is a directory
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(fileName.compare("-------") == 0)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
fileEntries.emplace_back(fileName);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} // namespace Platform
|
|
||||||
} // namespace AzToolsFramework
|
|
||||||
@@ -7,5 +7,4 @@
|
|||||||
#
|
#
|
||||||
|
|
||||||
set(FILES
|
set(FILES
|
||||||
AzToolsFramework/Archive/ArchiveComponent_Linux.cpp
|
|
||||||
)
|
)
|
||||||
|
|||||||
-263
@@ -1,263 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <AzCore/std/string/string.h>
|
|
||||||
#include <AzCore/Outcome/Outcome.h>
|
|
||||||
#include <AzFramework/StringFunc/StringFunc.h>
|
|
||||||
#include <AzFramework/IO/LocalFileIO.h>
|
|
||||||
|
|
||||||
namespace AzToolsFramework
|
|
||||||
{
|
|
||||||
namespace Platform
|
|
||||||
{
|
|
||||||
const char ErrorChannel[] = "ArchiveComponent_OSX";
|
|
||||||
|
|
||||||
const char ZipExePath[] = R"(/usr/bin/zip)";
|
|
||||||
const char UnzipExePath[] = R"(/usr/bin/unzip)";
|
|
||||||
|
|
||||||
// v Requires investigation, the correct cmd should be R"(-r "%s" "%s/")" but tests fail
|
|
||||||
const char CreateArchiveCmd[] = R"(-r "%s" .)";
|
|
||||||
|
|
||||||
const char ExtractArchiveCmd[] = R"(-o "%s" -d "%s")";
|
|
||||||
|
|
||||||
const char AddFileCmd[] = R"("%s" "%s" -X)";
|
|
||||||
const char AddFilesCmd[] = R"("%s" -X %s)";
|
|
||||||
|
|
||||||
const char ExtractFileCmd[] = R"(%s "%s" %s)";
|
|
||||||
const char ExtractFileDestination[] = R"(%s "%s" "%s" -d "%s")";
|
|
||||||
const char ExtractOverwrite[] = "-o";
|
|
||||||
const char ExtractSkipExisting[] = "-n";
|
|
||||||
const char ListFilesInArchiveCmd[] = "-l %s";
|
|
||||||
|
|
||||||
AZStd::string GetZipExePath()
|
|
||||||
{
|
|
||||||
return ZipExePath;
|
|
||||||
}
|
|
||||||
|
|
||||||
AZStd::string GetUnzipExePath()
|
|
||||||
{
|
|
||||||
return UnzipExePath;
|
|
||||||
}
|
|
||||||
|
|
||||||
AZ::Outcome<AZStd::string, AZStd::string> MakePath(const AZStd::string& path)
|
|
||||||
{
|
|
||||||
// Create the folder if it does not already exist
|
|
||||||
if (!AZ::IO::FileIOBase::GetInstance()->Exists(path.c_str()))
|
|
||||||
{
|
|
||||||
auto result = AZ::IO::FileIOBase::GetInstance()->CreatePath(path.c_str());
|
|
||||||
if (!result)
|
|
||||||
{
|
|
||||||
return AZ::Failure(AZStd::string::format("Path creation failed. Input path: %s \n", path.c_str()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return AZ::Success(path);
|
|
||||||
}
|
|
||||||
|
|
||||||
AZ::Outcome<AZStd::string, AZStd::string> MakeCreateArchivePath(const AZStd::string& archivePath)
|
|
||||||
{
|
|
||||||
// Remove the file name from the input path
|
|
||||||
// /some/folder/path/archive.zip -> /some/folder/path/
|
|
||||||
AZStd::string strippedArchivePath = archivePath;
|
|
||||||
AzFramework::StringFunc::Path::StripFullName(strippedArchivePath);
|
|
||||||
|
|
||||||
if (strippedArchivePath.empty())
|
|
||||||
{
|
|
||||||
return AZ::Failure(AZStd::string::format("Stripped path name is empty. Cancelling path creation. Input path: %s\n", archivePath.c_str()));
|
|
||||||
}
|
|
||||||
|
|
||||||
return MakePath(strippedArchivePath);
|
|
||||||
}
|
|
||||||
|
|
||||||
AZ::Outcome<AZStd::string, AZStd::string> MakeExtractArchivePath(const AZStd::string& archivePath, const AZStd::string& destinationPath, bool includeRoot)
|
|
||||||
{
|
|
||||||
if(!includeRoot)
|
|
||||||
{
|
|
||||||
// Create the folder for the input destination path with no modifications
|
|
||||||
// /path/to/destination/
|
|
||||||
return MakePath(destinationPath);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get the name of the input archive. This will be the name of the root folder for the archive extraction
|
|
||||||
// /some/folder/path/archive.zip -> archive
|
|
||||||
AZStd::string zipFileName;
|
|
||||||
bool result = AzFramework::StringFunc::Path::GetFileName(archivePath.c_str(), zipFileName);
|
|
||||||
if(!result)
|
|
||||||
{
|
|
||||||
return AZ::Failure(AZStd::string::format("Failed to get name of zip file from the archive path. Cancelling path creation. \n Input Archive Path: %s \n", archivePath.c_str()));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Append the root folder name to the end of the destination path
|
|
||||||
// /path/to/destination/ + archive -> /path/to/destination/archive
|
|
||||||
AZStd::string destinationPathWithRoot;
|
|
||||||
result = AzFramework::StringFunc::Path::Join(destinationPath.c_str(), zipFileName.c_str(), destinationPathWithRoot);
|
|
||||||
if(!result)
|
|
||||||
{
|
|
||||||
return AZ::Failure(AZStd::string::format("Failed to append zip file name to the destination path. Cancelling path creation. \n Destination Path: %s \n Zip file name: %s \n", destinationPath.c_str(), zipFileName.c_str()));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Append a separator so that it is formatted like a folder
|
|
||||||
// /path/to/destination/archive -> /path/to/destination/archive/
|
|
||||||
AzFramework::StringFunc::Path::AppendSeparator(destinationPathWithRoot);
|
|
||||||
return MakePath(destinationPathWithRoot);
|
|
||||||
}
|
|
||||||
|
|
||||||
AZStd::string GetCreateArchiveCommand(const AZStd::string& archivePath, const AZStd::string& dirToArchive)
|
|
||||||
{
|
|
||||||
auto pathCreationResult = MakeCreateArchivePath(archivePath);
|
|
||||||
if (!pathCreationResult.IsSuccess())
|
|
||||||
{
|
|
||||||
AZ_Error(ErrorChannel, false, pathCreationResult.GetError().c_str());
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
// LY-116692. Requires proper investigation, the correct format should be:
|
|
||||||
// AZStd::string::format(CreateArchiveCmd, archivePath.c_str(), dirToArchive.c_str());
|
|
||||||
// but unit test ArchiveTest.ListFilesInArchiveBlocking_FilesAtThreeDepths_FilesFound fails
|
|
||||||
AZ_UNUSED(dirToArchive);
|
|
||||||
return AZStd::string::format(CreateArchiveCmd, archivePath.c_str());
|
|
||||||
}
|
|
||||||
|
|
||||||
AZStd::string GetExtractArchiveCommand(const AZStd::string& archivePath, const AZStd::string& destinationPath, bool includeRoot)
|
|
||||||
{
|
|
||||||
auto pathCreationResult = MakeExtractArchivePath(archivePath, destinationPath, includeRoot);
|
|
||||||
if (!pathCreationResult)
|
|
||||||
{
|
|
||||||
AZ_Error(ErrorChannel, false, pathCreationResult.GetError().c_str());
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
return AZStd::string::format(ExtractArchiveCmd, archivePath.c_str(), pathCreationResult.GetValue().c_str());
|
|
||||||
}
|
|
||||||
|
|
||||||
AZStd::string GetAddFilesToArchiveCommand(const AZStd::string& archivePath, const AZStd::string& listFilePath)
|
|
||||||
{
|
|
||||||
auto pathCreationResult = MakeCreateArchivePath(archivePath);
|
|
||||||
if (!pathCreationResult)
|
|
||||||
{
|
|
||||||
AZ_Error(ErrorChannel, false, pathCreationResult.GetError().c_str());
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
AZStd::string fileListStr;
|
|
||||||
|
|
||||||
{
|
|
||||||
AZ::IO::FileIOStream fileStream(listFilePath.c_str(), AZ::IO::OpenMode::ModeRead | AZ::IO::OpenMode::ModeText);
|
|
||||||
if (fileStream.IsOpen())
|
|
||||||
{
|
|
||||||
AZ::IO::SizeType length = fileStream.GetLength();
|
|
||||||
AZStd::vector<char> charBuffer;
|
|
||||||
charBuffer.resize_no_construct(length + 1);
|
|
||||||
|
|
||||||
fileStream.Read(length, charBuffer.data());
|
|
||||||
charBuffer.back() = 0;
|
|
||||||
|
|
||||||
fileListStr.append("\"");
|
|
||||||
fileListStr.insert(1, charBuffer.data());
|
|
||||||
AzFramework::StringFunc::Replace(fileListStr, "\n", "\" \"");
|
|
||||||
fileListStr.append("\"");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
AZ_Error(ErrorChannel, false, "Unable to read list file ( %s ) \n", listFilePath.c_str());
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return AZStd::string::format(AddFilesCmd, archivePath.c_str(), fileListStr.c_str());
|
|
||||||
}
|
|
||||||
|
|
||||||
AZStd::string GetAddFileToArchiveCommand(const AZStd::string& archivePath, const AZStd::string& file)
|
|
||||||
{
|
|
||||||
auto pathCreationResult = MakeCreateArchivePath(archivePath);
|
|
||||||
if (!pathCreationResult)
|
|
||||||
{
|
|
||||||
AZ_Error(ErrorChannel, false, pathCreationResult.GetError().c_str());
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
return AZStd::string::format(AddFileCmd, archivePath.c_str(), file.c_str());
|
|
||||||
}
|
|
||||||
|
|
||||||
AZStd::string GetExtractFileCommand(const AZStd::string& archivePath, const AZStd::string& fileInArchive, const AZStd::string& destinationPath, bool overWrite)
|
|
||||||
{
|
|
||||||
AZStd::string commandLineArgs;
|
|
||||||
if (destinationPath.empty())
|
|
||||||
{
|
|
||||||
// Extract file in archive from archive path to the current directory, overwriting a file of the same name that exists there.
|
|
||||||
commandLineArgs = AZStd::string::format(ExtractFileCmd, overWrite ? ExtractOverwrite : ExtractSkipExisting, archivePath.c_str(), fileInArchive.c_str());
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (!MakePath(destinationPath).IsSuccess())
|
|
||||||
{
|
|
||||||
AZ_Error(ErrorChannel, false, "Unable to make path ( %s ).\n", destinationPath.c_str());
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
// Extract file in archive from archive path to destinationPath, overwriting a file of the same name that exists there.
|
|
||||||
commandLineArgs = AZStd::string::format(ExtractFileDestination, overWrite ? ExtractOverwrite : ExtractSkipExisting, archivePath.c_str(), fileInArchive.c_str(), destinationPath.c_str());
|
|
||||||
}
|
|
||||||
|
|
||||||
return commandLineArgs;
|
|
||||||
}
|
|
||||||
|
|
||||||
AZStd::string GetListFilesInArchiveCommand(const AZStd::string& archivePath)
|
|
||||||
{
|
|
||||||
AZStd::string commandLineArgs = AZStd::string::format(ListFilesInArchiveCmd, archivePath.c_str());
|
|
||||||
return commandLineArgs;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
Sample Console Output of the unzip list command
|
|
||||||
|
|
||||||
Archive: /var/folders/1q/12nyzqc913qgm532y2c98mnm6w4_qv/T/ArchiveTests-ra8oMy/TestArchive.pak
|
|
||||||
Length Date Time Name
|
|
||||||
--------- ---------- ----- ----
|
|
||||||
0 10-14-2019 15:22 testfolder/
|
|
||||||
1 10-14-2019 15:22 testfolder/folderfile.txt
|
|
||||||
1 10-14-2019 15:22 basicfile.txt
|
|
||||||
1 10-14-2019 15:22 basicfile2.txt
|
|
||||||
0 10-14-2019 15:22 testfolder2/
|
|
||||||
1 10-14-2019 15:22 testfolder2/sharedfolderfile2.txt
|
|
||||||
1 10-14-2019 15:22 testfolder2/sharedfolderfile.txt
|
|
||||||
0 10-14-2019 15:22 testfolder3/
|
|
||||||
0 10-14-2019 15:22 testfolder3/testfolder4/
|
|
||||||
1 10-14-2019 15:22 testfolder3/testfolder4/depthfile.bat
|
|
||||||
--------- -------
|
|
||||||
6 10 files
|
|
||||||
*/
|
|
||||||
|
|
||||||
void ParseConsoleOutputFromListFilesInArchive(const AZStd::string& consoleOutput, AZStd::vector<AZStd::string>& fileEntries)
|
|
||||||
{
|
|
||||||
AZStd::vector<AZStd::string> fileEntryData;
|
|
||||||
AzFramework::StringFunc::Tokenize(consoleOutput.c_str(), fileEntryData, "\n");
|
|
||||||
int startingLineIdx = 3; // first line that might contain the file name
|
|
||||||
for (size_t lineIdx = startingLineIdx; lineIdx < fileEntryData.size(); ++lineIdx)
|
|
||||||
{
|
|
||||||
AZStd::string& line = fileEntryData[lineIdx];
|
|
||||||
AZStd::vector<AZStd::string> lineEntryData;
|
|
||||||
AzFramework::StringFunc::Tokenize(line.c_str(), lineEntryData, " ");
|
|
||||||
AZStd::string& fileName = lineEntryData.back();
|
|
||||||
|
|
||||||
if(fileName.back() == AZ_CORRECT_FILESYSTEM_SEPARATOR)
|
|
||||||
{
|
|
||||||
// if the filename ends with a separator
|
|
||||||
// than it indicates that this is a directory
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(fileName.compare("-------") == 0)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
fileEntries.emplace_back(fileName);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace Platform
|
|
||||||
} // namespace AzToolsFramework
|
|
||||||
@@ -7,5 +7,4 @@
|
|||||||
#
|
#
|
||||||
|
|
||||||
set(FILES
|
set(FILES
|
||||||
AzToolsFramework/Archive/ArchiveComponent_Mac.cpp
|
|
||||||
)
|
)
|
||||||
|
|||||||
-167
@@ -1,167 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <AzCore/std/string/string.h>
|
|
||||||
#include <AzCore/Component/ComponentApplicationBus.h>
|
|
||||||
#include <AzFramework/StringFunc/StringFunc.h>
|
|
||||||
#include <AzToolsFramework/Archive/ArchiveComponent.h>
|
|
||||||
|
|
||||||
namespace AzToolsFramework
|
|
||||||
{
|
|
||||||
namespace Platform
|
|
||||||
{
|
|
||||||
const char CreateArchiveCmd[] = R"(a -tzip -mx=1 "%s" -r "%s\*")";
|
|
||||||
|
|
||||||
// -aos is for skipping extract on existing files
|
|
||||||
const char ExtractArchiveCmd[] = R"(x -mmt=off "%s" -o"%s\*" -aos)";
|
|
||||||
const char ExtractArchiveWithoutRootCmd[] = R"(x -mmt=off "%s" -o"%s" -aos)";
|
|
||||||
const char AddFilesCmd[] = R"(a -tzip "%s" @"%s")";
|
|
||||||
const char AddFileCmd[] = R"(a -tzip "%s" "%s")";
|
|
||||||
const char ExtractFileCmd[] = R"(e -mmt=off "%s" "%s" %s)";
|
|
||||||
const char ExtractFileDestination[] = R"(e -mmt=off "%s" -o"%s" "%s" %s)";
|
|
||||||
const char ExtractOverwrite[] = "-aoa";
|
|
||||||
const char ExtractSkipExisting[] = "-aos";
|
|
||||||
const char ListFilesInArchiveCmd[] = R"(l -r -slt "%s")";
|
|
||||||
|
|
||||||
AZStd::string Get7zExePath()
|
|
||||||
{
|
|
||||||
const char* rootPath = nullptr;
|
|
||||||
AZ::ComponentApplicationBus::BroadcastResult(rootPath, &AZ::ComponentApplicationRequests::GetEngineRoot);
|
|
||||||
AZStd::string exePath;
|
|
||||||
AzFramework::StringFunc::Path::ConstructFull(rootPath, "Tools", "7za", ".exe", exePath);
|
|
||||||
return exePath;
|
|
||||||
}
|
|
||||||
|
|
||||||
AZStd::string GetZipExePath()
|
|
||||||
{
|
|
||||||
return Get7zExePath();
|
|
||||||
}
|
|
||||||
|
|
||||||
AZStd::string GetUnzipExePath()
|
|
||||||
{
|
|
||||||
return Get7zExePath();
|
|
||||||
}
|
|
||||||
|
|
||||||
AZStd::string GetCreateArchiveCommand(const AZStd::string& archivePath, const AZStd::string& dirToArchive)
|
|
||||||
{
|
|
||||||
return AZStd::string::format(CreateArchiveCmd, archivePath.c_str(), dirToArchive.c_str());
|
|
||||||
}
|
|
||||||
|
|
||||||
AZStd::string GetExtractArchiveCommand(const AZStd::string& archivePath, const AZStd::string& destinationPath, bool includeRoot)
|
|
||||||
{
|
|
||||||
if (includeRoot)
|
|
||||||
{
|
|
||||||
// Extract archive path to destinationPath\<archiveFileName> and skipping extracting of existing files
|
|
||||||
return AZStd::string::format(ExtractArchiveCmd, archivePath.c_str(), destinationPath.c_str());
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Extract archive path to destinationPath and skipping extracting of existing files
|
|
||||||
return AZStd::string::format(ExtractArchiveWithoutRootCmd, archivePath.c_str(), destinationPath.c_str());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
AZStd::string GetAddFilesToArchiveCommand(const AZStd::string& archivePath, const AZStd::string& listFilePath)
|
|
||||||
{
|
|
||||||
return AZStd::string::format(AddFilesCmd, archivePath.c_str(), listFilePath.c_str());
|
|
||||||
}
|
|
||||||
|
|
||||||
AZStd::string GetAddFileToArchiveCommand(const AZStd::string& archivePath, const AZStd::string& file)
|
|
||||||
{
|
|
||||||
return AZStd::string::format(AddFileCmd, archivePath.c_str(), file.c_str());
|
|
||||||
}
|
|
||||||
|
|
||||||
AZStd::string GetExtractFileCommand(const AZStd::string& archivePath, const AZStd::string& fileInArchive, const AZStd::string& destinationPath, bool overWrite)
|
|
||||||
{
|
|
||||||
AZStd::string commandLineArgs;
|
|
||||||
if (destinationPath.empty())
|
|
||||||
{
|
|
||||||
// Extract file in archive from archive path to the current directory, overwriting a file of the same name that exists there.
|
|
||||||
commandLineArgs = AZStd::string::format(ExtractFileCmd, archivePath.c_str(), fileInArchive.c_str(), overWrite ? ExtractOverwrite : ExtractSkipExisting);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Extract file in archive from archive path to destinationPath, overwriting a file of the same name that exists there.
|
|
||||||
commandLineArgs = AZStd::string::format(ExtractFileDestination, archivePath.c_str(), destinationPath.c_str(), fileInArchive.c_str(), overWrite ? ExtractOverwrite : ExtractSkipExisting);
|
|
||||||
}
|
|
||||||
|
|
||||||
return commandLineArgs;
|
|
||||||
}
|
|
||||||
|
|
||||||
AZStd::string GetListFilesInArchiveCommand(const AZStd::string& archivePath)
|
|
||||||
{
|
|
||||||
AZStd::string commandLineArgs = AZStd::string::format(ListFilesInArchiveCmd, archivePath.c_str());
|
|
||||||
return commandLineArgs;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
File output for our list archive commands takes the following two patterns for files vs directories:
|
|
||||||
|
|
||||||
Path = basicfile2.txt
|
|
||||||
Folder = -
|
|
||||||
Size = 1
|
|
||||||
Packed Size = 1
|
|
||||||
Modified = 2019-03-26 18:31:10
|
|
||||||
Created = 2019-03-26 18:31:10
|
|
||||||
Accessed = 2019-03-26 18:31:10
|
|
||||||
Attributes = A
|
|
||||||
Encrypted = -
|
|
||||||
Comment =
|
|
||||||
CRC = 32D70693
|
|
||||||
Method = Store
|
|
||||||
Characteristics = NTFS
|
|
||||||
Host OS = FAT
|
|
||||||
Version = 10
|
|
||||||
Volume Index = 0
|
|
||||||
Offset = 44
|
|
||||||
|
|
||||||
Path = testfolder
|
|
||||||
Folder = +
|
|
||||||
Size = 0
|
|
||||||
Packed Size = 0
|
|
||||||
Modified = 2019-03-26 18:31:10
|
|
||||||
Created = 2019-03-26 18:31:10
|
|
||||||
Accessed = 2019-03-26 18:31:10
|
|
||||||
Attributes = D
|
|
||||||
Encrypted = -
|
|
||||||
Comment =
|
|
||||||
CRC =
|
|
||||||
Method = Store
|
|
||||||
Characteristics = NTFS
|
|
||||||
Host OS = FAT
|
|
||||||
Version = 20
|
|
||||||
Volume Index = 0
|
|
||||||
Offset = 89
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
void ParseConsoleOutputFromListFilesInArchive(const AZStd::string& consoleOutput, AZStd::vector<AZStd::string>& fileEntries)
|
|
||||||
{
|
|
||||||
AZStd::vector<AZStd::string> fileEntryData;
|
|
||||||
AzFramework::StringFunc::Tokenize(consoleOutput.c_str(), fileEntryData, "\r\n");
|
|
||||||
for (size_t slotNum = 0; slotNum < fileEntryData.size(); ++slotNum)
|
|
||||||
{
|
|
||||||
AZStd::string& line = fileEntryData[slotNum];
|
|
||||||
if (AzFramework::StringFunc::StartsWith(line, "Path = "))
|
|
||||||
{
|
|
||||||
if ((slotNum + 1) < fileEntryData.size())
|
|
||||||
{
|
|
||||||
// We're checking one past each entry we find for the Folder entry and skipping anything marked as a folder
|
|
||||||
// See sample output above
|
|
||||||
if (AzFramework::StringFunc::StartsWith(fileEntryData[slotNum + 1], "Folder = -"))
|
|
||||||
{
|
|
||||||
AzFramework::StringFunc::Replace(line, "Path = ", "", false, true);
|
|
||||||
fileEntries.emplace_back(AZStd::move(line));
|
|
||||||
slotNum++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} // namespace Platform
|
|
||||||
} // namespace AzToolsFramework
|
|
||||||
@@ -7,5 +7,4 @@
|
|||||||
#
|
#
|
||||||
|
|
||||||
set(FILES
|
set(FILES
|
||||||
AzToolsFramework/Archive/ArchiveComponent_Windows.cpp
|
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -31,7 +31,6 @@ namespace UnitTest
|
|||||||
{
|
{
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
|
|
||||||
bool CreateDummyFile(const QString& fullPathToFile, const QString& tempStr = {})
|
bool CreateDummyFile(const QString& fullPathToFile, const QString& tempStr = {})
|
||||||
{
|
{
|
||||||
QFileInfo fi(fullPathToFile);
|
QFileInfo fi(fullPathToFile);
|
||||||
@@ -50,7 +49,7 @@ namespace UnitTest
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
class ArchiveTest :
|
class ArchiveComponentTest :
|
||||||
public ::testing::Test
|
public ::testing::Test
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -73,7 +72,12 @@ namespace UnitTest
|
|||||||
return "Archive";
|
return "Archive";
|
||||||
}
|
}
|
||||||
|
|
||||||
void CreateArchiveFolder( QString archiveFolderName, QStringList fileList )
|
QString GetExtractFolderName()
|
||||||
|
{
|
||||||
|
return "Extracted";
|
||||||
|
}
|
||||||
|
|
||||||
|
void CreateArchiveFolder(QString archiveFolderName, QStringList fileList)
|
||||||
{
|
{
|
||||||
QDir tempPath = QDir(m_tempDir.GetDirectory()).filePath(archiveFolderName);
|
QDir tempPath = QDir(m_tempDir.GetDirectory()).filePath(archiveFolderName);
|
||||||
|
|
||||||
@@ -84,6 +88,14 @@ namespace UnitTest
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QString CreateArchiveListTextFile()
|
||||||
|
{
|
||||||
|
QString listFilePath = QDir(m_tempDir.GetDirectory()).absoluteFilePath("FileList.txt");
|
||||||
|
QString textContent = CreateArchiveFileList().join("\n");
|
||||||
|
EXPECT_TRUE(CreateDummyFile(listFilePath, textContent));
|
||||||
|
return listFilePath;
|
||||||
|
}
|
||||||
|
|
||||||
void CreateArchiveFolder()
|
void CreateArchiveFolder()
|
||||||
{
|
{
|
||||||
CreateArchiveFolder(GetArchiveFolderName(), CreateArchiveFileList());
|
CreateArchiveFolder(GetArchiveFolderName(), CreateArchiveFileList());
|
||||||
@@ -99,16 +111,24 @@ namespace UnitTest
|
|||||||
return QDir(m_tempDir.GetDirectory()).filePath(GetArchiveFolderName());
|
return QDir(m_tempDir.GetDirectory()).filePath(GetArchiveFolderName());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QString GetExtractFolder()
|
||||||
|
{
|
||||||
|
return QDir(m_tempDir.GetDirectory()).filePath(GetExtractFolderName());
|
||||||
|
}
|
||||||
|
|
||||||
bool CreateArchive()
|
bool CreateArchive()
|
||||||
{
|
{
|
||||||
bool createResult{ false };
|
std::future<bool> createResult;
|
||||||
AzToolsFramework::ArchiveCommandsBus::BroadcastResult(createResult, &AzToolsFramework::ArchiveCommandsBus::Events::CreateArchiveBlocking, GetArchivePath().toStdString().c_str(), GetArchiveFolder().toStdString().c_str());
|
AzToolsFramework::ArchiveCommandsBus::BroadcastResult(createResult,
|
||||||
return createResult;
|
&AzToolsFramework::ArchiveCommandsBus::Events::CreateArchive,
|
||||||
|
GetArchivePath().toUtf8().constData(), GetArchiveFolder().toUtf8().constData());
|
||||||
|
bool result = createResult.get();
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetUp() override
|
void SetUp() override
|
||||||
{
|
{
|
||||||
m_app.reset(aznew ToolsTestApplication("ArchiveTest"));
|
m_app.reset(aznew ToolsTestApplication("ArchiveComponentTest"));
|
||||||
m_app->Start(AzFramework::Application::Descriptor());
|
m_app->Start(AzFramework::Application::Descriptor());
|
||||||
// Without this, the user settings component would attempt to save on finalize/shutdown. Since the file is
|
// Without this, the user settings component would attempt to save on finalize/shutdown. Since the file is
|
||||||
// shared across the whole engine, if multiple tests are run in parallel, the saving could cause a crash
|
// shared across the whole engine, if multiple tests are run in parallel, the saving could cause a crash
|
||||||
@@ -132,76 +152,138 @@ namespace UnitTest
|
|||||||
};
|
};
|
||||||
|
|
||||||
#if AZ_TRAIT_DISABLE_FAILED_ARCHIVE_TESTS
|
#if AZ_TRAIT_DISABLE_FAILED_ARCHIVE_TESTS
|
||||||
TEST_F(ArchiveTest, DISABLED_CreateArchiveBlocking_FilesAtThreeDepths_ArchiveCreated)
|
TEST_F(ArchiveComponentTest, DISABLED_CreateArchive_FilesAtThreeDepths_ArchiveCreated)
|
||||||
#else
|
#else
|
||||||
TEST_F(ArchiveTest, CreateArchiveBlocking_FilesAtThreeDepths_ArchiveCreated)
|
TEST_F(ArchiveComponentTest, CreateArchive_FilesAtThreeDepths_ArchiveCreated)
|
||||||
#endif // AZ_TRAIT_DISABLE_FAILED_ARCHIVE_TESTS
|
#endif // AZ_TRAIT_DISABLE_FAILED_ARCHIVE_TESTS
|
||||||
{
|
{
|
||||||
EXPECT_TRUE(m_tempDir.IsValid());
|
EXPECT_TRUE(m_tempDir.IsValid());
|
||||||
CreateArchiveFolder();
|
CreateArchiveFolder();
|
||||||
|
|
||||||
|
AZ_TEST_START_TRACE_SUPPRESSION;
|
||||||
bool createResult = CreateArchive();
|
bool createResult = CreateArchive();
|
||||||
|
AZ_TEST_STOP_TRACE_SUPPRESSION_NO_COUNT;
|
||||||
|
|
||||||
EXPECT_EQ(createResult, true);
|
EXPECT_TRUE(createResult);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if AZ_TRAIT_DISABLE_FAILED_ARCHIVE_TESTS
|
#if AZ_TRAIT_DISABLE_FAILED_ARCHIVE_TESTS
|
||||||
TEST_F(ArchiveTest, DISABLED_ListFilesInArchiveBlocking_FilesAtThreeDepths_FilesFound)
|
TEST_F(ArchiveComponentTest, DISABLED_ListFilesInArchive_FilesAtThreeDepths_FilesFound)
|
||||||
#else
|
#else
|
||||||
TEST_F(ArchiveTest, ListFilesInArchiveBlocking_FilesAtThreeDepths_FilesFound)
|
TEST_F(ArchiveComponentTest, ListFilesInArchive_FilesAtThreeDepths_FilesFound)
|
||||||
#endif // AZ_TRAIT_DISABLE_FAILED_ARCHIVE_TESTS
|
#endif // AZ_TRAIT_DISABLE_FAILED_ARCHIVE_TESTS
|
||||||
{
|
{
|
||||||
EXPECT_TRUE(m_tempDir.IsValid());
|
EXPECT_TRUE(m_tempDir.IsValid());
|
||||||
CreateArchiveFolder();
|
CreateArchiveFolder();
|
||||||
|
|
||||||
|
AZ_TEST_START_TRACE_SUPPRESSION;
|
||||||
EXPECT_EQ(CreateArchive(), true);
|
EXPECT_EQ(CreateArchive(), true);
|
||||||
|
|
||||||
AZStd::vector<AZStd::string> fileList;
|
AZStd::vector<AZStd::string> fileList;
|
||||||
bool listResult{ false };
|
bool listResult{ false };
|
||||||
AzToolsFramework::ArchiveCommandsBus::BroadcastResult(listResult, &AzToolsFramework::ArchiveCommandsBus::Events::ListFilesInArchiveBlocking, GetArchivePath().toStdString().c_str(), fileList);
|
AzToolsFramework::ArchiveCommandsBus::BroadcastResult(listResult,
|
||||||
|
&AzToolsFramework::ArchiveCommandsBus::Events::ListFilesInArchive,
|
||||||
|
GetArchivePath().toUtf8().constData(), fileList);
|
||||||
|
AZ_TEST_STOP_TRACE_SUPPRESSION_NO_COUNT;
|
||||||
|
|
||||||
|
EXPECT_TRUE(listResult);
|
||||||
EXPECT_EQ(fileList.size(), 6);
|
EXPECT_EQ(fileList.size(), 6);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if AZ_TRAIT_DISABLE_FAILED_ARCHIVE_TESTS
|
#if AZ_TRAIT_DISABLE_FAILED_ARCHIVE_TESTS
|
||||||
TEST_F(ArchiveTest, DISABLED_CreateDeltaCatalog_AssetsNotRegistered_Failure)
|
TEST_F(ArchiveComponentTest, DISABLED_CreateDeltaCatalog_AssetsNotRegistered_Failure)
|
||||||
#else
|
#else
|
||||||
TEST_F(ArchiveTest, CreateDeltaCatalog_AssetsNotRegistered_Failure)
|
TEST_F(ArchiveComponentTest, CreateDeltaCatalog_AssetsNotRegistered_Failure)
|
||||||
#endif // AZ_TRAIT_DISABLE_FAILED_ARCHIVE_TESTS
|
#endif // AZ_TRAIT_DISABLE_FAILED_ARCHIVE_TESTS
|
||||||
{
|
{
|
||||||
QStringList fileList = CreateArchiveFileList();
|
QStringList fileList = CreateArchiveFileList();
|
||||||
|
|
||||||
CreateArchiveFolder(GetArchiveFolderName(), fileList);
|
CreateArchiveFolder(GetArchiveFolderName(), fileList);
|
||||||
|
AZ_TEST_START_TRACE_SUPPRESSION;
|
||||||
bool createResult = CreateArchive();
|
bool createResult = CreateArchive();
|
||||||
|
AZ_TEST_STOP_TRACE_SUPPRESSION_NO_COUNT;
|
||||||
|
|
||||||
EXPECT_EQ(createResult, true);
|
EXPECT_EQ(createResult, true);
|
||||||
|
|
||||||
bool catalogCreated{ true };
|
bool catalogCreated{ true };
|
||||||
AZ::Test::AssertAbsorber assertAbsorber;
|
AZ::Test::AssertAbsorber assertAbsorber;
|
||||||
AzToolsFramework::AssetBundleCommandsBus::BroadcastResult(catalogCreated, &AzToolsFramework::AssetBundleCommandsBus::Events::CreateDeltaCatalog, GetArchivePath().toStdString().c_str(), true);
|
AzToolsFramework::AssetBundleCommandsBus::BroadcastResult(catalogCreated,
|
||||||
|
&AzToolsFramework::AssetBundleCommandsBus::Events::CreateDeltaCatalog, GetArchivePath().toUtf8().constData(), true);
|
||||||
|
|
||||||
EXPECT_EQ(catalogCreated, false);
|
EXPECT_EQ(catalogCreated, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if AZ_TRAIT_DISABLE_FAILED_ARCHIVE_TESTS
|
#if AZ_TRAIT_DISABLE_FAILED_ARCHIVE_TESTS
|
||||||
TEST_F(ArchiveTest, DISABLED_CreateDeltaCatalog_ArchiveWithoutCatalogAssetsRegistered_Success)
|
TEST_F(ArchiveComponentTest, DISABLED_AddFilesToArchive_FromListFile_Success)
|
||||||
#else
|
#else
|
||||||
TEST_F(ArchiveTest, CreateDeltaCatalog_ArchiveWithoutCatalogAssetsRegistered_Success)
|
TEST_F(ArchiveComponentTest, AddFilesToArchive_FromListFile_Success)
|
||||||
|
#endif // AZ_TRAIT_DISABLE_FAILED_ARCHIVE_TESTS
|
||||||
|
{
|
||||||
|
QString listFile = CreateArchiveListTextFile();
|
||||||
|
CreateArchiveFolder(GetArchiveFolderName(), CreateArchiveFileList());
|
||||||
|
|
||||||
|
AZ_TEST_START_TRACE_SUPPRESSION;
|
||||||
|
std::future<bool> addResult;
|
||||||
|
AzToolsFramework::ArchiveCommandsBus::BroadcastResult(
|
||||||
|
addResult, &AzToolsFramework::ArchiveCommandsBus::Events::AddFilesToArchive, GetArchivePath().toUtf8().constData(),
|
||||||
|
GetArchiveFolder().toUtf8().constData(), listFile.toUtf8().constData());
|
||||||
|
bool result = addResult.get();
|
||||||
|
AZ_TEST_STOP_TRACE_SUPPRESSION_NO_COUNT;
|
||||||
|
|
||||||
|
EXPECT_TRUE(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if AZ_TRAIT_DISABLE_FAILED_ARCHIVE_TESTS
|
||||||
|
TEST_F(ArchiveComponentTest, DISABLED_ExtractArchive_AllFiles_Success)
|
||||||
|
#else
|
||||||
|
TEST_F(ArchiveComponentTest, ExtractArchive_AllFiles_Success)
|
||||||
|
#endif // AZ_TRAIT_DISABLE_FAILED_ARCHIVE_TESTS
|
||||||
|
{
|
||||||
|
CreateArchiveFolder();
|
||||||
|
AZ_TEST_START_TRACE_SUPPRESSION;
|
||||||
|
bool createResult = CreateArchive();
|
||||||
|
AZ_TEST_STOP_TRACE_SUPPRESSION_NO_COUNT;
|
||||||
|
EXPECT_TRUE(createResult);
|
||||||
|
|
||||||
|
AZ_TEST_START_TRACE_SUPPRESSION;
|
||||||
|
std::future<bool> extractResult;
|
||||||
|
AzToolsFramework::ArchiveCommandsBus::BroadcastResult(
|
||||||
|
extractResult, &AzToolsFramework::ArchiveCommandsBus::Events::ExtractArchive, GetArchivePath().toUtf8().constData(),
|
||||||
|
GetExtractFolder().toUtf8().constData());
|
||||||
|
bool result = extractResult.get();
|
||||||
|
AZ_TEST_STOP_TRACE_SUPPRESSION_NO_COUNT;
|
||||||
|
|
||||||
|
EXPECT_TRUE(result);
|
||||||
|
|
||||||
|
QStringList archiveFiles = CreateArchiveFileList();
|
||||||
|
for (const auto& file : archiveFiles)
|
||||||
|
{
|
||||||
|
QString fullFilePath = QDir(GetExtractFolder()).absoluteFilePath(file);
|
||||||
|
QFileInfo fi(fullFilePath);
|
||||||
|
EXPECT_TRUE(fi.exists());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#if AZ_TRAIT_DISABLE_FAILED_ARCHIVE_TESTS
|
||||||
|
TEST_F(ArchiveComponentTest, DISABLED_CreateDeltaCatalog_ArchiveWithoutCatalogAssetsRegistered_Success)
|
||||||
|
#else
|
||||||
|
TEST_F(ArchiveComponentTest, CreateDeltaCatalog_ArchiveWithoutCatalogAssetsRegistered_Success)
|
||||||
#endif // AZ_TRAIT_DISABLE_FAILED_ARCHIVE_TESTS
|
#endif // AZ_TRAIT_DISABLE_FAILED_ARCHIVE_TESTS
|
||||||
{
|
{
|
||||||
QStringList fileList = CreateArchiveFileList();
|
QStringList fileList = CreateArchiveFileList();
|
||||||
|
|
||||||
CreateArchiveFolder(GetArchiveFolderName(), fileList);
|
CreateArchiveFolder(GetArchiveFolderName(), fileList);
|
||||||
|
|
||||||
|
AZ_TEST_START_TRACE_SUPPRESSION;
|
||||||
bool createResult = CreateArchive();
|
bool createResult = CreateArchive();
|
||||||
|
AZ_TEST_STOP_TRACE_SUPPRESSION_NO_COUNT;
|
||||||
|
|
||||||
EXPECT_EQ(createResult, true);
|
EXPECT_EQ(createResult, true);
|
||||||
|
|
||||||
for (const auto& thisPath : fileList)
|
for (const auto& thisPath : fileList)
|
||||||
{
|
{
|
||||||
AZ::Data::AssetInfo newInfo;
|
AZ::Data::AssetInfo newInfo;
|
||||||
newInfo.m_relativePath = thisPath.toStdString().c_str();
|
newInfo.m_relativePath = thisPath.toUtf8().constData();
|
||||||
newInfo.m_assetType = AZ::Uuid::CreateRandom();
|
newInfo.m_assetType = AZ::Uuid::CreateRandom();
|
||||||
newInfo.m_sizeBytes = 100; // Arbitrary
|
newInfo.m_sizeBytes = 100; // Arbitrary
|
||||||
AZ::Data::AssetId generatedID(AZ::Uuid::CreateRandom());
|
AZ::Data::AssetId generatedID(AZ::Uuid::CreateRandom());
|
||||||
@@ -212,7 +294,7 @@ namespace UnitTest
|
|||||||
|
|
||||||
bool catalogCreated{ false };
|
bool catalogCreated{ false };
|
||||||
AZ_TEST_START_TRACE_SUPPRESSION;
|
AZ_TEST_START_TRACE_SUPPRESSION;
|
||||||
AzToolsFramework::AssetBundleCommandsBus::BroadcastResult(catalogCreated, &AzToolsFramework::AssetBundleCommandsBus::Events::CreateDeltaCatalog, GetArchivePath().toStdString().c_str(), true);
|
AzToolsFramework::AssetBundleCommandsBus::BroadcastResult(catalogCreated, &AzToolsFramework::AssetBundleCommandsBus::Events::CreateDeltaCatalog, GetArchivePath().toUtf8().constData(), true);
|
||||||
AZ_TEST_STOP_TRACE_SUPPRESSION_NO_COUNT; // produces different counts in different platforms
|
AZ_TEST_STOP_TRACE_SUPPRESSION_NO_COUNT; // produces different counts in different platforms
|
||||||
EXPECT_EQ(catalogCreated, true);
|
EXPECT_EQ(catalogCreated, true);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ namespace Benchmark
|
|||||||
AZStd::unique_ptr<Instance> instance = m_prefabSystemComponent->CreatePrefab(
|
AZStd::unique_ptr<Instance> instance = m_prefabSystemComponent->CreatePrefab(
|
||||||
entities
|
entities
|
||||||
, {}
|
, {}
|
||||||
, m_pathString);
|
, m_pathString);
|
||||||
|
|
||||||
state.PauseTiming();
|
state.PauseTiming();
|
||||||
|
|
||||||
@@ -165,7 +165,7 @@ namespace Benchmark
|
|||||||
{
|
{
|
||||||
nestedInstanceRoot = m_prefabSystemComponent->CreatePrefab(
|
nestedInstanceRoot = m_prefabSystemComponent->CreatePrefab(
|
||||||
{},
|
{},
|
||||||
MakeInstanceList( AZStd::move(nestedInstanceRoot) ),
|
MakeInstanceList(AZStd::move(nestedInstanceRoot)),
|
||||||
m_paths[instanceCounter]);
|
m_paths[instanceCounter]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+4
-4
@@ -36,7 +36,7 @@ namespace Benchmark
|
|||||||
|
|
||||||
AZStd::unique_ptr<Instance> enclosingInstance = m_prefabSystemComponent->CreatePrefab(
|
AZStd::unique_ptr<Instance> enclosingInstance = m_prefabSystemComponent->CreatePrefab(
|
||||||
{},
|
{},
|
||||||
MakeInstanceList( AZStd::move(nestedInstance) ),
|
MakeInstanceList(AZStd::move(nestedInstance)),
|
||||||
enclosingTemplatePath);
|
enclosingTemplatePath);
|
||||||
|
|
||||||
TemplateId templateToInstantiateId = enclosingInstance->GetTemplateId();
|
TemplateId templateToInstantiateId = enclosingInstance->GetTemplateId();
|
||||||
@@ -99,7 +99,7 @@ namespace Benchmark
|
|||||||
{
|
{
|
||||||
currentInstanceRoot = m_prefabSystemComponent->CreatePrefab(
|
currentInstanceRoot = m_prefabSystemComponent->CreatePrefab(
|
||||||
{},
|
{},
|
||||||
MakeInstanceList( AZStd::move(currentInstanceRoot) ),
|
MakeInstanceList(AZStd::move(currentInstanceRoot)),
|
||||||
m_paths[currentDepth - 1]);
|
m_paths[currentDepth - 1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -151,7 +151,7 @@ namespace Benchmark
|
|||||||
{
|
{
|
||||||
currentInstanceRoot = m_prefabSystemComponent->CreatePrefab(
|
currentInstanceRoot = m_prefabSystemComponent->CreatePrefab(
|
||||||
{},
|
{},
|
||||||
MakeInstanceList( AZStd::move(currentInstanceRoot) ),
|
MakeInstanceList(AZStd::move(currentInstanceRoot)),
|
||||||
m_paths[currentDepth]);
|
m_paths[currentDepth]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -214,7 +214,7 @@ namespace Benchmark
|
|||||||
|
|
||||||
currentInstanceRoot = m_prefabSystemComponent->CreatePrefab(
|
currentInstanceRoot = m_prefabSystemComponent->CreatePrefab(
|
||||||
{},
|
{},
|
||||||
MakeInstanceList( AZStd::move(currentInstanceRoot), AZStd::move(extraNestedInstance) ),
|
MakeInstanceList(AZStd::move(currentInstanceRoot), AZStd::move(extraNestedInstance)),
|
||||||
m_paths[currentDepth]);
|
m_paths[currentDepth]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -54,7 +54,7 @@ namespace UnitTest
|
|||||||
|
|
||||||
// Create a street prefab that nests the car and sportscar instances created above. The container entity will be created as part of the process.
|
// Create a street prefab that nests the car and sportscar instances created above. The container entity will be created as part of the process.
|
||||||
AZStd::unique_ptr<AzToolsFramework::Prefab::Instance> streetInstance =
|
AZStd::unique_ptr<AzToolsFramework::Prefab::Instance> streetInstance =
|
||||||
m_prefabSystemComponent->CreatePrefab({}, MakeInstanceList( AZStd::move(carInstance), AZStd::move(sportsCarInstance) ), "test/street");
|
m_prefabSystemComponent->CreatePrefab({}, MakeInstanceList(AZStd::move(carInstance), AZStd::move(sportsCarInstance)), "test/street");
|
||||||
ASSERT_TRUE(streetInstance);
|
ASSERT_TRUE(streetInstance);
|
||||||
m_instanceMap[StreetEntityName] = streetInstance.get();
|
m_instanceMap[StreetEntityName] = streetInstance.get();
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -320,7 +320,7 @@ namespace UnitTest
|
|||||||
Instance& addedInstance = *addedInstancePtr;
|
Instance& addedInstance = *addedInstancePtr;
|
||||||
|
|
||||||
//create a first instance where the instance will be removed
|
//create a first instance where the instance will be removed
|
||||||
AZStd::unique_ptr<Instance> firstInstance = m_prefabSystemComponent->CreatePrefab({}, MakeInstanceList( AZStd::move(addedInstancePtr) ), "test/path");
|
AZStd::unique_ptr<Instance> firstInstance = m_prefabSystemComponent->CreatePrefab({}, MakeInstanceList(AZStd::move(addedInstancePtr)), "test/path");
|
||||||
ASSERT_TRUE(firstInstance);
|
ASSERT_TRUE(firstInstance);
|
||||||
|
|
||||||
//get added instance alias
|
//get added instance alias
|
||||||
|
|||||||
@@ -44,11 +44,11 @@ namespace UnitTest
|
|||||||
ASSERT_TRUE(firstInstance);
|
ASSERT_TRUE(firstInstance);
|
||||||
|
|
||||||
AZStd::unique_ptr<AzToolsFramework::Prefab::Instance> secondInstance = m_prefabSystemComponent->CreatePrefab({},
|
AZStd::unique_ptr<AzToolsFramework::Prefab::Instance> secondInstance = m_prefabSystemComponent->CreatePrefab({},
|
||||||
MakeInstanceList( AZStd::move(firstInstance) ), "test/path2");
|
MakeInstanceList(AZStd::move(firstInstance)), "test/path2");
|
||||||
ASSERT_TRUE(secondInstance);
|
ASSERT_TRUE(secondInstance);
|
||||||
|
|
||||||
AZStd::unique_ptr<AzToolsFramework::Prefab::Instance> thirdInstance = m_prefabSystemComponent->CreatePrefab({},
|
AZStd::unique_ptr<AzToolsFramework::Prefab::Instance> thirdInstance = m_prefabSystemComponent->CreatePrefab({},
|
||||||
MakeInstanceList( AZStd::move(secondInstance) ), "test/path3");
|
MakeInstanceList(AZStd::move(secondInstance)), "test/path3");
|
||||||
ASSERT_TRUE(thirdInstance);
|
ASSERT_TRUE(thirdInstance);
|
||||||
|
|
||||||
//Instantiate it
|
//Instantiate it
|
||||||
|
|||||||
@@ -21,8 +21,8 @@ namespace UnitTest
|
|||||||
using namespace AzToolsFramework::Prefab;
|
using namespace AzToolsFramework::Prefab;
|
||||||
LinkData CreateLinkData(
|
LinkData CreateLinkData(
|
||||||
const InstanceData& instanceData,
|
const InstanceData& instanceData,
|
||||||
const TemplateId& sourceTemplateId,
|
TemplateId sourceTemplateId,
|
||||||
const TemplateId& targetTemplateId)
|
TemplateId targetTemplateId)
|
||||||
{
|
{
|
||||||
LinkData newLinkData;
|
LinkData newLinkData;
|
||||||
newLinkData.m_instanceData = instanceData;
|
newLinkData.m_instanceData = instanceData;
|
||||||
|
|||||||
@@ -17,8 +17,8 @@ namespace UnitTest
|
|||||||
{
|
{
|
||||||
LinkData CreateLinkData(
|
LinkData CreateLinkData(
|
||||||
const InstanceData& instanceData,
|
const InstanceData& instanceData,
|
||||||
const AzToolsFramework::Prefab::TemplateId& sourceTemplateId,
|
AzToolsFramework::Prefab::TemplateId sourceTemplateId,
|
||||||
const AzToolsFramework::Prefab::TemplateId& targetTemplateId);
|
AzToolsFramework::Prefab::TemplateId targetTemplateId);
|
||||||
|
|
||||||
InstanceData CreateInstanceDataWithNoPatches(
|
InstanceData CreateInstanceDataWithNoPatches(
|
||||||
const AZStd::string& name,
|
const AZStd::string& name,
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ namespace UnitTest
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ValidateInstances(
|
void ValidateInstances(
|
||||||
const TemplateId& templateId,
|
TemplateId templateId,
|
||||||
const PrefabDomValue& expectedContent,
|
const PrefabDomValue& expectedContent,
|
||||||
const PrefabDomPath& contentPath,
|
const PrefabDomPath& contentPath,
|
||||||
bool isContentAnInstance,
|
bool isContentAnInstance,
|
||||||
@@ -204,7 +204,7 @@ namespace UnitTest
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ValidateEntitiesOfInstances(
|
void ValidateEntitiesOfInstances(
|
||||||
const AzToolsFramework::Prefab::TemplateId& templateId,
|
AzToolsFramework::Prefab::TemplateId templateId,
|
||||||
const AzToolsFramework::Prefab::PrefabDom& expectedPrefabDom,
|
const AzToolsFramework::Prefab::PrefabDom& expectedPrefabDom,
|
||||||
const AZStd::vector<EntityAlias>& entityAliases)
|
const AZStd::vector<EntityAlias>& entityAliases)
|
||||||
{
|
{
|
||||||
@@ -219,7 +219,7 @@ namespace UnitTest
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ValidateNestedInstancesOfInstances(
|
void ValidateNestedInstancesOfInstances(
|
||||||
const AzToolsFramework::Prefab::TemplateId& templateId,
|
AzToolsFramework::Prefab::TemplateId templateId,
|
||||||
const AzToolsFramework::Prefab::PrefabDom& expectedPrefabDom,
|
const AzToolsFramework::Prefab::PrefabDom& expectedPrefabDom,
|
||||||
const AZStd::vector<InstanceAlias>& nestedInstanceAliases)
|
const AZStd::vector<InstanceAlias>& nestedInstanceAliases)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -118,7 +118,7 @@ namespace UnitTest
|
|||||||
const PrefabDomValue& patches);
|
const PrefabDomValue& patches);
|
||||||
|
|
||||||
void ValidateInstances(
|
void ValidateInstances(
|
||||||
const TemplateId& templateId,
|
TemplateId templateId,
|
||||||
const PrefabDomValue& expectedContent,
|
const PrefabDomValue& expectedContent,
|
||||||
const PrefabDomPath& contentPath,
|
const PrefabDomPath& contentPath,
|
||||||
bool isContentAnInstance = false,
|
bool isContentAnInstance = false,
|
||||||
@@ -147,12 +147,12 @@ namespace UnitTest
|
|||||||
void ComparePrefabDomValues(PrefabDomValueConstReference valueA, PrefabDomValueConstReference valueB);
|
void ComparePrefabDomValues(PrefabDomValueConstReference valueA, PrefabDomValueConstReference valueB);
|
||||||
|
|
||||||
void ValidateEntitiesOfInstances(
|
void ValidateEntitiesOfInstances(
|
||||||
const AzToolsFramework::Prefab::TemplateId& templateId,
|
AzToolsFramework::Prefab::TemplateId templateId,
|
||||||
const AzToolsFramework::Prefab::PrefabDom& expectedPrefabDom,
|
const AzToolsFramework::Prefab::PrefabDom& expectedPrefabDom,
|
||||||
const AZStd::vector<EntityAlias>& entityAliases);
|
const AZStd::vector<EntityAlias>& entityAliases);
|
||||||
|
|
||||||
void ValidateNestedInstancesOfInstances(
|
void ValidateNestedInstancesOfInstances(
|
||||||
const AzToolsFramework::Prefab::TemplateId& templateId,
|
AzToolsFramework::Prefab::TemplateId templateId,
|
||||||
const AzToolsFramework::Prefab::PrefabDom& expectedPrefabDom,
|
const AzToolsFramework::Prefab::PrefabDom& expectedPrefabDom,
|
||||||
const AZStd::vector<InstanceAlias>& nestedInstanceAliases);
|
const AZStd::vector<InstanceAlias>& nestedInstanceAliases);
|
||||||
|
|
||||||
|
|||||||
@@ -18,14 +18,14 @@ namespace UnitTest
|
|||||||
{
|
{
|
||||||
//create two prefabs for test
|
//create two prefabs for test
|
||||||
//create prefab 1
|
//create prefab 1
|
||||||
firstInstance = AZStd::move(m_prefabSystemComponent->CreatePrefab({ }, {}, "test/path0"));
|
firstInstance = AZStd::move(m_prefabSystemComponent->CreatePrefab({}, {}, "test/path0"));
|
||||||
ASSERT_TRUE(firstInstance);
|
ASSERT_TRUE(firstInstance);
|
||||||
|
|
||||||
//get template id
|
//get template id
|
||||||
ownerId = firstInstance->GetTemplateId();
|
ownerId = firstInstance->GetTemplateId();
|
||||||
|
|
||||||
//create prefab 2
|
//create prefab 2
|
||||||
secondInstance = AZStd::move(m_prefabSystemComponent->CreatePrefab({ }, {}, "test/path1"));
|
secondInstance = AZStd::move(m_prefabSystemComponent->CreatePrefab({}, {}, "test/path1"));
|
||||||
ASSERT_TRUE(secondInstance);
|
ASSERT_TRUE(secondInstance);
|
||||||
|
|
||||||
//get template id
|
//get template id
|
||||||
|
|||||||
@@ -120,7 +120,7 @@ namespace UnitTest
|
|||||||
|
|
||||||
// Create an enclosing Template with 0 entities and 1 nested Instance.
|
// Create an enclosing Template with 0 entities and 1 nested Instance.
|
||||||
AZStd::unique_ptr<Instance> nestedInstance1 = m_prefabSystemComponent->InstantiatePrefab(newNestedTemplateId);
|
AZStd::unique_ptr<Instance> nestedInstance1 = m_prefabSystemComponent->InstantiatePrefab(newNestedTemplateId);
|
||||||
AZStd::unique_ptr<Instance> newEnclosingInstance = m_prefabSystemComponent->CreatePrefab({}, MakeInstanceList( AZStd::move(nestedInstance1) ), PrefabMockFilePath);
|
AZStd::unique_ptr<Instance> newEnclosingInstance = m_prefabSystemComponent->CreatePrefab({}, MakeInstanceList(AZStd::move(nestedInstance1)), PrefabMockFilePath);
|
||||||
TemplateId newEnclosingTemplateId = newEnclosingInstance->GetTemplateId();
|
TemplateId newEnclosingTemplateId = newEnclosingInstance->GetTemplateId();
|
||||||
EXPECT_TRUE(newEnclosingTemplateId != InvalidTemplateId);
|
EXPECT_TRUE(newEnclosingTemplateId != InvalidTemplateId);
|
||||||
PrefabDom& newEnclosingTemplateDom = m_prefabSystemComponent->FindTemplateDom(newEnclosingTemplateId);
|
PrefabDom& newEnclosingTemplateDom = m_prefabSystemComponent->FindTemplateDom(newEnclosingTemplateId);
|
||||||
@@ -284,7 +284,7 @@ namespace UnitTest
|
|||||||
AZStd::unique_ptr<Instance> nestedInstance2 = m_prefabSystemComponent->InstantiatePrefab(newNestedTemplateId);
|
AZStd::unique_ptr<Instance> nestedInstance2 = m_prefabSystemComponent->InstantiatePrefab(newNestedTemplateId);
|
||||||
AZStd::unique_ptr<Instance> newEnclosingInstance = m_prefabSystemComponent->CreatePrefab(
|
AZStd::unique_ptr<Instance> newEnclosingInstance = m_prefabSystemComponent->CreatePrefab(
|
||||||
{},
|
{},
|
||||||
MakeInstanceList( AZStd::move(nestedInstance1), AZStd::move(nestedInstance2) ),
|
MakeInstanceList(AZStd::move(nestedInstance1), AZStd::move(nestedInstance2)),
|
||||||
PrefabMockFilePath);
|
PrefabMockFilePath);
|
||||||
TemplateId newEnclosingTemplateId = newEnclosingInstance->GetTemplateId();
|
TemplateId newEnclosingTemplateId = newEnclosingInstance->GetTemplateId();
|
||||||
EXPECT_TRUE(newEnclosingTemplateId != InvalidTemplateId);
|
EXPECT_TRUE(newEnclosingTemplateId != InvalidTemplateId);
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ namespace UnitTest
|
|||||||
AZStd::unique_ptr<Instance> wheel1UnderAxle = m_prefabSystemComponent->InstantiatePrefab(wheelTemplateId);
|
AZStd::unique_ptr<Instance> wheel1UnderAxle = m_prefabSystemComponent->InstantiatePrefab(wheelTemplateId);
|
||||||
AZStd::unique_ptr<Instance> wheel2UnderAxle = m_prefabSystemComponent->InstantiatePrefab(wheelTemplateId);
|
AZStd::unique_ptr<Instance> wheel2UnderAxle = m_prefabSystemComponent->InstantiatePrefab(wheelTemplateId);
|
||||||
AZStd::unique_ptr<Instance> axleInstance = m_prefabSystemComponent->CreatePrefab({},
|
AZStd::unique_ptr<Instance> axleInstance = m_prefabSystemComponent->CreatePrefab({},
|
||||||
MakeInstanceList( AZStd::move(wheel1UnderAxle), AZStd::move(wheel2UnderAxle) ), AxlePrefabMockFilePath);
|
MakeInstanceList(AZStd::move(wheel1UnderAxle), AZStd::move(wheel2UnderAxle)), AxlePrefabMockFilePath);
|
||||||
const TemplateId axleTemplateId = axleInstance->GetTemplateId();
|
const TemplateId axleTemplateId = axleInstance->GetTemplateId();
|
||||||
const AZStd::vector<InstanceAlias> wheelInstanceAliasesUnderAxle = axleInstance->GetNestedInstanceAliases(wheelTemplateId);
|
const AZStd::vector<InstanceAlias> wheelInstanceAliasesUnderAxle = axleInstance->GetNestedInstanceAliases(wheelTemplateId);
|
||||||
PrefabDom& axleTemplateDom = m_prefabSystemComponent->FindTemplateDom(axleTemplateId);
|
PrefabDom& axleTemplateDom = m_prefabSystemComponent->FindTemplateDom(axleTemplateId);
|
||||||
@@ -51,7 +51,7 @@ namespace UnitTest
|
|||||||
AZStd::unique_ptr<Instance> axle2UnderCar = m_prefabSystemComponent->InstantiatePrefab(axleTemplateId);
|
AZStd::unique_ptr<Instance> axle2UnderCar = m_prefabSystemComponent->InstantiatePrefab(axleTemplateId);
|
||||||
AZStd::unique_ptr<Instance> spareWheelUnderCar = m_prefabSystemComponent->InstantiatePrefab(wheelTemplateId);
|
AZStd::unique_ptr<Instance> spareWheelUnderCar = m_prefabSystemComponent->InstantiatePrefab(wheelTemplateId);
|
||||||
AZStd::unique_ptr<Instance> carInstance = m_prefabSystemComponent->CreatePrefab({},
|
AZStd::unique_ptr<Instance> carInstance = m_prefabSystemComponent->CreatePrefab({},
|
||||||
MakeInstanceList( AZStd::move(axle1UnderCar), AZStd::move(axle2UnderCar), AZStd::move(spareWheelUnderCar) ), CarPrefabMockFilePath);
|
MakeInstanceList(AZStd::move(axle1UnderCar), AZStd::move(axle2UnderCar), AZStd::move(spareWheelUnderCar)), CarPrefabMockFilePath);
|
||||||
const TemplateId carTemplateId = carInstance->GetTemplateId();
|
const TemplateId carTemplateId = carInstance->GetTemplateId();
|
||||||
const AZStd::vector<InstanceAlias> axleInstanceAliasesUnderCar = carInstance->GetNestedInstanceAliases(axleTemplateId);
|
const AZStd::vector<InstanceAlias> axleInstanceAliasesUnderCar = carInstance->GetNestedInstanceAliases(axleTemplateId);
|
||||||
const AZStd::vector<InstanceAlias> wheelInstanceAliasesUnderCar = carInstance->GetNestedInstanceAliases(wheelTemplateId);
|
const AZStd::vector<InstanceAlias> wheelInstanceAliasesUnderCar = carInstance->GetNestedInstanceAliases(wheelTemplateId);
|
||||||
@@ -93,7 +93,7 @@ namespace UnitTest
|
|||||||
// Create an axle with 0 entities and 1 wheel instance.
|
// Create an axle with 0 entities and 1 wheel instance.
|
||||||
AZStd::unique_ptr<Instance> wheel1UnderAxle = m_prefabSystemComponent->InstantiatePrefab(wheelTemplateId);
|
AZStd::unique_ptr<Instance> wheel1UnderAxle = m_prefabSystemComponent->InstantiatePrefab(wheelTemplateId);
|
||||||
AZStd::unique_ptr<Instance> axleInstance = m_prefabSystemComponent->CreatePrefab({},
|
AZStd::unique_ptr<Instance> axleInstance = m_prefabSystemComponent->CreatePrefab({},
|
||||||
MakeInstanceList( AZStd::move(wheel1UnderAxle) ), AxlePrefabMockFilePath);
|
MakeInstanceList(AZStd::move(wheel1UnderAxle)), AxlePrefabMockFilePath);
|
||||||
const TemplateId axleTemplateId = axleInstance->GetTemplateId();
|
const TemplateId axleTemplateId = axleInstance->GetTemplateId();
|
||||||
PrefabDom& axleTemplateDom = m_prefabSystemComponent->FindTemplateDom(axleTemplateId);
|
PrefabDom& axleTemplateDom = m_prefabSystemComponent->FindTemplateDom(axleTemplateId);
|
||||||
AZStd::vector<InstanceAlias> wheelInstanceAliasesUnderAxle = axleInstance->GetNestedInstanceAliases(wheelTemplateId);
|
AZStd::vector<InstanceAlias> wheelInstanceAliasesUnderAxle = axleInstance->GetNestedInstanceAliases(wheelTemplateId);
|
||||||
@@ -105,7 +105,7 @@ namespace UnitTest
|
|||||||
AZStd::unique_ptr<Instance> axle1UnderCar = m_prefabSystemComponent->InstantiatePrefab(axleTemplateId);
|
AZStd::unique_ptr<Instance> axle1UnderCar = m_prefabSystemComponent->InstantiatePrefab(axleTemplateId);
|
||||||
AZStd::unique_ptr<Instance> axle2UnderCar = m_prefabSystemComponent->InstantiatePrefab(axleTemplateId);
|
AZStd::unique_ptr<Instance> axle2UnderCar = m_prefabSystemComponent->InstantiatePrefab(axleTemplateId);
|
||||||
AZStd::unique_ptr<Instance> carInstance = m_prefabSystemComponent->CreatePrefab({},
|
AZStd::unique_ptr<Instance> carInstance = m_prefabSystemComponent->CreatePrefab({},
|
||||||
MakeInstanceList( AZStd::move(axle1UnderCar), AZStd::move(axle2UnderCar) ), CarPrefabMockFilePath);
|
MakeInstanceList(AZStd::move(axle1UnderCar), AZStd::move(axle2UnderCar)), CarPrefabMockFilePath);
|
||||||
const TemplateId carTemplateId = carInstance->GetTemplateId();
|
const TemplateId carTemplateId = carInstance->GetTemplateId();
|
||||||
const AZStd::vector<InstanceAlias> axleInstanceAliasesUnderCar = carInstance->GetNestedInstanceAliases(axleTemplateId);
|
const AZStd::vector<InstanceAlias> axleInstanceAliasesUnderCar = carInstance->GetNestedInstanceAliases(axleTemplateId);
|
||||||
PrefabDom& carTemplateDom = m_prefabSystemComponent->FindTemplateDom(carTemplateId);
|
PrefabDom& carTemplateDom = m_prefabSystemComponent->FindTemplateDom(carTemplateId);
|
||||||
@@ -151,7 +151,7 @@ namespace UnitTest
|
|||||||
// Create an axle with 0 entities and 1 wheel instance.
|
// Create an axle with 0 entities and 1 wheel instance.
|
||||||
AZStd::unique_ptr<Instance> wheel1UnderAxle = m_prefabSystemComponent->InstantiatePrefab(wheelTemplateId);
|
AZStd::unique_ptr<Instance> wheel1UnderAxle = m_prefabSystemComponent->InstantiatePrefab(wheelTemplateId);
|
||||||
AZStd::unique_ptr<Instance> axleInstance = m_prefabSystemComponent->CreatePrefab({},
|
AZStd::unique_ptr<Instance> axleInstance = m_prefabSystemComponent->CreatePrefab({},
|
||||||
MakeInstanceList( AZStd::move(wheel1UnderAxle) ), AxlePrefabMockFilePath);
|
MakeInstanceList(AZStd::move(wheel1UnderAxle)), AxlePrefabMockFilePath);
|
||||||
const TemplateId axleTemplateId = axleInstance->GetTemplateId();
|
const TemplateId axleTemplateId = axleInstance->GetTemplateId();
|
||||||
PrefabDom& axleTemplateDom = m_prefabSystemComponent->FindTemplateDom(axleTemplateId);
|
PrefabDom& axleTemplateDom = m_prefabSystemComponent->FindTemplateDom(axleTemplateId);
|
||||||
const AZStd::vector<InstanceAlias> wheelInstanceAliasesUnderAxle = axleInstance->GetNestedInstanceAliases(wheelTemplateId);
|
const AZStd::vector<InstanceAlias> wheelInstanceAliasesUnderAxle = axleInstance->GetNestedInstanceAliases(wheelTemplateId);
|
||||||
@@ -159,7 +159,7 @@ namespace UnitTest
|
|||||||
// Create a car with 0 entities and 1 axle instance.
|
// Create a car with 0 entities and 1 axle instance.
|
||||||
AZStd::unique_ptr<Instance> axleUnderCar = m_prefabSystemComponent->InstantiatePrefab(axleTemplateId);
|
AZStd::unique_ptr<Instance> axleUnderCar = m_prefabSystemComponent->InstantiatePrefab(axleTemplateId);
|
||||||
AZStd::unique_ptr<Instance> carInstance = m_prefabSystemComponent->CreatePrefab({},
|
AZStd::unique_ptr<Instance> carInstance = m_prefabSystemComponent->CreatePrefab({},
|
||||||
MakeInstanceList( AZStd::move(axleUnderCar) ), CarPrefabMockFilePath);
|
MakeInstanceList(AZStd::move(axleUnderCar)), CarPrefabMockFilePath);
|
||||||
const TemplateId carTemplateId = carInstance->GetTemplateId();
|
const TemplateId carTemplateId = carInstance->GetTemplateId();
|
||||||
const AZStd::vector<InstanceAlias> axleInstanceAliasesUnderCar = carInstance->GetNestedInstanceAliases(axleTemplateId);
|
const AZStd::vector<InstanceAlias> axleInstanceAliasesUnderCar = carInstance->GetNestedInstanceAliases(axleTemplateId);
|
||||||
PrefabDom& carTemplateDom = m_prefabSystemComponent->FindTemplateDom(carTemplateId);
|
PrefabDom& carTemplateDom = m_prefabSystemComponent->FindTemplateDom(carTemplateId);
|
||||||
@@ -205,7 +205,7 @@ namespace UnitTest
|
|||||||
// Create an axle with 0 entities and 1 wheel instance.
|
// Create an axle with 0 entities and 1 wheel instance.
|
||||||
AZStd::unique_ptr<Instance> wheel1UnderAxle = m_prefabSystemComponent->InstantiatePrefab(wheelTemplateId);
|
AZStd::unique_ptr<Instance> wheel1UnderAxle = m_prefabSystemComponent->InstantiatePrefab(wheelTemplateId);
|
||||||
AZStd::unique_ptr<Instance> axleInstance = m_prefabSystemComponent->CreatePrefab({},
|
AZStd::unique_ptr<Instance> axleInstance = m_prefabSystemComponent->CreatePrefab({},
|
||||||
MakeInstanceList( AZStd::move(wheel1UnderAxle) ), AxlePrefabMockFilePath);
|
MakeInstanceList(AZStd::move(wheel1UnderAxle)), AxlePrefabMockFilePath);
|
||||||
const TemplateId axleTemplateId = axleInstance->GetTemplateId();
|
const TemplateId axleTemplateId = axleInstance->GetTemplateId();
|
||||||
PrefabDom& axleTemplateDom = m_prefabSystemComponent->FindTemplateDom(axleTemplateId);
|
PrefabDom& axleTemplateDom = m_prefabSystemComponent->FindTemplateDom(axleTemplateId);
|
||||||
const AZStd::vector<InstanceAlias> wheelInstanceAliasesUnderAxle = axleInstance->GetNestedInstanceAliases(wheelTemplateId);
|
const AZStd::vector<InstanceAlias> wheelInstanceAliasesUnderAxle = axleInstance->GetNestedInstanceAliases(wheelTemplateId);
|
||||||
@@ -213,7 +213,7 @@ namespace UnitTest
|
|||||||
// Create a car with 0 entities and 1 axle instance.
|
// Create a car with 0 entities and 1 axle instance.
|
||||||
AZStd::unique_ptr<Instance> axleUnderCar = m_prefabSystemComponent->InstantiatePrefab(axleTemplateId);
|
AZStd::unique_ptr<Instance> axleUnderCar = m_prefabSystemComponent->InstantiatePrefab(axleTemplateId);
|
||||||
AZStd::unique_ptr<Instance> carInstance = m_prefabSystemComponent->CreatePrefab({},
|
AZStd::unique_ptr<Instance> carInstance = m_prefabSystemComponent->CreatePrefab({},
|
||||||
MakeInstanceList( AZStd::move(axleUnderCar) ), CarPrefabMockFilePath);
|
MakeInstanceList(AZStd::move(axleUnderCar)), CarPrefabMockFilePath);
|
||||||
const TemplateId carTemplateId = carInstance->GetTemplateId();
|
const TemplateId carTemplateId = carInstance->GetTemplateId();
|
||||||
const AZStd::vector<InstanceAlias> axleInstanceAliasesUnderCar = carInstance->GetNestedInstanceAliases(axleTemplateId);
|
const AZStd::vector<InstanceAlias> axleInstanceAliasesUnderCar = carInstance->GetNestedInstanceAliases(axleTemplateId);
|
||||||
PrefabDom& carTemplateDom = m_prefabSystemComponent->FindTemplateDom(carTemplateId);
|
PrefabDom& carTemplateDom = m_prefabSystemComponent->FindTemplateDom(carTemplateId);
|
||||||
@@ -253,7 +253,7 @@ namespace UnitTest
|
|||||||
AZStd::unique_ptr<Instance> wheel1UnderAxle = m_prefabSystemComponent->InstantiatePrefab(wheelTemplateId);
|
AZStd::unique_ptr<Instance> wheel1UnderAxle = m_prefabSystemComponent->InstantiatePrefab(wheelTemplateId);
|
||||||
AZStd::unique_ptr<Instance> wheel2UnderAxle = m_prefabSystemComponent->InstantiatePrefab(wheelTemplateId);
|
AZStd::unique_ptr<Instance> wheel2UnderAxle = m_prefabSystemComponent->InstantiatePrefab(wheelTemplateId);
|
||||||
AZStd::unique_ptr<Instance> axleInstance = m_prefabSystemComponent->CreatePrefab({},
|
AZStd::unique_ptr<Instance> axleInstance = m_prefabSystemComponent->CreatePrefab({},
|
||||||
MakeInstanceList( AZStd::move(wheel1UnderAxle), AZStd::move(wheel2UnderAxle) ),
|
MakeInstanceList(AZStd::move(wheel1UnderAxle), AZStd::move(wheel2UnderAxle) ),
|
||||||
AxlePrefabMockFilePath);
|
AxlePrefabMockFilePath);
|
||||||
const TemplateId axleTemplateId = axleInstance->GetTemplateId();
|
const TemplateId axleTemplateId = axleInstance->GetTemplateId();
|
||||||
PrefabDom& axleTemplateDom = m_prefabSystemComponent->FindTemplateDom(axleTemplateId);
|
PrefabDom& axleTemplateDom = m_prefabSystemComponent->FindTemplateDom(axleTemplateId);
|
||||||
@@ -265,7 +265,7 @@ namespace UnitTest
|
|||||||
// Create a car with 0 entities and 1 axle instance.
|
// Create a car with 0 entities and 1 axle instance.
|
||||||
AZStd::unique_ptr<Instance> axle1UnderCar = m_prefabSystemComponent->InstantiatePrefab(axleTemplateId);
|
AZStd::unique_ptr<Instance> axle1UnderCar = m_prefabSystemComponent->InstantiatePrefab(axleTemplateId);
|
||||||
AZStd::unique_ptr<Instance> carInstance = m_prefabSystemComponent->CreatePrefab({},
|
AZStd::unique_ptr<Instance> carInstance = m_prefabSystemComponent->CreatePrefab({},
|
||||||
MakeInstanceList( AZStd::move(axle1UnderCar) ), CarPrefabMockFilePath);
|
MakeInstanceList(AZStd::move(axle1UnderCar)), CarPrefabMockFilePath);
|
||||||
const TemplateId carTemplateId = carInstance->GetTemplateId();
|
const TemplateId carTemplateId = carInstance->GetTemplateId();
|
||||||
const AZStd::vector<InstanceAlias> axleInstanceAliasesUnderCar = carInstance->GetNestedInstanceAliases(axleTemplateId);
|
const AZStd::vector<InstanceAlias> axleInstanceAliasesUnderCar = carInstance->GetNestedInstanceAliases(axleTemplateId);
|
||||||
PrefabDom& carTemplateDom = m_prefabSystemComponent->FindTemplateDom(carTemplateId);
|
PrefabDom& carTemplateDom = m_prefabSystemComponent->FindTemplateDom(carTemplateId);
|
||||||
@@ -320,7 +320,7 @@ namespace UnitTest
|
|||||||
// Create an axle with 0 entities and 1 wheel instance.
|
// Create an axle with 0 entities and 1 wheel instance.
|
||||||
AZStd::unique_ptr<Instance> wheel1UnderAxle = m_prefabSystemComponent->InstantiatePrefab(wheelTemplateId);
|
AZStd::unique_ptr<Instance> wheel1UnderAxle = m_prefabSystemComponent->InstantiatePrefab(wheelTemplateId);
|
||||||
AZStd::unique_ptr<Instance> axleInstance = m_prefabSystemComponent->CreatePrefab({},
|
AZStd::unique_ptr<Instance> axleInstance = m_prefabSystemComponent->CreatePrefab({},
|
||||||
MakeInstanceList( AZStd::move(wheel1UnderAxle) ), AxlePrefabMockFilePath);
|
MakeInstanceList(AZStd::move(wheel1UnderAxle)), AxlePrefabMockFilePath);
|
||||||
const TemplateId axleTemplateId = axleInstance->GetTemplateId();
|
const TemplateId axleTemplateId = axleInstance->GetTemplateId();
|
||||||
PrefabDom& axleTemplateDom = m_prefabSystemComponent->FindTemplateDom(axleTemplateId);
|
PrefabDom& axleTemplateDom = m_prefabSystemComponent->FindTemplateDom(axleTemplateId);
|
||||||
const AZStd::vector<InstanceAlias> wheelInstanceAliasesUnderAxle = axleInstance->GetNestedInstanceAliases(wheelTemplateId);
|
const AZStd::vector<InstanceAlias> wheelInstanceAliasesUnderAxle = axleInstance->GetNestedInstanceAliases(wheelTemplateId);
|
||||||
@@ -328,7 +328,7 @@ namespace UnitTest
|
|||||||
// Create a car with 0 entities and 1 axle instance.
|
// Create a car with 0 entities and 1 axle instance.
|
||||||
AZStd::unique_ptr<Instance> axleUnderCar = m_prefabSystemComponent->InstantiatePrefab(axleTemplateId);
|
AZStd::unique_ptr<Instance> axleUnderCar = m_prefabSystemComponent->InstantiatePrefab(axleTemplateId);
|
||||||
AZStd::unique_ptr<Instance> carInstance = m_prefabSystemComponent->CreatePrefab({},
|
AZStd::unique_ptr<Instance> carInstance = m_prefabSystemComponent->CreatePrefab({},
|
||||||
MakeInstanceList( AZStd::move(axleUnderCar) ), CarPrefabMockFilePath);
|
MakeInstanceList(AZStd::move(axleUnderCar)), CarPrefabMockFilePath);
|
||||||
const TemplateId carTemplateId = carInstance->GetTemplateId();
|
const TemplateId carTemplateId = carInstance->GetTemplateId();
|
||||||
const AZStd::vector<InstanceAlias> axleInstanceAliasesUnderCar = carInstance->GetNestedInstanceAliases(axleTemplateId);
|
const AZStd::vector<InstanceAlias> axleInstanceAliasesUnderCar = carInstance->GetNestedInstanceAliases(axleTemplateId);
|
||||||
PrefabDom& carTemplateDom = m_prefabSystemComponent->FindTemplateDom(carTemplateId);
|
PrefabDom& carTemplateDom = m_prefabSystemComponent->FindTemplateDom(carTemplateId);
|
||||||
@@ -381,7 +381,7 @@ namespace UnitTest
|
|||||||
// Create an axle with 0 entities and 1 wheel instance.
|
// Create an axle with 0 entities and 1 wheel instance.
|
||||||
AZStd::unique_ptr<Instance> wheel1UnderAxle = m_prefabSystemComponent->InstantiatePrefab(wheelTemplateId);
|
AZStd::unique_ptr<Instance> wheel1UnderAxle = m_prefabSystemComponent->InstantiatePrefab(wheelTemplateId);
|
||||||
AZStd::unique_ptr<Instance> axleInstance = m_prefabSystemComponent->CreatePrefab({},
|
AZStd::unique_ptr<Instance> axleInstance = m_prefabSystemComponent->CreatePrefab({},
|
||||||
MakeInstanceList( AZStd::move(wheel1UnderAxle) ), AxlePrefabMockFilePath);
|
MakeInstanceList(AZStd::move(wheel1UnderAxle)), AxlePrefabMockFilePath);
|
||||||
const TemplateId axleTemplateId = axleInstance->GetTemplateId();
|
const TemplateId axleTemplateId = axleInstance->GetTemplateId();
|
||||||
PrefabDom& axleTemplateDom = m_prefabSystemComponent->FindTemplateDom(axleTemplateId);
|
PrefabDom& axleTemplateDom = m_prefabSystemComponent->FindTemplateDom(axleTemplateId);
|
||||||
const AZStd::vector<InstanceAlias> wheelInstanceAliasesUnderAxle = axleInstance->GetNestedInstanceAliases(wheelTemplateId);
|
const AZStd::vector<InstanceAlias> wheelInstanceAliasesUnderAxle = axleInstance->GetNestedInstanceAliases(wheelTemplateId);
|
||||||
@@ -389,7 +389,7 @@ namespace UnitTest
|
|||||||
// Create a car with 0 entities and 1 axle instance.
|
// Create a car with 0 entities and 1 axle instance.
|
||||||
AZStd::unique_ptr<Instance> axleUnderCar = m_prefabSystemComponent->InstantiatePrefab(axleTemplateId);
|
AZStd::unique_ptr<Instance> axleUnderCar = m_prefabSystemComponent->InstantiatePrefab(axleTemplateId);
|
||||||
AZStd::unique_ptr<Instance> carInstance = m_prefabSystemComponent->CreatePrefab({},
|
AZStd::unique_ptr<Instance> carInstance = m_prefabSystemComponent->CreatePrefab({},
|
||||||
MakeInstanceList( AZStd::move(axleUnderCar) ), CarPrefabMockFilePath);
|
MakeInstanceList(AZStd::move(axleUnderCar)), CarPrefabMockFilePath);
|
||||||
const TemplateId carTemplateId = carInstance->GetTemplateId();
|
const TemplateId carTemplateId = carInstance->GetTemplateId();
|
||||||
const AZStd::vector<InstanceAlias> axleInstanceAliasesUnderCar = carInstance->GetNestedInstanceAliases(axleTemplateId);
|
const AZStd::vector<InstanceAlias> axleInstanceAliasesUnderCar = carInstance->GetNestedInstanceAliases(axleTemplateId);
|
||||||
PrefabDom& carTemplateDom = m_prefabSystemComponent->FindTemplateDom(carTemplateId);
|
PrefabDom& carTemplateDom = m_prefabSystemComponent->FindTemplateDom(carTemplateId);
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ namespace UnitTest
|
|||||||
// Create a car with 0 entities and 1 axle instance.
|
// Create a car with 0 entities and 1 axle instance.
|
||||||
AZStd::unique_ptr<Instance> axleUnderCar = m_prefabSystemComponent->InstantiatePrefab(axleTemplateId);
|
AZStd::unique_ptr<Instance> axleUnderCar = m_prefabSystemComponent->InstantiatePrefab(axleTemplateId);
|
||||||
AZStd::unique_ptr<Instance> carInstance = m_prefabSystemComponent->CreatePrefab({},
|
AZStd::unique_ptr<Instance> carInstance = m_prefabSystemComponent->CreatePrefab({},
|
||||||
MakeInstanceList( AZStd::move(axleUnderCar) ), CarPrefabMockFilePath);
|
MakeInstanceList(AZStd::move(axleUnderCar)), CarPrefabMockFilePath);
|
||||||
const TemplateId carTemplateId = carInstance->GetTemplateId();
|
const TemplateId carTemplateId = carInstance->GetTemplateId();
|
||||||
const AZStd::vector<InstanceAlias> axleInstanceAliasesUnderCar = carInstance->GetNestedInstanceAliases(axleTemplateId);
|
const AZStd::vector<InstanceAlias> axleInstanceAliasesUnderCar = carInstance->GetNestedInstanceAliases(axleTemplateId);
|
||||||
PrefabDom& carTemplateDom = m_prefabSystemComponent->FindTemplateDom(carTemplateId);
|
PrefabDom& carTemplateDom = m_prefabSystemComponent->FindTemplateDom(carTemplateId);
|
||||||
|
|||||||
@@ -1316,7 +1316,7 @@ CarrierThread::CarrierThread(const CarrierDesc& desc, AZStd::shared_ptr<Compress
|
|||||||
{
|
{
|
||||||
threadDesc.m_priority = desc.m_threadPriority;
|
threadDesc.m_priority = desc.m_threadPriority;
|
||||||
}
|
}
|
||||||
m_thread = AZStd::thread(AZStd::bind(&CarrierThread::ThreadPump, this), &threadDesc);
|
m_thread = AZStd::thread(threadDesc, AZStd::bind(&CarrierThread::ThreadPump, this));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1694,7 +1694,7 @@ namespace GridMate
|
|||||||
//worker packet send thread
|
//worker packet send thread
|
||||||
AZStd::thread_desc workerSendThreadDesc;
|
AZStd::thread_desc workerSendThreadDesc;
|
||||||
workerSendThreadDesc.m_name = "GridMate-Carrier Packet Send Thread";
|
workerSendThreadDesc.m_name = "GridMate-Carrier Packet Send Thread";
|
||||||
m_workerSendThread = AZStd::thread(AZStd::bind(&SocketDriverCommon::RIOPlatformSocketDriver::WorkerSendThread, this), &workerSendThreadDesc);
|
m_workerSendThread = AZStd::thread(workerSendThreadDesc, AZStd::bind(&SocketDriverCommon::RIOPlatformSocketDriver::WorkerSendThread, this));
|
||||||
if (m_workerSendThread.get_id() == AZStd::native_thread_invalid_id)
|
if (m_workerSendThread.get_id() == AZStd::native_thread_invalid_id)
|
||||||
{
|
{
|
||||||
AZ_Error("GridMate", false, "Could not create worker thread.");
|
AZ_Error("GridMate", false, "Could not create worker thread.");
|
||||||
|
|||||||
@@ -627,8 +627,10 @@ namespace O3DELauncher
|
|||||||
AZ_TracePrintf("Launcher", "Application is configured for VFS");
|
AZ_TracePrintf("Launcher", "Application is configured for VFS");
|
||||||
AZ_TracePrintf("Launcher", "Log and cache files will be written to the Cache directory on your host PC");
|
AZ_TracePrintf("Launcher", "Log and cache files will be written to the Cache directory on your host PC");
|
||||||
|
|
||||||
|
#if defined(AZ_ENABLE_TRACING)
|
||||||
constexpr const char* message = "If your game does not run, check any of the following:\n"
|
constexpr const char* message = "If your game does not run, check any of the following:\n"
|
||||||
"\t- Verify the remote_ip address is correct in bootstrap.cfg";
|
"\t- Verify the remote_ip address is correct in bootstrap.cfg";
|
||||||
|
#endif
|
||||||
if (mainInfo.m_additionalVfsResolution)
|
if (mainInfo.m_additionalVfsResolution)
|
||||||
{
|
{
|
||||||
AZ_TracePrintf("Launcher", "%s\n%s", message, mainInfo.m_additionalVfsResolution)
|
AZ_TracePrintf("Launcher", "%s\n%s", message, mainInfo.m_additionalVfsResolution)
|
||||||
|
|||||||
@@ -19,19 +19,10 @@ foreach(project_name project_path IN ZIP_LISTS LY_PROJECTS_TARGET_NAME LY_PROJEC
|
|||||||
# Otherwise the the absolute project_path is returned with symlinks resolved
|
# Otherwise the the absolute project_path is returned with symlinks resolved
|
||||||
file(REAL_PATH ${project_path} project_real_path BASE_DIRECTORY ${LY_ROOT_FOLDER})
|
file(REAL_PATH ${project_path} project_real_path BASE_DIRECTORY ${LY_ROOT_FOLDER})
|
||||||
if(NOT project_name)
|
if(NOT project_name)
|
||||||
if(NOT EXISTS ${project_real_path}/project.json)
|
o3de_read_json_key(project_name ${project_real_path}/project.json "project_name")
|
||||||
message(FATAL_ERROR "The specified project path of ${project_real_path} does not contain a project.json file")
|
message(WARNING "The project located at path ${project_real_path} has a valid \"project name\" of '${project_name}' read from it's project.json file."
|
||||||
else()
|
" This indicates that the ${project_real_path}/CMakeLists.txt is not properly appending the \"project name\" "
|
||||||
# Add the project_name to global LY_PROJECTS_TARGET_NAME property
|
"to the LY_PROJECTS_TARGET_NAME global property. Other configuration errors might occur")
|
||||||
ly_file_read("${project_real_path}/project.json" project_json)
|
|
||||||
string(JSON project_name ERROR_VARIABLE json_error GET ${project_json} "project_name")
|
|
||||||
if(json_error)
|
|
||||||
message(FATAL_ERROR "There is an error reading the \"project_name\" key from the '${project_real_path}/project.json' file: ${json_error}")
|
|
||||||
endif()
|
|
||||||
message(WARNING "The project located at path ${project_real_path} has a valid \"project name\" of '${project_name}' read from it's project.json file."
|
|
||||||
" This indicates that the ${project_real_path}/CMakeLists.txt is not properly appending the \"project name\" "
|
|
||||||
"to the LY_PROJECTS_TARGET_NAME global property. Other configuration errors might occur")
|
|
||||||
endif()
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
|
|||||||
@@ -81,9 +81,6 @@
|
|||||||
#include AZ_RESTRICTED_FILE(ProjectDefines_h)
|
#include AZ_RESTRICTED_FILE(ProjectDefines_h)
|
||||||
#else
|
#else
|
||||||
#define PROJECTDEFINES_H_TRAIT_DISABLE_MONOLITHIC_PROFILING_MARKERS 1
|
#define PROJECTDEFINES_H_TRAIT_DISABLE_MONOLITHIC_PROFILING_MARKERS 1
|
||||||
#if !defined(LINUX) && !defined(APPLE)
|
|
||||||
#define PROJECTDEFINES_H_TRAIT_ENABLE_SOFTCODE_SYSTEM 1
|
|
||||||
#endif
|
|
||||||
#if defined(WIN32) || defined(WIN64) || defined(LINUX) || defined(APPLE)
|
#if defined(WIN32) || defined(WIN64) || defined(LINUX) || defined(APPLE)
|
||||||
#define PROJECTDEFINES_H_TRAIT_USE_GPU_PARTICLES 1
|
#define PROJECTDEFINES_H_TRAIT_USE_GPU_PARTICLES 1
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -71,7 +71,6 @@ void InitCRTHandlers()
|
|||||||
void InitCRTHandlers() {}
|
void InitCRTHandlers() {}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef SOFTCODE
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
// This is an entry to DLL initialization function that must be called for each loaded module
|
// This is an entry to DLL initialization function that must be called for each loaded module
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
@@ -136,8 +135,6 @@ void* GetDetachEnvironmentSymbol()
|
|||||||
return reinterpret_cast<void*>(&DetachEnvironment);
|
return reinterpret_cast<void*>(&DetachEnvironment);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // !defined(SOFTCODE)
|
|
||||||
|
|
||||||
bool g_bProfilerEnabled = false;
|
bool g_bProfilerEnabled = false;
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|||||||
@@ -69,7 +69,8 @@ namespace AssetBundler
|
|||||||
assetInfo = AzToolsFramework::AssetSeedManager::GetAssetInfoById(
|
assetInfo = AzToolsFramework::AssetSeedManager::GetAssetInfoById(
|
||||||
seed.m_assetId,
|
seed.m_assetId,
|
||||||
AzFramework::PlatformHelper::GetPlatformIndicesInterpreted(seed.m_platformFlags)[0],
|
AzFramework::PlatformHelper::GetPlatformIndicesInterpreted(seed.m_platformFlags)[0],
|
||||||
absolutePath);
|
absolutePath,
|
||||||
|
seed.m_assetRelativePath);
|
||||||
platformList = QString(m_seedListManager->GetReadablePlatformList(seed).c_str());
|
platformList = QString(m_seedListManager->GetReadablePlatformList(seed).c_str());
|
||||||
|
|
||||||
m_additionalSeedInfoMap[seed.m_assetId].reset(new AdditionalSeedInfo(assetInfo.m_relativePath.c_str(), platformList));
|
m_additionalSeedInfoMap[seed.m_assetId].reset(new AdditionalSeedInfo(assetInfo.m_relativePath.c_str(), platformList));
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user