[MLDeformer] Delete the Legacy vertex delta model.

#preflight 62fe3e783752f9dd44239bb1

[CL 21441310 by john vanderburg in ue5-main branch]
This commit is contained in:
john vanderburg
2022-08-18 09:46:55 -04:00
parent fd9eafdc4b
commit bcfb0ca47f
25 changed files with 0 additions and 1848 deletions

View File

@@ -70177,45 +70177,6 @@
<File Name="Engine/Plugins/Experimental/Landmass/Content/TextureCreation/Textures/TNoise1024.uasset" Hash="28bad4cca1bc5a608e709841da21ca5865ac150e" />
<File Name="Engine/Plugins/Experimental/Landmass/Content/TextureCreation/Textures/T_Noise_PNG_1024.uasset" Hash="abb7fe603e1ab1743abd10889171a70782421747" />
<File Name="Engine/Plugins/Experimental/Landmass/Resources/Icon128.png" Hash="6ea57bacfdde1725a7d1a30cfff45c96ad158d81" />
<File Name="Engine/Plugins/Experimental/MLDeformer/LegacyVertexDeltaModel/Content/Deformers/DG_LegacyVertexDeltaModel.uasset" Hash="8709af9b00c919000c86929a4576e5ebf3ec9ca4" />
<File Name="Engine/Plugins/Experimental/MLDeformer/LegacyVertexDeltaModel/Content/Deformers/DG_LegacyVertexDeltaModel_HeatMap.uasset" Hash="305eb858265ae589ad9e9bcd5c9dce5d3d271c4b" />
<File Name="Engine/Plugins/Experimental/MLDeformer/LegacyVertexDeltaModel/Content/Python/init_unreal.py" Hash="081c41d5ad97d9fda9bd91f3f652fc8758f2c940" />
<File Name="Engine/Plugins/Experimental/MLDeformer/LegacyVertexDeltaModel/Content/Python/mldeformer/__init__.py" Hash="9deed9c53e99f0e8f94f87527a0136f0b6cea694" />
<File Name="Engine/Plugins/Experimental/MLDeformer/LegacyVertexDeltaModel/Content/Python/mldeformer/samples/__init__.py" Hash="a36439af62886365a910c9fb97ef3d8232cceed1" />
<File Name="Engine/Plugins/Experimental/MLDeformer/LegacyVertexDeltaModel/Content/Python/mldeformer/samples/training/__init__.py" Hash="e35b17bb3ae9b59f014b486611a470f650780f67" />
<File Name="Engine/Plugins/Experimental/MLDeformer/LegacyVertexDeltaModel/Content/Python/mldeformer/samples/training/train.py" Hash="efa3bd07b276a1de6bba2fc5017e366308e10327" />
<File Name="Engine/Plugins/Experimental/MLDeformer/LegacyVertexDeltaModel/Content/Python/mldeformer/training/__init__.py" Hash="8d4804db14e675b5f5d34c0038fe813ba24acc67" />
<File Name="Engine/Plugins/Experimental/MLDeformer/LegacyVertexDeltaModel/Content/Python/mldeformer/training/datasets/__init__.py" Hash="1b95691bfa8b454d1cb2264d16b4c8571e2e5bbe" />
<File Name="Engine/Plugins/Experimental/MLDeformer/LegacyVertexDeltaModel/Content/Python/mldeformer/training/datasets/base_dataset.py" Hash="445d27b1576ea3df43bab61e7e0cc9c84ea3adeb" />
<File Name="Engine/Plugins/Experimental/MLDeformer/LegacyVertexDeltaModel/Content/Python/mldeformer/training/datasets/unreal_deformer_dataset.py" Hash="eb83fe2579bf7133044b65e029b0e416574acb3c" />
<File Name="Engine/Plugins/Experimental/MLDeformer/LegacyVertexDeltaModel/Content/Python/mldeformer/training/logs/__init__.py" Hash="b57e722315d96939bad3e6ef3c892355df5e7df1" />
<File Name="Engine/Plugins/Experimental/MLDeformer/LegacyVertexDeltaModel/Content/Python/mldeformer/training/logs/model_visualizer.py" Hash="27303ae16e690b9394455b2a367120efbf8692ed" />
<File Name="Engine/Plugins/Experimental/MLDeformer/LegacyVertexDeltaModel/Content/Python/mldeformer/training/loss/__init__.py" Hash="cb4e4a9fa4032a7a393c714b46e4285286cbec89" />
<File Name="Engine/Plugins/Experimental/MLDeformer/LegacyVertexDeltaModel/Content/Python/mldeformer/training/loss/loss_functions.py" Hash="891d8a68d6896377233f2d09e035bb102a7fd12f" />
<File Name="Engine/Plugins/Experimental/MLDeformer/LegacyVertexDeltaModel/Content/Python/mldeformer/training/models/__init__.py" Hash="e88bde78ae80044f27fcc720be58991273498c54" />
<File Name="Engine/Plugins/Experimental/MLDeformer/LegacyVertexDeltaModel/Content/Python/mldeformer/training/models/base_model.py" Hash="e5d985767c6fbf71877d36bcfde28d569ba42984" />
<File Name="Engine/Plugins/Experimental/MLDeformer/LegacyVertexDeltaModel/Content/Python/mldeformer/training/models/custom_layers.py" Hash="ae011e4290fa103d4c807edd541346837fb2914b" />
<File Name="Engine/Plugins/Experimental/MLDeformer/LegacyVertexDeltaModel/Content/Python/mldeformer/training/models/deep_deform_model.py" Hash="09b1f7224c0bf7e4d9bcc1b2a86b74ab53877905" />
<File Name="Engine/Plugins/Experimental/MLDeformer/LegacyVertexDeltaModel/Content/Python/mldeformer/training/models/generator_networks.py" Hash="9c0691e34c6f4bc7c4bea27ef5fca91ba7c1e71a" />
<File Name="Engine/Plugins/Experimental/MLDeformer/LegacyVertexDeltaModel/Content/Python/mldeformer/training/models/networks.py" Hash="158d28a48be92caa215d9c3c4328e3dc7ec32ab5" />
<File Name="Engine/Plugins/Experimental/MLDeformer/LegacyVertexDeltaModel/Content/Python/mldeformer/training/options/__init__.py" Hash="26a73e5d8c213ca3ba75e8789d5f8951b331a314" />
<File Name="Engine/Plugins/Experimental/MLDeformer/LegacyVertexDeltaModel/Content/Python/mldeformer/training/options/base_options.py" Hash="2e012e46992d9e990de3da50f9b74a06bc9b7be7" />
<File Name="Engine/Plugins/Experimental/MLDeformer/LegacyVertexDeltaModel/Content/Python/mldeformer/training/options/train_options.py" Hash="def5a41a598285f68733c749b7b5ee3b8f6c3382" />
<File Name="Engine/Plugins/Experimental/MLDeformer/LegacyVertexDeltaModel/Content/Python/mldeformer/training/transformers/__init__.py" Hash="b2f215ee8a0c4ff303409c7311c919743e4b8890" />
<File Name="Engine/Plugins/Experimental/MLDeformer/LegacyVertexDeltaModel/Content/Python/mldeformer/training/transformers/data_transformer.py" Hash="46328e56983a1a873b690086f81d7e9592ae40ef" />
<File Name="Engine/Plugins/Experimental/MLDeformer/LegacyVertexDeltaModel/Content/Python/mldeformer/utils/__init__.py" Hash="c914dc7c3a4a4fc78c39168f545a2caa36907a84" />
<File Name="Engine/Plugins/Experimental/MLDeformer/LegacyVertexDeltaModel/Content/Python/mldeformer/utils/io/__init__.py" Hash="1a61ce2c38315535f993656688a9b11e493600f8" />
<File Name="Engine/Plugins/Experimental/MLDeformer/LegacyVertexDeltaModel/Content/Python/mldeformer/utils/io/os_utils.py" Hash="9043ed07d1358bc039d831caabe735ae814854bb" />
<File Name="Engine/Plugins/Experimental/MLDeformer/LegacyVertexDeltaModel/Content/Python/mldeformer/utils/misc/__init__.py" Hash="9ae96bfeab67e1b2e3190c5cb685a7625122f9a1" />
<File Name="Engine/Plugins/Experimental/MLDeformer/LegacyVertexDeltaModel/Content/Python/mldeformer/utils/misc/data_converter.py" Hash="8bea599da1eb9e301efbfe7efe7308ea9a51cba4" />
<File Name="Engine/Plugins/Experimental/MLDeformer/LegacyVertexDeltaModel/Content/Python/mldeformer/utils/misc/math.py" Hash="fefed4021ac7ff9a2bff4eead68ce055dff63c5c" />
<File Name="Engine/Plugins/Experimental/MLDeformer/LegacyVertexDeltaModel/Content/Python/mldeformer/utils/misc/timer.py" Hash="71a00e2763220c69dac517ada343b088ce2a9835" />
<File Name="Engine/Plugins/Experimental/MLDeformer/LegacyVertexDeltaModel/Content/Tests/Biceps/bicep_curl.uasset" Hash="795984e27abe911f0561157dbe84774710795c4f" />
<File Name="Engine/Plugins/Experimental/MLDeformer/LegacyVertexDeltaModel/Content/Tests/Biceps/bicep_curl_Anim.uasset" Hash="5e9104db5cc55f63dcec0ac06f169522fab4c0fb" />
<File Name="Engine/Plugins/Experimental/MLDeformer/LegacyVertexDeltaModel/Content/Tests/Biceps/bicep_curl_Skeleton.uasset" Hash="606f6efc2c707fd237b36ce241ffbe9f92e236a5" />
<File Name="Engine/Plugins/Experimental/MLDeformer/LegacyVertexDeltaModel/Content/Tests/Biceps/bicep_curl_cache.uasset" Hash="70d927ea393c2d53b193e251add21cf1f47477fd" />
<File Name="Engine/Plugins/Experimental/MLDeformer/LegacyVertexDeltaModel/Content/Tests/Biceps/biceps_mld.uasset" Hash="de33d25484e53bb77bbd7e25349a8c2c81de229a" />
<File Name="Engine/Plugins/Experimental/MLDeformer/LegacyVertexDeltaModel/Resources/Icon128.png" Hash="6ea57bacfdde1725a7d1a30cfff45c96ad158d81" />
<File Name="Engine/Plugins/Experimental/MLDeformer/MLDeformerFramework/Content/Deformers/DG_MLDeformerModel.uasset" Hash="46a601fa31b7ed2d362fe7088cabc342d8a1f3b6" />
<File Name="Engine/Plugins/Experimental/MLDeformer/MLDeformerFramework/Content/Deformers/DG_MLDeformerModel_GPUMorph_HeatMap.uasset" Hash="cd1ee0a728cdd26582dce51fe7b15cf242cce905" />
<File Name="Engine/Plugins/Experimental/MLDeformer/MLDeformerFramework/Content/Deformers/DG_MLDeformerModel_HeatMap.uasset" Hash="86ab3787744ddfb7f9bac27ac7c273ca862fdd98" />
@@ -115556,7 +115517,6 @@
<Blob Hash="08178b006b1ec64ef4040de94701d1506e1d4d98" Size="166912" PackHash="4657572a4503b4a315f7d7aad777b50678ddf344" PackOffset="1929736" />
<Blob Hash="0817ea7c9b3536f0bc4e90cb2c7bb72bc4d0b17b" Size="315" PackHash="3f2e61eabb2f9abe2c24c553155ea092481f3949" PackOffset="779536" />
<Blob Hash="081a32c359416efe6282353c65d09adf1ed199d3" Size="17552" PackHash="1838686c750338eb1bec032842e9a893aacac1dd" PackOffset="1174488" />
<Blob Hash="081c41d5ad97d9fda9bd91f3f652fc8758f2c940" Size="4775" PackHash="a79c334bd161a07b6ea49ffaf6d1656b612daffa" PackOffset="119127" />
<Blob Hash="081cb3b91c362fb6d874c193361f3b561dd4358f" Size="6689" PackHash="0fb51bed7307e49a38d6c2748ee2e736079e53d8" PackOffset="2031201" />
<Blob Hash="081dd7ff8084cf3659653e066fc2caf47283e277" Size="726" PackHash="d34c7f438204350ea347c15f760dda671a96eb3e" PackOffset="936456" />
<Blob Hash="081e70c14ef4d59f5e4ef3e4c98e6bd11fd384f1" Size="6656" PackHash="d8b0b772b3e0f4f10ad6d85cefa41391230d2e59" PackOffset="2073096" />
@@ -115979,7 +115939,6 @@
<Blob Hash="09ae570a24c8d4a1af2e0c89eafd42397001bd99" Size="117408" PackHash="e129e8a1a2b5c3be9bb6442c0ad2fa853968d34c" PackOffset="8" />
<Blob Hash="09aee24e65641baba735b5e953cffa4accb8e51d" Size="5669" PackHash="c8d5ecfed56cda1ac172cd1f9d96a9b245d7db8f" PackOffset="776812" />
<Blob Hash="09b0d3b0cbf1ab62010d5a946441ccf39b782cea" Size="3764204" PackHash="27f23481ec2c0359c3aa577d0c4affa56d75e4ab" PackOffset="8" />
<Blob Hash="09b1f7224c0bf7e4d9bcc1b2a86b74ab53877905" Size="8056" PackHash="64e77b68b9da70c744bb4ca5e54a466e382f6a82" PackOffset="122902" />
<Blob Hash="09b22d57cb8da414bbe05ebc1057b692381b0cee" Size="3167" PackHash="b5b52b49e9daa1407edb66997fba1a5ae4a59ec2" PackOffset="452955" />
<Blob Hash="09b38b1c6de4686c814bb3411bb202e450ee5737" Size="119" PackHash="095a78ae40b918696c52f32aa6c2a3c104106ef5" PackOffset="8" />
<Blob Hash="09b61c9232225fa6932242dbad5b4444cd2f1a78" Size="999" PackHash="503b405bfba60246c4b666898c7ea3caa188e8bc" PackOffset="788754" />
@@ -118872,7 +118831,6 @@
<Blob Hash="158a51fc11058cfb003e8cb45545e66d2e7fd81f" Size="2830" PackHash="cb73a430e097bac42d93ec902203b7888ed0b681" PackOffset="866328" />
<Blob Hash="158b368cf3b8b4b6b0cb0a532081802086e4c5f6" Size="958951" PackHash="e9bf61cdc861c37fb3285e4e3f6c244b6b1d87d8" PackOffset="283871" />
<Blob Hash="158c73463e36aad85570302f9166f430a3c26580" Size="9229" PackHash="ebcdbd3113ce1b1b12aba710b9ed475f2b77bf74" PackOffset="1689887" />
<Blob Hash="158d28a48be92caa215d9c3c4328e3dc7ec32ab5" Size="10163" PackHash="64e77b68b9da70c744bb4ca5e54a466e382f6a82" PackOffset="137021" />
<Blob Hash="158d4c0f26ca6ac2cb56fec6bfcc3462d6a03351" Size="13" PackHash="27116894ea7e2b325fc00f9a0935afe3719797d5" PackOffset="1832549" />
<Blob Hash="158ec399eabcaad1c9b162f9d4564e89ae45106b" Size="26287" PackHash="80c1ba699c3de9b0950a5521e587025e7f85f8bb" PackOffset="2028401" />
<Blob Hash="158ec8a1f42a1649f636d12704e2e884ac5e3ff4" Size="7952" PackHash="33d0a2949662b327b35a881192e85107ecafc8ac" PackOffset="1862028" />
@@ -120079,7 +120037,6 @@
<Blob Hash="1a5dd200747ff4deb0ec9c84a9c545af15382f77" Size="176" PackHash="01d26cddb178f064c3cd74a09430970bf6cc12b7" PackOffset="2087016" />
<Blob Hash="1a5de05fddc4a65d5aa418b486f3e0cdf68a15ba" Size="760328" PackHash="bd240a419a7e9a290ea94059419bc60a57c3815b" PackOffset="8" />
<Blob Hash="1a6189e9387a07cc301c90461051fc34f5d662fb" Size="530" PackHash="42d86201d951b9e75d0a14d6fbebedd1044becd6" PackOffset="767682" />
<Blob Hash="1a61ce2c38315535f993656688a9b11e493600f8" Size="63" PackHash="64e77b68b9da70c744bb4ca5e54a466e382f6a82" PackOffset="158545" />
<Blob Hash="1a625bd49374049b3175caf88111a3db6f7dd978" Size="17101" PackHash="4ad58fb1ef4e07a84e9f7ce1ac8a72acc6b42265" PackOffset="119909" />
<Blob Hash="1a63a00d1dcc2a4e4c70cdcbed1ac8093a110126" Size="26128" PackHash="33f3679a1b6d3e7da34456a34dca2562859d1801" PackOffset="2031812" />
<Blob Hash="1a645c86e69f9aa369bef81e99485a35ee753049" Size="176240" PackHash="e1bde8306693cf0198b9c4e2cca60c5c921ea9ef" PackOffset="1688096" />
@@ -120398,7 +120355,6 @@
<Blob Hash="1b91ca887f7fac3a8648399363449ee2a030f27b" Size="43648" PackHash="210e12340109b292831d3649ef60b4652bc30c1c" PackOffset="1716472" />
<Blob Hash="1b9230eaa8c678006300048b6f1c21428a175d4b" Size="13824" PackHash="fe6078495c852c69d53e6d83466c7cb7ba20a43b" PackOffset="1347448" />
<Blob Hash="1b947e99f6b676b2cfc1a80ff26e704a4ee150b7" Size="62916" PackHash="0dfca370b950d43246b8f3a52c721a083de81b3f" PackOffset="1313816" />
<Blob Hash="1b95691bfa8b454d1cb2264d16b4c8571e2e5bbe" Size="2526" PackHash="3880691ae0333440e6b25c657426ff5042299fd6" PackOffset="537923" />
<Blob Hash="1b96c54c60016289b002488fbc0b62957b4303cb" Size="491" PackHash="c86206c5d0623ef50c4f2dea3008db2461f210e7" PackOffset="8" />
<Blob Hash="1b96cf6f6f3154b68300c2dd613c68ea8f545072" Size="14336" PackHash="fe6078495c852c69d53e6d83466c7cb7ba20a43b" PackOffset="1304440" />
<Blob Hash="1b97c2de0d658f1af542bcee4cc918a2131f1bad" Size="16" PackHash="27116894ea7e2b325fc00f9a0935afe3719797d5" PackOffset="2012695" />
@@ -123132,7 +123088,6 @@
<Blob Hash="26a3f01a87177fb6a4b6f553c96283ca9f9d5a50" Size="18576" PackHash="33d0a2949662b327b35a881192e85107ecafc8ac" PackOffset="159712" />
<Blob Hash="26a50e69afd2d67a0bd6bb886bf0dc5b927fbcd1" Size="1580" PackHash="5cb17f3f8319e59e99cf89cdd430848948628eee" PackOffset="705912" />
<Blob Hash="26a7116b50044ef67cfe11e6d7e2c941722243b9" Size="20402" PackHash="5dbebfe34ab5c28eca7d7b6c57ff41cda029cf64" PackOffset="1437753" />
<Blob Hash="26a73e5d8c213ca3ba75e8789d5f8951b331a314" Size="118" PackHash="64e77b68b9da70c744bb4ca5e54a466e382f6a82" PackOffset="147184" />
<Blob Hash="26a7eca43884db831a3ef13c18f3100e70e158d0" Size="937984" PackHash="7d0c29dd5979944413a234aff9f3f8e3176c9ede" PackOffset="1063332" />
<Blob Hash="26a8a4ad5ab931d93a8f5b0e0d2d39cc92443864" Size="9369" PackHash="a6ec6a3efb598d6f259b71685d63d93ca66e15eb" PackOffset="2076563" />
<Blob Hash="26a966ee1e59abaca2c862229eae2417f987cf06" Size="15776" PackHash="210cc5f7a60b6326a7444223a5f7841ce4d750a0" PackOffset="47328" />
@@ -123272,7 +123227,6 @@
<Blob Hash="272db6e97dd7fe80acb333e87e022322630b4d44" Size="18057" PackHash="b5b52b49e9daa1407edb66997fba1a5ae4a59ec2" PackOffset="2044284" />
<Blob Hash="272e4cf057720b5d25930880e6f458663b2431df" Size="2017" PackHash="60268517ce102b3ab96039800667a78e6d6c5f5e" PackOffset="279783" />
<Blob Hash="272f9cc9ea71d1f5354739f9d71f090a2427a4e1" Size="451" PackHash="017c812ca5e91e3dceac600c163aa6735873919e" PackOffset="3784" />
<Blob Hash="27303ae16e690b9394455b2a367120efbf8692ed" Size="2919" PackHash="64e77b68b9da70c744bb4ca5e54a466e382f6a82" PackOffset="101310" />
<Blob Hash="273100088d60e46279f96fe55f2919b1be222aab" Size="630596" PackHash="38455221b3a995821858b2f10521b5636e01553a" PackOffset="8" />
<Blob Hash="273248ca684f673de39ac65ae5fac2dc96e315f6" Size="4025" PackHash="740468294ff5dc113d230e62ae67c145d10bfb6c" PackOffset="442692" />
<Blob Hash="2733ae866adf32479165ee93c12d4c74cd92b46f" Size="24424" PackHash="54401710d670ee5c2b246b4c0f01a4ad0b1c2ed5" PackOffset="1390960" />
@@ -124970,7 +124924,6 @@
<Blob Hash="2dff53a999de800a83804e5a82e02538263cb396" Size="16264" PackHash="0ce0f96ff165ab46e55a0e3d265bb59c6e94257e" PackOffset="631768" />
<Blob Hash="2dffe4aced48c7dc7903d26de4e5cb694b9023e8" Size="489" PackHash="28007685046ed82473f6da7e76279a9459daea2c" PackOffset="1018945" />
<Blob Hash="2e00530bd205a4e59437b23ab189c5087c1b8faf" Size="60056" PackHash="399022951b4d9bf22defcc527b2bd7234a6e63a9" PackOffset="509616" />
<Blob Hash="2e012e46992d9e990de3da50f9b74a06bc9b7be7" Size="3387" PackHash="64e77b68b9da70c744bb4ca5e54a466e382f6a82" PackOffset="147302" />
<Blob Hash="2e0175d5dd846670b7a7426d38c276433324af2a" Size="892264" PackHash="93ca36c09c2f054d72638f86daada6c4873d7cb9" PackOffset="892272" />
<Blob Hash="2e03fd5d2df166e68d21036079f2e72695667edf" Size="1080" PackHash="f25f5da5b49f7c1000f7e4195d4038bda16e5c38" PackOffset="1763131" />
<Blob Hash="2e052c64668c41ee31e91600b39073637f64c727" Size="2343" PackHash="02f911003167be7b08c3fbf9bdababa124958f48" PackOffset="624571" />
@@ -125586,7 +125539,6 @@
<Blob Hash="305d44fbebe54e7e2b8627694a55a1426b0aca30" Size="48272" PackHash="97d0e7e728a715bdc3217dedf22ecd044793b628" PackOffset="1113624" />
<Blob Hash="305df0331c4d90bf45898fe4e5f94ab27980e9e2" Size="2028737" PackHash="4b316bef0e3604c7f3f9e8b578622da8fa75f36d" PackOffset="8" />
<Blob Hash="305e0f14e5954bcf66f9c33a33e1e9c8a6b091c8" Size="8" PackHash="27116894ea7e2b325fc00f9a0935afe3719797d5" PackOffset="2011661" />
<Blob Hash="305eb858265ae589ad9e9bcd5c9dce5d3d271c4b" Size="56470" PackHash="d18c7996f1aac4a32aaae32a9170e5898cf8f4d4" PackOffset="71892" />
<Blob Hash="305ec0c025c0f579a236ebd6ffa46f4138e3180f" Size="1093479" PackHash="1b3f6569146630da0ee4decf0917b85c0f53787c" PackOffset="863712" />
<Blob Hash="305edb157ea06280d7131ca0511212342e647916" Size="1604" PackHash="79089140e5202cefce11d8a2b34030d6624160d9" PackOffset="123435" />
<Blob Hash="3060be30d89122d665f8d4272c661d7d6991689e" Size="113087" PackHash="18ac0e67993ec4f6bcd4588512b79a7374905657" PackOffset="8" />
@@ -130766,7 +130718,6 @@
<Blob Hash="445950244f1aa0ac911cc710f104af8c614d8023" Size="1073784" PackHash="cf5a6653206d98545fc80dc9acc89c232c1b5d65" PackOffset="8" />
<Blob Hash="4459c9dfd0f66afe4256752e256416bba00da40b" Size="140520" PackHash="402ddad50dcfa1abbd02e0139894a1626a9cf908" PackOffset="1257968" />
<Blob Hash="445a7e08c0fc98176c72a513f89c7f5c28e7a6f7" Size="38400" PackHash="1dffd2224e838dcf3599b8451cb4f8c4388d1973" PackOffset="359432" />
<Blob Hash="445d27b1576ea3df43bab61e7e0cc9c84ea3adeb" Size="1492" PackHash="24bfaac8f7c8383bee6aa7d9a121c04936a321aa" PackOffset="5089" />
<Blob Hash="445dc8f3f1c18e3da2921d800dac1cd619340943" Size="6769020" PackHash="83c26e75614987b0816315db03de7aca670aae61" PackOffset="8" />
<Blob Hash="445dcdb5affed7b1dc60a698ff22119a0a72317e" Size="215" PackHash="eef645665d668dc309bebdc77ca5e0d66043c9e6" PackOffset="605030" />
<Blob Hash="445f9ed0cfda1ed8b4feb414497fd51d4b096ae8" Size="11218" PackHash="c6a87a27121ee980a108fbacde92cb925b2682d0" PackOffset="1265402" />
@@ -131229,7 +131180,6 @@
<Blob Hash="462ff95fd37cb9bfdbc2d6109d04c5647b93386c" Size="35158" PackHash="365ee315b3fccbc9a5e19b27dbe0be2286df7e9a" PackOffset="945190" />
<Blob Hash="4630ef1b70cfcc7bcd0ee0d5f1801d4fb4dee5ce" Size="3560" PackHash="c6a87a27121ee980a108fbacde92cb925b2682d0" PackOffset="567831" />
<Blob Hash="4631e5cf8e4629b4d50703945b59cf11ee6dfd53" Size="3851" PackHash="bf9f8abff19b21537d9cc90e24ab8ea1a58b1dd9" PackOffset="71457" />
<Blob Hash="46328e56983a1a873b690086f81d7e9592ae40ef" Size="3728" PackHash="ad3ea5550a8c0939e78c1eaba21d6dd5418b857c" PackOffset="12966" />
<Blob Hash="4632d9db0924265bf2efab0c673739372884e1f6" Size="12740" PackHash="de2e42ad57386aaae5fdc67c8512ac9ea3798d6d" PackOffset="1114768" />
<Blob Hash="4635485ec328312eabfdb7d49fa2b9a7eac4191c" Size="1850" PackHash="ac2a5984d13897ab029fdbc17ed5a36ec057edbc" PackOffset="2090391" />
<Blob Hash="46363399fa062afd3ddcfab7efd18a6cf591b656" Size="8061904" PackHash="dbe1ece42ad514b0c41ea2b3c99b922137553066" PackOffset="8" />
@@ -142194,7 +142144,6 @@
<Blob Hash="719e9f95b2953693a75ab6018f86b8deaeffad22" Size="608080" PackHash="1b6af1ffdbeaea297a67e5d6e1117ece64a5e3d4" PackOffset="1477128" />
<Blob Hash="719f494cb0d155a32c9b3ae48ed324b36abc44fe" Size="140416" PackHash="79d5a4142ab33a7f9b3db2e10ff5afc3b9be2b4f" PackOffset="1734496" />
<Blob Hash="719fb50d5eb6fa1cd868d3da3b1ac60e84063f09" Size="87176" PackHash="5d8c1361054d728e66e8da11c87cfaa0ce610915" PackOffset="975495" />
<Blob Hash="71a00e2763220c69dac517ada343b088ce2a9835" Size="2105" PackHash="64e77b68b9da70c744bb4ca5e54a466e382f6a82" PackOffset="163695" />
<Blob Hash="71a0ccf4fe3da33664aba7c004d4f10977d71845" Size="1274" PackHash="010dd3c65d5732a23e4ba678d73c9306ee039ef3" PackOffset="2095354" />
<Blob Hash="71a3764b6f237fe86ad3c61904cd77617eeff53c" Size="715" PackHash="c6a87a27121ee980a108fbacde92cb925b2682d0" PackOffset="883828" />
<Blob Hash="71a4626389ae1f6f552c4b9aa5d204d8e42cb917" Size="488" PackHash="c7a410dea128511415ba77d4b599d33e0e01ea2f" PackOffset="463307" />
@@ -147664,7 +147613,6 @@
<Blob Hash="87070b545ad472a80e7c08093d6f0a71a5675a21" Size="30208" PackHash="34791d569b3eca7a389ec47a9c106dddb4dc9d1d" PackOffset="2061848" />
<Blob Hash="8707b3924b4b6e6b8b662fe3d4237fe98e94966b" Size="2690704" PackHash="b1a273a4a61f29166007612fcbf764bd6d7ca87e" PackOffset="8" />
<Blob Hash="87099ba58062dc3acd7165f1ff982e81b17f7a47" Size="100" PackHash="830cc93f966e96754b4b160b2d5ffbe64678ec80" PackOffset="1329560" />
<Blob Hash="8709af9b00c919000c86929a4576e5ebf3ec9ca4" Size="71884" PackHash="d18c7996f1aac4a32aaae32a9170e5898cf8f4d4" PackOffset="8" />
<Blob Hash="870bb8bfd269c04f098cebfc663230ae71d186f0" Size="3516" PackHash="d92734f6a18a11d0dfbf8c9e12f63f2180c5225d" PackOffset="27878" />
<Blob Hash="870c194f83f496d6eca243fa2fc77bbb2685a61d" Size="16496" PackHash="8faee4fc93180763d03ff6cee1ba10db69d23781" PackOffset="1382776" />
<Blob Hash="870d55d0687178d6148c2d293f8ac00580122aa9" Size="16384" PackHash="ef82f803d703c9fa137b8bbbcca03bf43b87d082" PackOffset="870180" />
@@ -148217,7 +148165,6 @@
<Blob Hash="8919f21fcbe0598a76f8b6dd435b9a8a4ef164ef" Size="2587" PackHash="eef645665d668dc309bebdc77ca5e0d66043c9e6" PackOffset="808926" />
<Blob Hash="891c639653134fbe7ffd22d6b8d985439d1b5493" Size="186" PackHash="4b0f6024494e02f2b2cdd75b48b059c81bde532c" PackOffset="610314" />
<Blob Hash="891d2a09c9b43abf40ffb09de10cf108547ce5bc" Size="28040" PackHash="8152e8edca61209c0ceddfe18df09424216095a3" PackOffset="1894180" />
<Blob Hash="891d8a68d6896377233f2d09e035bb102a7fd12f" Size="3688" PackHash="64e77b68b9da70c744bb4ca5e54a466e382f6a82" PackOffset="104306" />
<Blob Hash="891dddb3011001bc328800c79032480b95494dc0" Size="12892" PackHash="28698742b1bdba3a09920c52bf8d1a826eb3cce0" PackOffset="8" />
<Blob Hash="891e3ad6ad9c3c9964bec77042d1dc9bf9b4d88b" Size="50527" PackHash="10755c5e15d7357923564ebca509b4864477c47b" PackOffset="434175" />
<Blob Hash="891eac67ee12c9d365256f94fad6328e4ea884c9" Size="187008" PackHash="4bb5edaf59ef5b2bebbb9a27ef3afa4781a910d0" PackOffset="1855911" />
@@ -148914,7 +148861,6 @@
<Blob Hash="8be5d085db7aead34ce43ed512845831b8786621" Size="6656" PackHash="f319be8f05ca54c8bbc858dd404a7d0574a5b535" PackOffset="2072811" />
<Blob Hash="8be9af989ed73cb75497c3ec31e4d06d1f13d475" Size="1892" PackHash="375fc7daadf4e7c57ed3fb499492997b710a6201" PackOffset="1393340" />
<Blob Hash="8bea3c385ca8ec5afd5b352e3d5377454ceb8942" Size="71894" PackHash="8bec18cc663f9372de7f0e332c4c66afb2bf443b" PackOffset="1538786" />
<Blob Hash="8bea599da1eb9e301efbfe7efe7308ea9a51cba4" Size="2628" PackHash="b8f2c32e7c73de6451e0a6195af9c5f364098913" PackOffset="16396" />
<Blob Hash="8bea722ac00522deaa5b380aeef4ca57d7a271bd" Size="4024" PackHash="24aac461ee54420b2fbb50c17fba330abdd085e0" PackOffset="955503" />
<Blob Hash="8beba7b161628a1365af57643be052a76eb02053" Size="460288" PackHash="0ead61e9d76e86f7f28de26f96309e5683e9f632" PackOffset="8" />
<Blob Hash="8becdc95e020d5f8a90e0ec8b34cb03da9238e06" Size="368" PackHash="6974b9c6f99dd329465ca79c60ac6eebd6d448a5" PackOffset="475112" />
@@ -149246,7 +149192,6 @@
<Blob Hash="8d4462ef27180aebc0fd924a4f961afbd49c92d2" Size="145" PackHash="bf6ccb8b8cb10a5dfa1a4c6e7c988496d81ee69d" PackOffset="1685807" />
<Blob Hash="8d459cc3a9c32c3af07f0e17802e46e160184760" Size="31232" PackHash="55df319c1669c897573d5a59f60e6e8f428de175" PackOffset="1725448" />
<Blob Hash="8d45aaa21996231289ce0da58d7054dace1e8bf7" Size="61440" PackHash="92e66d56d52d71d565c6dba0b0e21aa61a639c71" PackOffset="1019400" />
<Blob Hash="8d4804db14e675b5f5d34c0038fe813ba24acc67" Size="81" PackHash="64e77b68b9da70c744bb4ca5e54a466e382f6a82" PackOffset="90427" />
<Blob Hash="8d48c06c6ff553730efc6b4f42f7b88e345e3b44" Size="1580" PackHash="5cb17f3f8319e59e99cf89cdd430848948628eee" PackOffset="887612" />
<Blob Hash="8d4a4cb63ab1cea5ae72accdce6b05a5d04406ca" Size="23701" PackHash="a3744b86d829468878287439113f41eb3dd66330" PackOffset="264405" />
<Blob Hash="8d4ad5b14526cd5cf42de24340cbbd2d26234fbc" Size="1929" PackHash="d01a5db6b96b011950d196dd629a832847367254" PackOffset="2038632" />
@@ -149977,7 +149922,6 @@
<Blob Hash="90409f7e74a55b10f2244f54a7b8d07963237f8a" Size="316" PackHash="bf6ccb8b8cb10a5dfa1a4c6e7c988496d81ee69d" PackOffset="1606806" />
<Blob Hash="9042195e7c268ba60ba3b490af696bc026559c44" Size="648" PackHash="d01a5db6b96b011950d196dd629a832847367254" PackOffset="766757" />
<Blob Hash="90425942f8f9068ebd8bd881402807f8a5d370fd" Size="5154" PackHash="f2e71a6b9591b5cc7b359bb30ddc78c580f95ad5" PackOffset="696356" />
<Blob Hash="9043ed07d1358bc039d831caabe735ae814854bb" Size="1559" PackHash="64e77b68b9da70c744bb4ca5e54a466e382f6a82" PackOffset="158608" />
<Blob Hash="90441598ac045536cf4560969fa47251f06b578d" Size="2795178" PackHash="d3f38e7603f6fb1d9c8e60969b677f0966501bd0" PackOffset="8" />
<Blob Hash="9047139dacf960e368da038d2024f042d777f01b" Size="6290" PackHash="d92734f6a18a11d0dfbf8c9e12f63f2180c5225d" PackOffset="1909394" />
<Blob Hash="90481e2f733dd38ce7fb5c95fa8d785aecd84be7" Size="30700" PackHash="8152e8edca61209c0ceddfe18df09424216095a3" PackOffset="1786332" />
@@ -152659,7 +152603,6 @@
<Blob Hash="9ae7c797360e21e797444638758b10a4bfb4ebd5" Size="28105" PackHash="7ad0bd89ceaa1f08ce59b47724ff97e565b86278" PackOffset="105863" />
<Blob Hash="9ae86befe3b7e3e9e3f430aa58d28d624c86f8fc" Size="268020" PackHash="ee31e2716c0e11a71d4cdbf8d7a3cd968822e93a" PackOffset="604864" />
<Blob Hash="9ae91d9fa94e3987bce7902f553ecb8aba256cc5" Size="21829" PackHash="fdff3d7dbb62cb16aeff2ac3e32537afae71db8b" PackOffset="339715" />
<Blob Hash="9ae96bfeab67e1b2e3190c5cb685a7625122f9a1" Size="74" PackHash="64e77b68b9da70c744bb4ca5e54a466e382f6a82" PackOffset="160167" />
<Blob Hash="9aea8e06d80d10c98369d13930df05724dbb632a" Size="1614" PackHash="a47d2340e2c544950f3bd2ce9b31e3fd97d1401f" PackOffset="796815" />
<Blob Hash="9aeb6b5435bb210abd9d0a7523ddb822d7d0e776" Size="61691" PackHash="62e18e2b34d9ca5872cacacfd6eb9e94afd0eb2e" PackOffset="732428" />
<Blob Hash="9aeba3781dadb32e45ddcd8e8d64f90171f9335d" Size="1568" PackHash="65c2beb9a452ee5391ae990ec501a48c8b66b525" PackOffset="2095571" />
@@ -152945,7 +152888,6 @@
<Blob Hash="9c04d8f99e55da54b2729b61629a71f9f2fd2529" Size="538" PackHash="bf6ccb8b8cb10a5dfa1a4c6e7c988496d81ee69d" PackOffset="1379254" />
<Blob Hash="9c0595e25574dde8b33d547584d5447d80c01268" Size="5612" PackHash="177601ee4036a4f40d1fd99deb3c47b36e5669a6" PackOffset="2091215" />
<Blob Hash="9c062a8e4ca871ff09044160818db39d59327417" Size="955" PackHash="afc5cb40d4e6c77d1775d83fce7636691d3fa748" PackOffset="679653" />
<Blob Hash="9c0691e34c6f4bc7c4bea27ef5fca91ba7c1e71a" Size="6063" PackHash="64e77b68b9da70c744bb4ca5e54a466e382f6a82" PackOffset="130958" />
<Blob Hash="9c09d774993f868afeb5f115b3402dbf7bc9f6b2" Size="16000" PackHash="4b70796176b030e31e290036f7fc3d4cbbae55a8" PackOffset="1263879" />
<Blob Hash="9c0a77a4d9e76df4dc16eec0c396ac98c1ea6ee7" Size="24780" PackHash="b32adc84148cd2c01a7aaf2f646b0244237f87cf" PackOffset="711658" />
<Blob Hash="9c0aae09a68808bfdb6cfef7fa3d13a3157b76f0" Size="84" PackHash="2f143d8520d94bbf2cb250b35a8f79e3d3e8572c" PackOffset="2092852" />
@@ -153418,7 +153360,6 @@
<Blob Hash="9dea6c7a0ceaa85bd71fd586a0b4f55560385084" Size="8272" PackHash="1d09bb4f8ba502cef13de6d570839e6790bf3542" PackOffset="283628" />
<Blob Hash="9debb3e48f662a6c65d6831877ce31a29ad6d15f" Size="90" PackHash="7c047ca390e62bec7c21c84bf5b112e8850e02e1" PackOffset="2096808" />
<Blob Hash="9dee18dc2df664723b80b18d660ba09872082a7a" Size="4464" PackHash="ccc7e025eeb6b5950b1d82c8f649fc7bb2f33d48" PackOffset="194654" />
<Blob Hash="9deed9c53e99f0e8f94f87527a0136f0b6cea694" Size="54" PackHash="64e77b68b9da70c744bb4ca5e54a466e382f6a82" PackOffset="84019" />
<Blob Hash="9df065bdcb9cac049891647c73c30505938e26c7" Size="2231" PackHash="7ca0e1410f00142dc9791ff1fb493669e443f644" PackOffset="1581051" />
<Blob Hash="9df1a6cffcb005a3f2b8e4bf7f58ec49efa0a493" Size="48403" PackHash="ad4207783212636370be585632e4c55891407859" PackOffset="802900" />
<Blob Hash="9df35005484b0b2dafafa9c8f606c72c6a2f82e3" Size="112118" PackHash="f5c5c6db99e55f7abca03fc964d59cfe4eb56361" PackOffset="1581571" />
@@ -154833,7 +154774,6 @@
<Blob Hash="a35d83bcdfb41bf5109e5184f40e307de1c5f3be" Size="257640" PackHash="8faee4fc93180763d03ff6cee1ba10db69d23781" PackOffset="1687256" />
<Blob Hash="a36298367827c2ae59a5e9de37a8a8e69019d91f" Size="155688" PackHash="d99280aaf8e59b5707296bcd07b0a86f8ed46436" PackOffset="1034062" />
<Blob Hash="a3635ffbfd17cfdae3114447e8a2f38198154199" Size="50800" PackHash="f79c137ba314ed6fa84e0c3cb941aa2d01ddcb79" PackOffset="8" />
<Blob Hash="a36439af62886365a910c9fb97ef3d8232cceed1" Size="40" PackHash="64e77b68b9da70c744bb4ca5e54a466e382f6a82" PackOffset="84073" />
<Blob Hash="a364cb902e29564c9db529a06287c5537a19a5a7" Size="1611" PackHash="059d3c95b05ece3c5af7a0572b455282bd670fbb" PackOffset="8" />
<Blob Hash="a365c2fa829279e21347cc24078c94e5124c17c0" Size="1580" PackHash="0a79b68fc843ff09e7eeffe5fafe58c90b6ece69" PackOffset="175388" />
<Blob Hash="a3672d3144e02bb60a946812e26c924743bc5184" Size="97392" PackHash="399022951b4d9bf22defcc527b2bd7234a6e63a9" PackOffset="1236888" />
@@ -157509,7 +157449,6 @@
<Blob Hash="adfe7981ebc326d8312a1ca940f0626e065205a2" Size="184320" PackHash="1bcff0fb8bd322d66043beb345e2501c214b9f04" PackOffset="378376" />
<Blob Hash="adff19d3eabf9776435287c47491075853f5fdf4" Size="104" PackHash="4b0f6024494e02f2b2cdd75b48b059c81bde532c" PackOffset="158974" />
<Blob Hash="ae008f9bde0bd6f9a1c517c176af99b8c9ca3dde" Size="243" PackHash="740468294ff5dc113d230e62ae67c145d10bfb6c" PackOffset="861561" />
<Blob Hash="ae011e4290fa103d4c807edd541346837fb2914b" Size="225" PackHash="64e77b68b9da70c744bb4ca5e54a466e382f6a82" PackOffset="122677" />
<Blob Hash="ae02837cac43c8edc1de3a5abb16b8b9d358c00a" Size="100" PackHash="33d0a2949662b327b35a881192e85107ecafc8ac" PackOffset="1036928" />
<Blob Hash="ae0370ddc53109bd089061d57ce90a285a892332" Size="1628" PackHash="a3744b86d829468878287439113f41eb3dd66330" PackOffset="747343" />
<Blob Hash="ae06db5016f22c7df439eeeca2289ae7134bb58b" Size="152" PackHash="830cc93f966e96754b4b160b2d5ffbe64678ec80" PackOffset="1418872" />
@@ -158769,7 +158708,6 @@
<Blob Hash="b2f0442865060550676649d119d83977afb25b1d" Size="268020" PackHash="62571d95283aca6ffd4328aa0792ffea25263a0e" PackOffset="1669212" />
<Blob Hash="b2f121beed6ce37f2589b44e7c95a4cc3d83cbad" Size="3113" PackHash="f4f360f81e0fe0c3b19ba2e927c0edf2ca16dd74" PackOffset="927349" />
<Blob Hash="b2f19e2bf8b948ac49ad2f5c336caf107d76c32b" Size="5527" PackHash="27121601acbe7178335d2b27550880f69147f685" PackOffset="1432292" />
<Blob Hash="b2f215ee8a0c4ff303409c7311c919743e4b8890" Size="86" PackHash="64e77b68b9da70c744bb4ca5e54a466e382f6a82" PackOffset="154787" />
<Blob Hash="b2f22264ad83e18147a0d61d4d28f5f438ef150f" Size="84465" PackHash="3d54821d2e23fe42ce1fc0bbeb0d30a441393fbe" PackOffset="1172880" />
<Blob Hash="b2f2394c851b6e5a8ee8ebc06eb78560faf0d6cc" Size="5865" PackHash="2db7f4c348d568244ddd15922a46fffd20a8d012" PackOffset="1821889" />
<Blob Hash="b2f2b22a697c594dab0f1d041905b998b3a6a6c8" Size="191" PackHash="dd3879c8412ca5655fecfb160744dc2f1032689a" PackOffset="776682" />
@@ -159384,7 +159322,6 @@
<Blob Hash="b57aa6028b94c9a31fc515d295eb0047653f1853" Size="100" PackHash="a44dc4b35972b9dad88e2ad3e0a47c8db7399c27" PackOffset="912004" />
<Blob Hash="b57b16e601da09e4f6fafd348e0ef38ef8e08ed0" Size="3736" PackHash="b5ca4cf47eef50dc0732aff0b9d00c282415892e" PackOffset="972520" />
<Blob Hash="b57cf9b80b71e3e4b0b8dc07cceda71d0868ccdd" Size="20872" PackHash="7430e68dd9315b396601f6cb5a9a0bcad7e86ad6" PackOffset="1138704" />
<Blob Hash="b57e722315d96939bad3e6ef3c892355df5e7df1" Size="108" PackHash="64e77b68b9da70c744bb4ca5e54a466e382f6a82" PackOffset="101202" />
<Blob Hash="b57e8619bad2ac49d7bc407f915bd298e51acefb" Size="1139" PackHash="503b405bfba60246c4b666898c7ea3caa188e8bc" PackOffset="1994103" />
<Blob Hash="b58323043bbdf201018fd8c9a1b80f0f6b7cff43" Size="1172205" PackHash="f107035dfecb6e878d26e097f59b684320bb9150" PackOffset="8" />
<Blob Hash="b583be93c9849875cad4dccd53a630c7d4309e4c" Size="3186" PackHash="d887289d7622b019e9daab53432de1387c4f5ec4" PackOffset="1527099" />
@@ -164355,7 +164292,6 @@
<Blob Hash="c910294eb5cd5bf560ddc1ab7df7262298ed0524" Size="24148" PackHash="b5b52b49e9daa1407edb66997fba1a5ae4a59ec2" PackOffset="256387" />
<Blob Hash="c9111f669cec3676b13c9c5eed1f5810cf95dcd5" Size="179" PackHash="f282430cd89c52961261634cb1d56b73f34f9566" PackOffset="572554" />
<Blob Hash="c911ef14c81398771581b69f1de1d6aa38bb55b5" Size="1176" PackHash="f7032c5ada3e73ea44b971004fdaa1dfae7d8e3a" PackOffset="329768" />
<Blob Hash="c914dc7c3a4a4fc78c39168f545a2caa36907a84" Size="62" PackHash="64e77b68b9da70c744bb4ca5e54a466e382f6a82" PackOffset="158483" />
<Blob Hash="c91501c0cb0215c4e58792693048c1c49fb9749e" Size="124047" PackHash="1aca4ae1ad68fe5a8caeaa77ac0f066dc0ff77af" PackOffset="900636" />
<Blob Hash="c9152c11453a13d803e0651bdb5b54244cf7d7b3" Size="546" PackHash="4b0f6024494e02f2b2cdd75b48b059c81bde532c" PackOffset="542722" />
<Blob Hash="c916154313e465988dec25eab18969b84d195cb5" Size="454" PackHash="42d86201d951b9e75d0a14d6fbebedd1044becd6" PackOffset="840240" />
@@ -164923,7 +164859,6 @@
<Blob Hash="cb4d8eca549c478c0e64546a39ad86093d800390" Size="12532" PackHash="95d2e0ea2080cbd21847f05ba63e2615d3f80849" PackOffset="584021" />
<Blob Hash="cb4d98bfe659da0ccaad015db0f2ee51b3ca3520" Size="320160" PackHash="3a393343fa82d544f832d20c7bf408bd4cf486e2" PackOffset="320168" />
<Blob Hash="cb4dfaabccb8929c432d7e79e1ad8accaf505719" Size="344" PackHash="830cc93f966e96754b4b160b2d5ffbe64678ec80" PackOffset="628108" />
<Blob Hash="cb4e4a9fa4032a7a393c714b46e4285286cbec89" Size="77" PackHash="64e77b68b9da70c744bb4ca5e54a466e382f6a82" PackOffset="104229" />
<Blob Hash="cb51be4e928525224e5fd459a93dd989731933a1" Size="978" PackHash="bf6ccb8b8cb10a5dfa1a4c6e7c988496d81ee69d" PackOffset="1313169" />
<Blob Hash="cb51fdcf2347715d5c19e3af30371a372e65caf7" Size="939" PackHash="02f911003167be7b08c3fbf9bdababa124958f48" PackOffset="558627" />
<Blob Hash="cb53a9c620eac35ea87c3d64db9b8ee69185fe5f" Size="12" PackHash="488412bc85287f2b1327d4212dad45989ec36c86" PackOffset="8" />
@@ -169760,7 +169695,6 @@
<Blob Hash="de301ea24ce1c2708b098314e08747271ffacb68" Size="152" PackHash="463c47839b132e9e92cba91e93c1123c4ce11b57" PackOffset="2096694" />
<Blob Hash="de31e18f54d2e3e2bf024d6743fc245c038cddc0" Size="396" PackHash="e9eb05c134d56b547facb9cf5b14fe33b3abc7cc" PackOffset="72395" />
<Blob Hash="de3235d371e8f0662441548caedbd0d94c3a8fb5" Size="19320" PackHash="61394ab21be82143c057c97fc37dd7d267d4f0af" PackOffset="1730536" />
<Blob Hash="de33d25484e53bb77bbd7e25349a8c2c81de229a" Size="7457326" PackHash="f598247c962f585ed82f401b3af1e0b0c9918de0" PackOffset="8" />
<Blob Hash="de3460c903ad195f35d43b44815ef944bb54e140" Size="349" PackHash="27116894ea7e2b325fc00f9a0935afe3719797d5" PackOffset="1783233" />
<Blob Hash="de35a9b570637005b3cf1c64c8fc8cd8905e28f0" Size="758" PackHash="1336cff9c94eb7d2f2d6ea1a5587074ba45d2c79" PackOffset="473361" />
<Blob Hash="de362945a523feaab652c630166ebc809a2f922f" Size="2358" PackHash="c6a87a27121ee980a108fbacde92cb925b2682d0" PackOffset="1587718" />
@@ -169991,7 +169925,6 @@
<Blob Hash="deeef660a329eb2669006e7dccd0d18a23279df2" Size="1460" PackHash="a9d3dc2756958cfadc0a9ce5087c4b2b3eeb7ceb" PackOffset="2095505" />
<Blob Hash="def1cdb7a86718c3a27235b3a1c21bec340b683f" Size="3644" PackHash="ff5dc842a06fb1fd8568383d211bb331bcfd0e04" PackOffset="1202204" />
<Blob Hash="def212af08089ac7efb6f9787c1ba3680d17e5e6" Size="365418" PackHash="fed2412aa7c1c1856a312e61703139e8e70ae00f" PackOffset="1292605" />
<Blob Hash="def5a41a598285f68733c749b7b5ee3b8f6c3382" Size="4396" PackHash="b8f2c32e7c73de6451e0a6195af9c5f364098913" PackOffset="12000" />
<Blob Hash="def625b44dddbd204697c94d4bbc700967e65e9e" Size="14712" PackHash="2e274b42847cbab8d228c33dbbee847cc4246319" PackOffset="1032784" />
<Blob Hash="def69aa5a01caa8e8b4740c42febd4c342e68499" Size="70068" PackHash="c90ab57be9deae80b28712060500f6d76894437f" PackOffset="8" />
<Blob Hash="def6a1cf2afc16b3475d46aea327554d6fabe8a1" Size="17000" PackHash="693cd86293f947c0286939975abec7e1d2463afe" PackOffset="2004872" />
@@ -171108,7 +171041,6 @@
<Blob Hash="e359616f94432deb3c98582c77acc9e787acab86" Size="87843" PackHash="02b7d31ac32c2f3c4c7a387ddf6bce216cf1a0c4" PackOffset="1609903" />
<Blob Hash="e35984f3c27210d93ecafbed9ecd854a2e996c80" Size="4273" PackHash="029512b6ff1c8006f1f195911e683462057233dd" PackOffset="2089245" />
<Blob Hash="e35ad0bab25fd14554e61a0b2d6c7dc8bee43731" Size="11578" PackHash="8ea03172c5d4fbe9279a8c7b9cc50dfa375a1aa0" PackOffset="404212" />
<Blob Hash="e35b17bb3ae9b59f014b486611a470f650780f67" Size="49" PackHash="64e77b68b9da70c744bb4ca5e54a466e382f6a82" PackOffset="84113" />
<Blob Hash="e35e13731f886446b717d66189c0c0d57d226c99" Size="724" PackHash="bf6ccb8b8cb10a5dfa1a4c6e7c988496d81ee69d" PackOffset="1275814" />
<Blob Hash="e35fd5db36e0a233fde7da3938b05755ea5c9166" Size="780" PackHash="ec47a61c9e578fd55eb52d1035235a98b560b026" PackOffset="1927320" />
<Blob Hash="e36038955551218a7d20cff33509028131837220" Size="7088" PackHash="c6621899d3475934e8ad0050809ec5bda2c8bef5" PackOffset="1365478" />
@@ -171703,7 +171635,6 @@
<Blob Hash="e5d4f1694a92b30c1f3781b4b6143e2f64bff7d5" Size="100" PackHash="1d09bb4f8ba502cef13de6d570839e6790bf3542" PackOffset="2092984" />
<Blob Hash="e5d875816549e27d56a2233031f5d2de27b66b81" Size="19013" PackHash="f118465d04b72e12732573cc62461f653665860d" PackOffset="2075571" />
<Blob Hash="e5d8797438fda3d819a05b429836664f33519e27" Size="39076" PackHash="c3a4ce7861427e417e289e118620ba02ecec6995" PackOffset="776303" />
<Blob Hash="e5d985767c6fbf71877d36bcfde28d569ba42984" Size="11649" PackHash="3880691ae0333440e6b25c657426ff5042299fd6" PackOffset="550884" />
<Blob Hash="e5d99290711e94994dc3c3614469f4435a1dd2df" Size="127914" PackHash="7defac6fe7619f6d8f20d95340c2ac2694c89110" PackOffset="1474591" />
<Blob Hash="e5da2eeb25b468cca8577df1fa26fdf22ee33f89" Size="85136" PackHash="eef9411bc59ac8005fad9038ed07ed533e154e3c" PackOffset="1915241" />
<Blob Hash="e5db5aee8308bf47857379b99d308aeb9684cf3c" Size="6864" PackHash="c4b8d538071a0ad9faae137aa35dad4917c61dc9" PackOffset="872422" />
@@ -172391,7 +172322,6 @@
<Blob Hash="e888e840649bb8e38b990230a0da1641e986eda4" Size="21056" PackHash="bad3d27e656261f89d7bfe9409032b1623077a17" PackOffset="1140814" />
<Blob Hash="e888fed94b5440aa62db642370f605fee234ff63" Size="20" PackHash="02b7d31ac32c2f3c4c7a387ddf6bce216cf1a0c4" PackOffset="2097138" />
<Blob Hash="e88a6da2990f1b1fefee136a780997343e22d9b1" Size="739" PackHash="503b405bfba60246c4b666898c7ea3caa188e8bc" PackOffset="1751554" />
<Blob Hash="e88bde78ae80044f27fcc720be58991273498c54" Size="2822" PackHash="64e77b68b9da70c744bb4ca5e54a466e382f6a82" PackOffset="107994" />
<Blob Hash="e88d9a438cb23146ada929c902742d5f88e20d13" Size="4775" PackHash="c6a87a27121ee980a108fbacde92cb925b2682d0" PackOffset="256806" />
<Blob Hash="e88e39916056220de8b96ddf8f90bca820a5697c" Size="833312" PackHash="c25f4a3551beb8184f40aeeb1284dc2a18e923e3" PackOffset="8" />
<Blob Hash="e88e4212770c745f2df62bf086211a71c901d918" Size="6004" PackHash="2f143d8520d94bbf2cb250b35a8f79e3d3e8572c" PackOffset="992916" />
@@ -173145,7 +173075,6 @@
<Blob Hash="eb8324bc14fe53de5103a174f418e9f2801ce15e" Size="57291" PackHash="39012f70cdd225df24e4d1966c453e310b5ea17b" PackOffset="568738" />
<Blob Hash="eb83c42828b3b117e47a86b366ef43ddf0e0784b" Size="2419" PackHash="503b405bfba60246c4b666898c7ea3caa188e8bc" PackOffset="1765014" />
<Blob Hash="eb83cea4e074c80ec1ec704c77b2fa5fb96b3be0" Size="10756" PackHash="1356646e356a511f7a00dbedbbd67d1d541c3006" PackOffset="1481086" />
<Blob Hash="eb83fe2579bf7133044b65e029b0e416574acb3c" Size="10435" PackHash="3880691ae0333440e6b25c657426ff5042299fd6" PackOffset="540449" />
<Blob Hash="eb85740cc4c93421b1be7e72e23e659dc31b2e7c" Size="334614" PackHash="b26cc3a6ea189a1be57d1840484a450a7a1a71cf" PackOffset="8" />
<Blob Hash="eb86fce2c331ff379063426158eca5e993acddf1" Size="29596" PackHash="d953ecfef9407f2aa69cea95ea72e1e33e8d682c" PackOffset="2063395" />
<Blob Hash="eb87795b4ebfa73c0975edbc4ffed092f57987ab" Size="84992" PackHash="c8f0fb73de72f78da3146d3d4de8cf63a9ae40a7" PackOffset="471048" />
@@ -174199,7 +174128,6 @@
<Blob Hash="efa059846ce4e18d1c23254703eb3eea14512432" Size="527" PackHash="42d86201d951b9e75d0a14d6fbebedd1044becd6" PackOffset="820017" />
<Blob Hash="efa26afc7500909753d3634ba522f10ab8db292e" Size="108" PackHash="830cc93f966e96754b4b160b2d5ffbe64678ec80" PackOffset="1744584" />
<Blob Hash="efa2cead8394fd3300ead7996eecb0298a94d8b4" Size="127" PackHash="d34c7f438204350ea347c15f760dda671a96eb3e" PackOffset="905773" />
<Blob Hash="efa3bd07b276a1de6bba2fc5017e366308e10327" Size="5870" PackHash="3880691ae0333440e6b25c657426ff5042299fd6" PackOffset="532053" />
<Blob Hash="efa4a004c0abe72c9e3d6930c73c8ec5537ab6b0" Size="40448" PackHash="1f2b360ebbbec288aea0f5e51c7c0c2c0f45fb06" PackOffset="1536188" />
<Blob Hash="efa60bd69dee52af63dc9413104c22460766d16d" Size="1479" PackHash="96c3c92c563cf72675793d637167de50d5431ed6" PackOffset="1892076" />
<Blob Hash="efa68927fa388dc1999b854638f48645babe443c" Size="1744" PackHash="7ca0e1410f00142dc9791ff1fb493669e443f644" PackOffset="1379272" />
@@ -177993,7 +177921,6 @@
<Blob Hash="fefde738689db56276ac85508d24c0968d162dbe" Size="5401" PackHash="c6a87a27121ee980a108fbacde92cb925b2682d0" PackOffset="483663" />
<Blob Hash="fefe8bc86eeb9cb99200587900ad8299f4281d9f" Size="326398" PackHash="f79639e6af40ebfd7151a9712c580c350f39c736" PackOffset="1496244" />
<Blob Hash="fefeaf5078d461ffbc8747ab3d3b107baff53616" Size="697" PackHash="72092af7bb664227bd490ad562ae12701de7c0af" PackOffset="229050" />
<Blob Hash="fefed4021ac7ff9a2bff4eead68ce055dff63c5c" Size="1085" PackHash="64e77b68b9da70c744bb4ca5e54a466e382f6a82" PackOffset="162610" />
<Blob Hash="feff30a9be24936aa9472e01b8c4e32aec069c8d" Size="3171" PackHash="e458507f455e3bac9232d632426fc4b75f29841d" PackOffset="86253" />
<Blob Hash="feff3e1b759961018531bbb1c6d6beb21ab29f6b" Size="2174640" PackHash="2217ab563c0a5ceac49ca028b59beb33ecd610c8" PackOffset="8" />
<Blob Hash="feff88a671885a886e69826dcad628cd7334a014" Size="18580" PackHash="e7a4ddc64af2a43bf5c7d439244636d60a7dae07" PackOffset="293418" />
@@ -179220,7 +179147,6 @@
<Pack Hash="24a68fcde91e5a86f7f24c31e7b8b04cd8de95bb" Size="36421207" CompressedSize="36271360" RemotePath="UnrealEngine-15811247" />
<Pack Hash="24aac461ee54420b2fbb50c17fba330abdd085e0" Size="1966581" CompressedSize="600630" RemotePath="UnrealEngine-14331446-a7128bbcfe58418eb69de78154670ae7" />
<Pack Hash="24ac89a0d42d2080bc059af970502b47eb4726c2" Size="11346043" CompressedSize="11346644" RemotePath="UnrealEngine-9692409-6fc481a21386421ba64a912013e258f6" />
<Pack Hash="24bfaac8f7c8383bee6aa7d9a121c04936a321aa" Size="12458" CompressedSize="3435" RemotePath="UnrealEngine-17707154" />
<Pack Hash="24c0def54a06c1cbd6434a33a46ded2b79849ff8" Size="2094514" CompressedSize="329844" RemotePath="UnrealEngine-16488106" />
<Pack Hash="24c49e530b929002dc68150b60a6a39325aeb935" Size="2096887" CompressedSize="2038092" RemotePath="UnrealEngine-17461838" />
<Pack Hash="24c7985ab1852263521b8abf987c2d39efffa30c" Size="2097117" CompressedSize="714232" RemotePath="UnrealEngine-19069551" />
@@ -180897,7 +180823,6 @@
<Pack Hash="64983507437f8dd97a654c196466afa045fe3d72" Size="1067969" CompressedSize="904649" RemotePath="UnrealEngine-19341009" />
<Pack Hash="64b57fdeb7cad02e8a8e96cbf589a7070aeffa6b" Size="3169840" CompressedSize="947203" RemotePath="UnrealEngine-20025185" />
<Pack Hash="64e6500f81a09bc51a922757ee64622fcbf27d44" Size="6191372" CompressedSize="4855000" RemotePath="UnrealEngine-20540173" />
<Pack Hash="64e77b68b9da70c744bb4ca5e54a466e382f6a82" Size="165800" CompressedSize="36488" RemotePath="UnrealEngine-17552100" />
<Pack Hash="64f8a861ea0499b2ce969a0970e024d43314522e" Size="393272" CompressedSize="178050" RemotePath="UnrealEngine-3475008-232a0956b5a843a7abdea45711737ba6" />
<Pack Hash="6536e8d0d8170fee4b42e4fbe1cc1b551d00d0e3" Size="14960" CompressedSize="4924" RemotePath="UnrealEngine-18779711" />
<Pack Hash="6542cd3ea504b5d2f8f34c2e0b651089469ecae4" Size="3355552" CompressedSize="1445228" RemotePath="UnrealEngine-21187004" />
@@ -182717,7 +182642,6 @@
<Pack Hash="ad24fc50075c965ef9f1c901dfa309982442eab2" Size="2575" CompressedSize="1183" RemotePath="UnrealEngine-18826675" />
<Pack Hash="ad2fb8e24d847ebdbf707a2ba885e26579870aca" Size="5826594" CompressedSize="938038" RemotePath="UnrealEngine-3806814-f624a67e47784f4686bc261b5bcef57e" />
<Pack Hash="ad3a0c2e82833422b33af244797ea9a6becba4ea" Size="2047337" CompressedSize="1461390" RemotePath="UnrealEngine-6731697-b746bb0e6db1420284bcec5ba146c63c" />
<Pack Hash="ad3ea5550a8c0939e78c1eaba21d6dd5418b857c" Size="16694" CompressedSize="4100" RemotePath="UnrealEngine-18595189" />
<Pack Hash="ad4207783212636370be585632e4c55891407859" Size="2097072" CompressedSize="1311453" RemotePath="3129012-bf28ea8994bb4040ae9adb152d6eb9ff" />
<Pack Hash="ad72122e90301ddf6efef3f63f8de0c1022110a0" Size="980960" CompressedSize="382721" RemotePath="UnrealEngine-15643714" />
<Pack Hash="ad79485db78dd448bb1f02e52dcd035ee6c08b63" Size="1953190" CompressedSize="1654396" RemotePath="UnrealEngine-19187677" />
@@ -182988,7 +182912,6 @@
<Pack Hash="b8b03ed705ac42d0e155acab3df4b27673c5c250" Size="2817136" CompressedSize="642375" RemotePath="UnrealEngine-20435886" />
<Pack Hash="b8ce38ffe9d4d7ced4cd392a12f4c83b3dcb9620" Size="73165" CompressedSize="14181" RemotePath="UnrealEngine-20190380" />
<Pack Hash="b8e275e3fab29e19966da69498a0f8bed1fe2ebb" Size="2081110" CompressedSize="637763" RemotePath="UnrealEngine-20025185" />
<Pack Hash="b8f2c32e7c73de6451e0a6195af9c5f364098913" Size="19024" CompressedSize="4908" RemotePath="UnrealEngine-18574164" />
<Pack Hash="b8f4d2d78e9de6d3619fc992e020b221ca5ea155" Size="2034168" CompressedSize="1872465" RemotePath="UnrealEngine-16211397" />
<Pack Hash="b8fb57cd0d1b8c257d13742b7d8d66c1abc283df" Size="2097147" CompressedSize="934315" RemotePath="UnrealEngine-21183868" />
<Pack Hash="b8fba9e46df63833b7031d3cd186e6ac32af7f58" Size="2256809" CompressedSize="663286" RemotePath="UnrealEngine-3608256-d9539c83975244ee8f4a762811472973" />
@@ -184473,7 +184396,6 @@
<Pack Hash="f57ff8d00e9c9731f4603a0fd1d42bdfb44c441e" Size="5139320" CompressedSize="680893" RemotePath="UnrealEngine-17982188" />
<Pack Hash="f58042cd04267777279a2c267abccc99e90d215a" Size="7383" CompressedSize="3917" RemotePath="UnrealEngine-9732635-f0eb47bd92464819828b9f87155b8c8f" />
<Pack Hash="f59134a3a03b0513219b2e0a6c95e383f4f13ded" Size="2096184" CompressedSize="679613" RemotePath="UnrealEngine-21183868" />
<Pack Hash="f598247c962f585ed82f401b3af1e0b0c9918de0" Size="7457334" CompressedSize="6958050" RemotePath="UnrealEngine-19746024" />
<Pack Hash="f5a3b350622172d049044319cbd6171dde7cbabf" Size="2095819" CompressedSize="383026" RemotePath="UnrealEngine-14607312-eb24ed9068ec4fcf9356847d2cf54f91" />
<Pack Hash="f5afbf7abcf77972aee12be2b84779a385983b9d" Size="6701" CompressedSize="4011" RemotePath="UnrealEngine-3544050-a35a60a731c541f18de8bd576ac4c527" />
<Pack Hash="f5bb81dbbe73b44c78ffc40a6fd55dabd3a91ca8" Size="312756344" CompressedSize="80143886" RemotePath="UnrealEngine-20471725" />

View File

@@ -1,51 +0,0 @@
{
"FileVersion": 3,
"Version": 1,
"VersionName": "0.2",
"FriendlyName": "ML Deformer Legacy Vertex Delta Model",
"Description": "Legacy Vertex Delta Model for the ML Deformer Framework",
"Category": "Animation",
"CreatedBy": "Epic Games, Inc.",
"CreatedByURL": "http://epicgames.com",
"DocsURL": "https://docs.unrealengine.com/5.0/en-US/using-the-machine-learning-deformer-in-unreal-engine/",
"MarketplaceURL": "",
"SupportURL": "https://forums.unrealengine.com/",
"CanContainContent": true,
"IsBetaVersion": false,
"IsExperimentalVersion": true,
"Installed": false,
"Modules": [
{
"Name": "LegacyVertexDeltaModel",
"Type": "Runtime",
"LoadingPhase": "Default"
},
{
"Name": "LegacyVertexDeltaModelEditor",
"Type": "Editor",
"LoadingPhase": "Default"
}
],
"Plugins": [
{
"Name": "GeometryCache",
"Enabled": true
},
{
"Name": "NeuralNetworkInference",
"Enabled": true
},
{
"Name": "Optimus",
"Enabled": true
},
{
"Name": "PythonFoundationPackages",
"Enabled": true
},
{
"Name": "MLDeformerFramework",
"Enabled": true
}
]
}

View File

@@ -1,25 +0,0 @@
// Copyright Epic Games, Inc. All Rights Reserved.
#include "/Plugin/ComputeFramework/Private/ComputeKernelCommon.ush"
uint DI_LOCAL(NumVertices);
uint DI_LOCAL(InputStreamStart);
float3 DI_LOCAL(VertexDeltaScale);
float3 DI_LOCAL(VertexDeltaMean);
float DI_LOCAL(Weight);
Buffer<float> DI_LOCAL(PositionDeltaBuffer);
Buffer<uint> DI_LOCAL(VertexMapBuffer);
DI_IMPL_READ(ReadNumVertices, uint, void)
{
return DI_LOCAL(NumVertices);
}
DI_IMPL_READ(ReadPositionDelta, float3, uint VertexIndex)
{
uint BufferIndex = DI_LOCAL(VertexMapBuffer)[VertexIndex + DI_LOCAL(InputStreamStart)] * 3;
float3 Delta = float3(DI_LOCAL(PositionDeltaBuffer)[BufferIndex], DI_LOCAL(PositionDeltaBuffer)[BufferIndex + 1], DI_LOCAL(PositionDeltaBuffer)[BufferIndex + 2]);
float3 FinalDelta = Delta * DI_LOCAL(VertexDeltaScale) + DI_LOCAL(VertexDeltaMean);
return FinalDelta * DI_LOCAL(Weight);
}

View File

@@ -1,58 +0,0 @@
// Copyright Epic Games, Inc. All Rights Reserved.
using UnrealBuildTool;
public class LegacyVertexDeltaModel : ModuleRules
{
public LegacyVertexDeltaModel(ReadOnlyTargetRules Target) : base(Target)
{
PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs;
PublicIncludePaths.AddRange(
new string[] {
// ... add public include paths required here ...
}
);
PrivateIncludePaths.AddRange(
new string[] {
// ... add other private include paths required here ...
}
);
PublicDependencyModuleNames.AddRange(
new string[]
{
"Core"
// ... add other public dependencies that you statically link with here ...
}
);
PrivateDependencyModuleNames.AddRange(
new string[]
{
"ComputeFramework",
"CoreUObject",
"Engine",
"GeometryCache",
"NeuralNetworkInference",
"OptimusCore",
"Projects",
"RenderCore",
"RHI",
"MLDeformerFramework"
}
);
DynamicallyLoadedModuleNames.AddRange(
new string[]
{
// ... add any modules that your module loads dynamically here ...
}
);
}
}

View File

@@ -1,55 +0,0 @@
// Copyright Epic Games, Inc. All Rights Reserved.
#include "LegacyVertexDeltaModel.h"
#include "LegacyVertexDeltaModelVizSettings.h"
#include "MLDeformerGeomCacheHelpers.h"
#include "UObject/Object.h"
#define LOCTEXT_NAMESPACE "ULegacyVertexDeltaModel"
ULegacyVertexDeltaModel::ULegacyVertexDeltaModel(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
#if WITH_EDITORONLY_DATA
VizSettings = ObjectInitializer.CreateEditorOnlyDefaultSubobject<ULegacyVertexDeltaModelVizSettings>(this, TEXT("VizSettings"));
#endif
}
#if WITH_EDITOR
void ULegacyVertexDeltaModel::UpdateNumTargetMeshVertices()
{
NumTargetMeshVerts = UE::MLDeformer::ExtractNumImportedGeomCacheVertices(GeometryCache);
}
#endif // WITH_EDITOR
#if WITH_EDITORONLY_DATA
void ULegacyVertexDeltaModel::SampleGroundTruthPositions(float SampleTime, TArray<FVector3f>& OutPositions)
{
ULegacyVertexDeltaModelVizSettings* VertexVizSettings = Cast<ULegacyVertexDeltaModelVizSettings>(VizSettings);
check(VertexVizSettings);
UGeometryCache* GeomCache = VertexVizSettings->GetTestGroundTruth();
if (GeomCache == nullptr)
{
OutPositions.Reset();
return;
}
if (MeshMappings.IsEmpty())
{
TArray<FString> FailedImportedMeshnames;
TArray<FString> VertexMisMatchNames;
GenerateGeomCacheMeshMappings(SkeletalMesh, GeomCache, MeshMappings, FailedImportedMeshnames, VertexMisMatchNames);
}
UE::MLDeformer::SampleGeomCachePositions(
0,
SampleTime,
MeshMappings,
SkeletalMesh,
GeomCache,
AlignmentTransform,
OutPositions);
}
#endif
#undef LOCTEXT_NAMESPACE

View File

@@ -1,54 +0,0 @@
// Copyright Epic Games, Inc. All Rights Reserved.
#include "LegacyVertexDeltaModelDataInterface.h"
#include "LegacyVertexDeltaModel.h"
#include "MLDeformerModelInstance.h"
#include "MLDeformerAsset.h"
#include "MLDeformerComponent.h"
#include "Components/SkeletalMeshComponent.h"
#include "ComputeFramework/ComputeKernelPermutationSet.h"
#include "ComputeFramework/ShaderParamTypeDefinition.h"
#include "OptimusDataDomain.h"
#include "RenderGraphBuilder.h"
#include "RenderGraphUtils.h"
#include "RenderGraphResources.h"
#include "ShaderParameterMetadataBuilder.h"
#include "SkeletalRenderPublic.h"
BEGIN_SHADER_PARAMETER_STRUCT(FLegacyVertexDeltaModelDataInterfaceParameters,)
MLDEFORMER_SHADER_PARAMETERS()
SHADER_PARAMETER(FVector3f, VertexDeltaScale)
SHADER_PARAMETER(FVector3f, VertexDeltaMean)
END_SHADER_PARAMETER_STRUCT()
MLDEFORMER_GRAPH_IMPLEMENT_BASICS(
ULegacyVertexDeltaModelDataInterface,
ULegacyVertexDeltaModelDataProvider,
UE::LegacyVertexDeltaModel::FLegacyVertexDeltaModelDataProviderProxy,
FLegacyVertexDeltaModelDataInterfaceParameters,
TEXT("#include \"/Plugin/LegacyVertexDeltaModel/Private/LegacyVertexDeltaModelDataInterface.ush\"\n"),
TEXT("Legacy Vertex Delta Model"))
namespace UE::LegacyVertexDeltaModel
{
FLegacyVertexDeltaModelDataProviderProxy::FLegacyVertexDeltaModelDataProviderProxy(UMLDeformerComponent* DeformerComponent)
: UE::MLDeformer::FMLDeformerGraphDataProviderProxy(DeformerComponent)
{
const UMLDeformerModel* Model = DeformerComponent->GetDeformerAsset()->GetModel();
const ULegacyVertexDeltaModel* VertexDeltaModel = Cast<ULegacyVertexDeltaModel>(Model);
if (ensure(VertexDeltaModel))
{
VertexDeltaScale = static_cast<FVector3f>(VertexDeltaModel->GetVertexDeltaScale());
VertexDeltaMean = static_cast<FVector3f>(VertexDeltaModel->GetVertexDeltaMean());
}
}
void FLegacyVertexDeltaModelDataProviderProxy::GatherDispatchData(FDispatchSetup const& InDispatchSetup, FCollectedDispatchData& InOutDispatchData)
{
MLDEFORMER_GRAPH_DISPATCH_START(FLegacyVertexDeltaModelDataInterfaceParameters, InDispatchSetup, InOutDispatchData)
MLDEFORMER_GRAPH_DISPATCH_DEFAULT_PARAMETERS()
Parameters->VertexDeltaScale = VertexDeltaScale;
Parameters->VertexDeltaMean = VertexDeltaMean;
MLDEFORMER_GRAPH_DISPATCH_END()
}
} // namespace UE::LegacyVertexDeltaModel

View File

@@ -1,25 +0,0 @@
// Copyright Epic Games, Inc. All Rights Reserved.
#include "LegacyVertexDeltaModelModule.h"
#include "Modules/ModuleManager.h"
#include "Interfaces/IPluginManager.h"
#include "Misc/Paths.h"
#include "ShaderCore.h"
LEGACYVERTEXDELTAMODEL_API DEFINE_LOG_CATEGORY(LogLegacyVertexDeltaModel)
#define LOCTEXT_NAMESPACE "LegacyVertexDeltaModelModule"
IMPLEMENT_MODULE(UE::LegacyVertexDeltaModel::FLegacyVertexDeltaModelModule, LegacyVertexDeltaModel)
namespace UE::LegacyVertexDeltaModel
{
void FLegacyVertexDeltaModelModule::StartupModule()
{
// Register an additional shader path for our shaders used inside the deformer graph system.
const FString PluginShaderDir = FPaths::Combine(IPluginManager::Get().FindPlugin(TEXT("LegacyVertexDeltaModel"))->GetBaseDir(), TEXT("Shaders"));
AddShaderSourceDirectoryMapping(TEXT("/Plugin/LegacyVertexDeltaModel"), PluginShaderDir);
}
} // namespace UE::LegacyVertexDeltaModel
#undef LOCTEXT_NAMESPACE

View File

@@ -1,126 +0,0 @@
// Copyright Epic Games, Inc. All Rights Reserved.
#include "CoreMinimal.h"
#include "Misc/AutomationTest.h"
#if WITH_DEV_AUTOMATION_TESTS
#include "LegacyVertexDeltaModelModule.h"
#include "LegacyVertexDeltaModel.h"
#include "LegacyVertexDeltaModelVizSettings.h"
#include "MLDeformerAsset.h"
#include "MLDeformerComponent.h"
#include "MLDeformerModelInstance.h"
#include "MLDeformerGeomCacheHelpers.h"
#include "UObject/GCObjectScopeGuard.h"
#include "PreviewScene.h"
#include "Components/SkeletalMeshComponent.h"
#include "NeuralNetwork.h"
#include "GeometryCache.h"
#include "Engine/SkeletalMesh.h"
#include "Rendering/SkeletalMeshModel.h"
#include "Rendering/SkeletalMeshLODModel.h"
namespace UE::LegacyVertexDeltaModelTests
{
IMPLEMENT_SIMPLE_AUTOMATION_TEST(FLegacyVertexDeltaModelMainTest, "MLDeformer.LegacyVertexDeltaModel.MainTest", EAutomationTestFlags::ApplicationContextMask | EAutomationTestFlags::EngineFilter);
bool FLegacyVertexDeltaModelMainTest::RunTest(const FString& Parameters)
{
using namespace UE::MLDeformer;
using namespace UE::LegacyVertexDeltaModel;
UMLDeformerAsset* DeformerAsset = LoadObject<UMLDeformerAsset>(nullptr, TEXT("MLDeformerAsset'/LegacyVertexDeltaModel/Tests/Biceps/biceps_mld.biceps_mld'"));
UTEST_NOT_NULL(TEXT("MLDeformerAsset load"), DeformerAsset);
FGCObjectScopeGuard Guard(DeformerAsset);
ULegacyVertexDeltaModel* VertexDeltaModel = Cast<ULegacyVertexDeltaModel>(DeformerAsset->GetModel());
UTEST_NOT_NULL(TEXT("LegacyVertexDeltaModel load check"), VertexDeltaModel);
UNeuralNetwork* NeuralNet = VertexDeltaModel->GetNeuralNetwork();
UTEST_NOT_NULL(TEXT("Neuralnet check"), NeuralNet);
UMLDeformerInputInfo* InputInfo = VertexDeltaModel->GetInputInfo();
UTEST_NOT_NULL(TEXT("InputInfo check"), InputInfo);
const int64 NumInputInfoInputs = InputInfo->CalcNumNeuralNetInputs();
const int64 NumNetworkInputs = NeuralNet->GetInputTensor().Num();
UTEST_EQUAL(TEXT("InputInfo input count check"), NumInputInfoInputs, NumNetworkInputs);
const int32 NumInputBones = InputInfo->GetNumBones();
UTEST_EQUAL(TEXT("InputInfo bone count check"), NumInputBones, 1);
UTEST_EQUAL(TEXT("InputInfo bone name string check"), InputInfo->GetBoneNameStrings().Num(), 1);
UTEST_EQUAL(TEXT("InputInfo bone name string content check"), InputInfo->GetBoneNameString(0), FString("lowerarm_l"));
UTEST_EQUAL(TEXT("InputInfo bone names check"), InputInfo->GetBoneNames().Num(), 1);
UTEST_EQUAL(TEXT("InputInfo bone names content check"), InputInfo->GetBoneName(0), FName("lowerarm_l"));
UTEST_EQUAL(TEXT("InputInfo vertex count check"), InputInfo->GetNumBaseMeshVertices(), InputInfo->GetNumTargetMeshVertices());
const FVertexMapBuffer& VertexMapBuffer = VertexDeltaModel->GetVertexMapBuffer();
UTEST_TRUE(TEXT("VertexMapBuffer check"), VertexMapBuffer.IsInitialized());
#if WITH_EDITORONLY_DATA
USkeletalMesh* SkeletalMesh = VertexDeltaModel->GetSkeletalMesh();
UTEST_NOT_NULL(TEXT("SkeletalMesh check"), SkeletalMesh);
UTEST_TRUE(TEXT("Model vs Network compatible check"), VertexDeltaModel->GetInputInfo()->IsCompatible(SkeletalMesh));
UGeometryCache* GeomCache = VertexDeltaModel->GetGeometryCache();
UTEST_NOT_NULL(TEXT("GeomCache check"), GeomCache);
const FSkeletalMeshModel* ImportedModel = SkeletalMesh->GetImportedModel();
UTEST_NOT_NULL(TEXT("ImportedModel check"), ImportedModel);
const TArray<int32>& VertexMap = VertexDeltaModel->GetVertexMap();
UTEST_EQUAL(TEXT("VertexMap size check"), VertexMap.Num(), ImportedModel->LODModels[0].NumVertices);
const int32 NumBaseMeshVerts = UMLDeformerModel::ExtractNumImportedSkinnedVertices(SkeletalMesh);
const int32 NumGeomCacheVerts = ExtractNumImportedGeomCacheVertices(GeomCache);
UTEST_EQUAL(TEXT("VertexCount check"), NumBaseMeshVerts, NumGeomCacheVerts);
UTEST_EQUAL(TEXT("Model SkelMesh VertexCount check"), VertexDeltaModel->GetNumBaseMeshVerts(), NumBaseMeshVerts);
UTEST_EQUAL(TEXT("Model TargetMesh VertexCount check"), VertexDeltaModel->GetNumTargetMeshVerts(), NumGeomCacheVerts);
const int64 NumNetworkOutputs = NeuralNet->GetOutputTensor().Num();
const int64 ExpectedNetworkOutput = NumGeomCacheVerts * 3; // 3 floats per vertex.
UTEST_EQUAL(TEXT("NeuralNet output size check"), NumNetworkOutputs, ExpectedNetworkOutput);
UTEST_EQUAL(TEXT("Loss function check"), VertexDeltaModel->GetLossFunction(), ELegacyVertexDeltaModelLossFunction::L1);
UTEST_EQUAL(TEXT("Activation function check"), VertexDeltaModel->GetActivationFunction(), ELegacyVertexDeltaModelActivationFunction::LRelu);
UTEST_EQUAL(TEXT("Hidden Layers check"), VertexDeltaModel->GetNumHiddenLayers(), 2);
ULegacyVertexDeltaModelVizSettings* VizSettings = Cast<ULegacyVertexDeltaModelVizSettings>(VertexDeltaModel->GetVizSettings());
UTEST_NOT_NULL(TEXT("VizSettings check"), VizSettings);
// Create a preview scene and spawn an actor.
TUniquePtr<FPreviewScene> PreviewScene = MakeUnique<FPreviewScene>(FPreviewScene::ConstructionValues());
UWorld* World = PreviewScene->GetWorld();
UTEST_NOT_NULL(TEXT("World check"), World);
FActorSpawnParameters SpawnParams;
SpawnParams.Name = MakeUniqueObjectName(World, AActor::StaticClass(), FName(TEXT("ML Deformer Test Actor")));
AActor* Actor = World->SpawnActor<AActor>(SpawnParams);
Actor->SetFlags(RF_Transient);
UTEST_NOT_NULL(TEXT("Actor check"), Actor);
// Add a skeletal mesh component.
USkeletalMeshComponent* SkelMeshComponent = NewObject<USkeletalMeshComponent>(Actor);
SkelMeshComponent->SetSkeletalMesh(SkeletalMesh);
Actor->SetRootComponent(SkelMeshComponent);
SkelMeshComponent->RegisterComponent();
// Add an ML Deformer component and activate it.
UMLDeformerComponent* MLDeformerComponent = NewObject<UMLDeformerComponent>(Actor);
MLDeformerComponent->SetDeformerAsset(DeformerAsset);
MLDeformerComponent->RegisterComponent();
MLDeformerComponent->Activate();
UTEST_EQUAL(TEXT("MLDeformerComponent weight check"), MLDeformerComponent->GetWeight(), 1.0f);
UTEST_TRUE(TEXT("MLDeformerComponent SkelMeshComponent check"), MLDeformerComponent->GetSkeletalMeshComponent() == SkelMeshComponent);
// Create and init the model instance.
UMLDeformerModelInstance* ModelInstance = MLDeformerComponent->GetModelInstance();
UTEST_NOT_NULL(TEXT("CreateModelInstance check"), ModelInstance);
UTEST_TRUE(TEXT("ModelInstance GetModel check"), ModelInstance->GetModel() == VertexDeltaModel);
UTEST_TRUE(TEXT("ModelInstance compatible check"), ModelInstance->IsCompatible());
#endif // WITH_EDITORONLY_DATA
return true;
}
} // namespace UE::LegacyVertexDeltaModelTests
#endif // #if WITH_DEV_AUTOMATION_TESTS

View File

@@ -1,139 +0,0 @@
// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "MLDeformerModel.h"
#include "MLDeformerVizSettings.h"
#include "MLDeformerInputInfo.h"
#include "MLDeformerGeomCacheHelpers.h"
#include "UObject/Object.h"
#include "LegacyVertexDeltaModel.generated.h"
class USkeletalMesh;
class UGeometryCache;
class UAnimSequence;
class UNeuralNetwork;
class UMLDeformerAsset;
class USkeleton;
class IPropertyHandle;
/** The activation function to use during the ML Deformer training process. */
UENUM()
enum class ELegacyVertexDeltaModelActivationFunction : uint8
{
Relu,
LRelu,
Tanh
};
/** The loss function to use during the ML Deformer training process. */
UENUM()
enum class ELegacyVertexDeltaModelLossFunction : uint8
{
L1,
MSE,
Shrinkage
};
UCLASS()
class LEGACYVERTEXDELTAMODEL_API ULegacyVertexDeltaModel
: public UMLDeformerModel
{
GENERATED_BODY()
public:
ULegacyVertexDeltaModel(const FObjectInitializer& ObjectInitializer);
// UMLDeformerModel overrides.
virtual FString GetDisplayName() const override { return "Legacy Vertex Delta Model"; }
#if WITH_EDITORONLY_DATA
virtual bool HasTrainingGroundTruth() const override { return (GeometryCache.Get() != nullptr); }
virtual void SampleGroundTruthPositions(float SampleTime, TArray<FVector3f>& OutPositions) override;
#endif
#if WITH_EDITOR
virtual void UpdateNumTargetMeshVertices();
#endif
// ~END UMLDeformerModel overrides.
const FVector& GetVertexDeltaMean() const { return VertexDeltaMean; }
const FVector& GetVertexDeltaScale() const { return VertexDeltaScale; }
#if WITH_EDITORONLY_DATA
const UGeometryCache* GetGeometryCache() const { return GeometryCache; }
UGeometryCache* GetGeometryCache() { return GeometryCache; }
ELegacyVertexDeltaModelLossFunction GetLossFunction() const { return LossFunction; }
ELegacyVertexDeltaModelActivationFunction GetActivationFunction() const { return ActivationFunction; }
int32 GetNumHiddenLayers() const { return NumHiddenLayers; }
int32 GetNumNeuronsPerLayer() const { return NumNeuronsPerLayer; }
int32 GetNumEpochs() const { return Epochs; }
int32 GetBatchSize() const { return BatchSize; }
float GetLearningRate() const { return LearningRate; }
float GetShrinkageSpeed() const { return ShrinkageSpeed; }
float GetShrinkageThrehsold() const { return ShrinkageThreshold; }
int32 GetMaxCacheSizeGB() const { return MaxCacheSizeGB; }
TArray<UE::MLDeformer::FMLDeformerGeomCacheMeshMapping>& GetGeomCacheMeshMappings() { return MeshMappings; }
const TArray<UE::MLDeformer::FMLDeformerGeomCacheMeshMapping>& GetGeomCacheMeshMappings() const { return MeshMappings; }
#endif
public:
/** The vertex delta mean. This is passed to the deformer shader to reconstruct the correct output deltas. */
UPROPERTY()
FVector VertexDeltaMean = FVector::ZeroVector;
/** The vertex delta scale. This is passed to the deformer shader to rescale the output deltas. */
UPROPERTY()
FVector VertexDeltaScale = FVector::OneVector;
#if WITH_EDITORONLY_DATA
TArray<UE::MLDeformer::FMLDeformerGeomCacheMeshMapping> MeshMappings;
/** The geometry cache that represents the complex mesh deformations. */
UPROPERTY(EditAnywhere, Category = "Target Mesh")
TObjectPtr<UGeometryCache> GeometryCache = nullptr;
/** The number of hidden layers that the neural network model will have.\nHigher numbers will slow down performance but can deal with more complex deformations. */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Training Settings", meta = (ClampMin = "1", ClampMax = "10"))
int32 NumHiddenLayers = 2;
/** The number of units/neurons per hidden layer. Higher numbers will slow down performance but allow for more complex mesh deformations. */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Training Settings", meta = (ClampMin = "1"))
int32 NumNeuronsPerLayer = 256;
/** The number of epochs to process without any decay. */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Training Settings", meta = (ClampMin = "1"))
int32 Epochs = 20;
/** The number of frames per batch when training the model. */
UPROPERTY(EditAnywhere, BlueprintReadWrite, AdvancedDisplay, Category = "Training Settings", meta = (ClampMin = "1"))
int32 BatchSize = 128;
/** The learning rate used during the model training. */
UPROPERTY(EditAnywhere, BlueprintReadWrite, AdvancedDisplay, Category = "Training Settings", meta = (ClampMin = "0.000001", ClampMax = "1.0"))
float LearningRate = 0.00175f;
/** The activation function to use in the neural network. */
UPROPERTY(EditAnywhere, BlueprintReadWrite, AdvancedDisplay, Category = "Training Settings")
ELegacyVertexDeltaModelActivationFunction ActivationFunction = ELegacyVertexDeltaModelActivationFunction::LRelu;
/** The loss function to use during model training. */
UPROPERTY(EditAnywhere, BlueprintReadWrite, AdvancedDisplay, Category = "Training Settings")
ELegacyVertexDeltaModelLossFunction LossFunction = ELegacyVertexDeltaModelLossFunction::L1;
/** Shrinkage speed. Only if the shrinkage loss is used. */
UPROPERTY(EditAnywhere, BlueprintReadWrite, AdvancedDisplay, Category = "Training Settings", meta = (ClampMin = "1.0", ClampMax = "1000.0"))
float ShrinkageSpeed = 10.0f;
/** Shrinkage threshold. Only if the shrinkage loss is used. */
UPROPERTY(EditAnywhere, BlueprintReadWrite, AdvancedDisplay, Category = "Training Settings", meta = (ClampMin = "0.0"))
float ShrinkageThreshold = 0.1f;
/**
* The maximum allowed size of the training cache in memory, in gigabytes.
* So a value of 4 would use a maximum of four gigabyte of system memory.
* The larger the cache size the faster the training.
*/
UPROPERTY(EditAnywhere, BlueprintReadWrite, AdvancedDisplay, Category = "Training Settings", DisplayName = "Max Cache Size", meta = (ClampMin = "0", ForceUnits = "Gigabytes"))
int32 MaxCacheSizeGB = 4; // 4 Gigabyte
#endif // WITH_EDITORONLY_DATA
};

View File

@@ -1,69 +0,0 @@
// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "MLDeformerGraphDataInterface.h"
#include "OptimusComputeDataInterface.h"
#include "ComputeFramework/ComputeDataProvider.h"
#include "LegacyVertexDeltaModelDataInterface.generated.h"
class FRDGBuffer;
class FRDGBufferSRV;
class FRHIShaderResourceView;
class FSkeletalMeshObject;
class UMLDeformerComponent;
class UNeuralNetwork;
class USkeletalMeshComponent;
class UMLDeformerModel;
/** Compute Framework Data Interface for MLDefomer data. */
UCLASS(Category = ComputeFramework)
class LEGACYVERTEXDELTAMODEL_API ULegacyVertexDeltaModelDataInterface
: public UMLDeformerGraphDataInterface
{
GENERATED_BODY()
public:
// UOptimusComputeDataInterface overrides.
virtual FString GetDisplayName() const override;
// ~END UOptimusComputeDataInterface overrides.
// UComputeDataInterface overrides.
virtual void GetShaderParameters(TCHAR const* UID, FShaderParametersMetadataBuilder& InOutBuilder, FShaderParametersMetadataAllocations& InOutAllocations) const override;
virtual void GetHLSL(FString& OutHLSL) const override;
virtual UComputeDataProvider* CreateDataProvider(TObjectPtr<UObject> InBinding, uint64 InInputMask, uint64 InOutputMask) const override;
// ~END UComputeDataInterface overrides.
};
/** Compute Framework Data Provider for MLDeformer data. */
UCLASS(BlueprintType, EditInlineNew, Category = ComputeFramework)
class LEGACYVERTEXDELTAMODEL_API ULegacyVertexDeltaModelDataProvider
: public UMLDeformerGraphDataProvider
{
GENERATED_BODY()
public:
// UComputeDataProvider overrides.
virtual FComputeDataProviderRenderProxy* GetRenderProxy() override;
// ~END UComputeDataProvider overrides.
};
namespace UE::LegacyVertexDeltaModel
{
/** Compute Framework Data Provider Proxy for MLDeformer data. */
class LEGACYVERTEXDELTAMODEL_API FLegacyVertexDeltaModelDataProviderProxy
: public UE::MLDeformer::FMLDeformerGraphDataProviderProxy
{
public:
FLegacyVertexDeltaModelDataProviderProxy(UMLDeformerComponent* DeformerComponent);
// FComputeDataProviderRenderProxy overrides.
virtual void GatherDispatchData(FDispatchSetup const& InDispatchSetup, FCollectedDispatchData& InOutDispatchData) override;
// ~END FComputeDataProviderRenderProxy overrides.
private:
FVector3f VertexDeltaScale = FVector3f(1.0f, 1.0f, 1.0f);
FVector3f VertexDeltaMean = FVector3f(0.0f, 0.0f, 0.0f);
};
} // namespace UE::LegacyVertexDeltaModel

View File

@@ -1,20 +0,0 @@
// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "Modules/ModuleManager.h"
LEGACYVERTEXDELTAMODEL_API DECLARE_LOG_CATEGORY_EXTERN(LogLegacyVertexDeltaModel, Log, All);
namespace UE::LegacyVertexDeltaModel
{
class LEGACYVERTEXDELTAMODEL_API FLegacyVertexDeltaModelModule
: public IModuleInterface
{
public:
// IModuleInterface overrides.
virtual void StartupModule() override;
// ~END IModuleInterface overrides.
};
} // namespace UE::LegacyVertexDeltaModel

View File

@@ -1,31 +0,0 @@
// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "UObject/Object.h"
#include "MLDeformerVizSettings.h"
#include "LegacyVertexDeltaModelVizSettings.generated.h"
class UGeometryCache;
/**
* The vizualization settings specific to the the vertex delta model.
*/
UCLASS()
class LEGACYVERTEXDELTAMODEL_API ULegacyVertexDeltaModelVizSettings
: public UMLDeformerVizSettings
{
GENERATED_BODY()
public:
#if WITH_EDITORONLY_DATA
virtual bool HasTestGroundTruth() const override { return (GroundTruth.Get() != nullptr); }
UGeometryCache* GetTestGroundTruth() const { return GroundTruth; }
public:
/** The geometry cache that represents the ground truth of the test anim sequence. */
UPROPERTY(EditAnywhere, Category = "Test Assets")
TObjectPtr<UGeometryCache> GroundTruth = nullptr;
#endif // WITH_EDITORONLY_DATA
};

View File

@@ -1,47 +0,0 @@
// Copyright Epic Games, Inc. All Rights Reserved.
using System.IO;
namespace UnrealBuildTool.Rules
{
public class LegacyVertexDeltaModelEditor : ModuleRules
{
public LegacyVertexDeltaModelEditor(ReadOnlyTargetRules Target) : base(Target)
{
PublicDependencyModuleNames.AddRange(
new string[]
{
"Core"
}
);
PrivateDependencyModuleNames.AddRange(
new string[]
{
"EditorFramework",
"UnrealEd",
"CoreUObject",
"Engine",
"Slate",
"SlateCore",
"EditorWidgets",
"EditorStyle",
"GeometryCache",
"MLDeformerFramework",
"MLDeformerFrameworkEditor",
"LegacyVertexDeltaModel",
"PropertyEditor",
"NeuralNetworkInference",
"ToolWidgets",
"ComputeFramework"
}
);
PrivateIncludePathModuleNames.AddRange(
new string[]
{
}
);
}
}
}

View File

@@ -1,296 +0,0 @@
// Copyright Epic Games, Inc. All Rights Reserved.
#include "LegacyVertexDeltaEditorModel.h"
#include "LegacyVertexDeltaModel.h"
#include "LegacyVertexDeltaModelVizSettings.h"
#include "LegacyVertexDeltaTrainingModel.h"
#include "LegacyVertexDeltaEditorModelActor.h"
#include "MLDeformerEditorToolkit.h"
#include "MLDeformerEditorStyle.h"
#include "MLDeformerInputInfo.h"
#include "MLDeformerGeomCacheSampler.h"
#include "MLDeformerGeomCacheHelpers.h"
#include "GeometryCache.h"
#include "GeometryCacheComponent.h"
#include "Animation/DebugSkelMeshComponent.h"
#include "Rendering/SkeletalMeshModel.h"
#include "Rendering/SkeletalMeshLODModel.h"
#include "Engine/SkeletalMesh.h"
#define LOCTEXT_NAMESPACE "LegacyVertexDeltaEditorModel"
namespace UE::LegacyVertexDeltaModel
{
using namespace UE::MLDeformer;
FMLDeformerEditorModel* FLegacyVertexDeltaEditorModel::MakeInstance()
{
return new FLegacyVertexDeltaEditorModel();
}
void FLegacyVertexDeltaEditorModel::AddReferencedObjects(FReferenceCollector& Collector)
{
Collector.AddReferencedObject(EditorInputInfo);
}
FMLDeformerSampler* FLegacyVertexDeltaEditorModel::CreateSampler() const
{
FMLDeformerGeomCacheSampler* NewSampler = new FMLDeformerGeomCacheSampler();
NewSampler->OnGetGeometryCache().BindLambda([this] { return GetVertexDeltaModel()->GetGeometryCache(); });
return NewSampler;
}
void FLegacyVertexDeltaEditorModel::OnPostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent)
{
const FProperty* Property = PropertyChangedEvent.Property;
if (Property == nullptr)
{
return;
}
HandleDefaultPropertyChanges(PropertyChangedEvent);
// When we change one of these properties below, restart animations etc.
if (Property->GetFName() == GET_MEMBER_NAME_CHECKED(ULegacyVertexDeltaModel, GeometryCache) ||
Property->GetFName() == GET_MEMBER_NAME_CHECKED(ULegacyVertexDeltaModelVizSettings, GroundTruth))
{
TriggerInputAssetChanged(true);
}
else
if (Property->GetFName() == GET_MEMBER_NAME_CHECKED(ULegacyVertexDeltaModel, DeltaCutoffLength) ||
Property->GetFName() == GET_MEMBER_NAME_CHECKED(UMLDeformerModel, AlignmentTransform))
{
if (PropertyChangedEvent.ChangeType == EPropertyChangeType::ValueSet)
{
SetResamplingInputOutputsNeeded(true);
SampleDeltas();
}
}
}
void FLegacyVertexDeltaEditorModel::OnInputAssetsChanged()
{
// Update the skeletal mesh components of the training, test base, and ml deformed actor.
FMLDeformerEditorModel::OnInputAssetsChanged();
ULegacyVertexDeltaModelVizSettings* VizSettings = GetVertexDeltaModelVizSettings();
check(VizSettings);
const float TestAnimSpeed = VizSettings->GetAnimPlaySpeed();
UAnimSequence* TestAnimSequence = VizSettings->GetTestAnimSequence();
// Update the training geometry cache.
UGeometryCacheComponent* GeometryCacheComponent = FindVertexDeltaModelEditorActor(ActorID_Train_GroundTruth)->GetGeometryCacheComponent();
check(GeometryCacheComponent);
GeometryCacheComponent->SetGeometryCache(GetVertexDeltaModel()->GetGeometryCache());
GeometryCacheComponent->ResetAnimationTime();
GeometryCacheComponent->SetLooping(false);
GeometryCacheComponent->SetManualTick(true);
GeometryCacheComponent->SetPlaybackSpeed(TestAnimSpeed);
GeometryCacheComponent->Play();
// Update the test geometry cache (ground truth) component.
GeometryCacheComponent = FindVertexDeltaModelEditorActor(ActorID_Test_GroundTruth)->GetGeometryCacheComponent();
GeometryCacheComponent->SetGeometryCache(VizSettings->GetTestGroundTruth());
GeometryCacheComponent->ResetAnimationTime();
GeometryCacheComponent->SetLooping(true);
GeometryCacheComponent->SetManualTick(true);
GeometryCacheComponent->SetPlaybackSpeed(TestAnimSpeed);
GeometryCacheComponent->Play();
ULegacyVertexDeltaModel* VertexDeltaModel = GetVertexDeltaModel();
VertexDeltaModel->MeshMappings.Reset();
}
void FLegacyVertexDeltaEditorModel::CreateTrainingGroundTruthActor(UWorld* World)
{
UGeometryCache* GeomCache = GetVertexDeltaModel()->GetGeometryCache();
const FLinearColor LabelColor = FMLDeformerEditorStyle::Get().GetColor("MLDeformer.TargetMesh.LabelColor");
const FLinearColor WireframeColor = FMLDeformerEditorStyle::Get().GetColor("MLDeformer.TargetMesh.WireframeColor");
CreateGeomCacheActor(
World,
ActorID_Train_GroundTruth,
"Train GroundTruth",
GeomCache,
LabelColor,
WireframeColor,
LOCTEXT("TrainGroundTruthActorLabelText", "Target Mesh"),
true);
}
void FLegacyVertexDeltaEditorModel::CreateTestGroundTruthActor(UWorld* World)
{
UGeometryCache* GeomCache = GetVertexDeltaModelVizSettings()->GetTestGroundTruth();
const FLinearColor LabelColor = FMLDeformerEditorStyle::Get().GetColor("MLDeformer.GroundTruth.LabelColor");
const FLinearColor WireframeColor = FMLDeformerEditorStyle::Get().GetColor("MLDeformer.GroundTruth.WireframeColor");
CreateGeomCacheActor(
World,
ActorID_Test_GroundTruth,
"Test GroundTruth",
GeomCache,
LabelColor,
WireframeColor,
LOCTEXT("TestGroundTruthActorLabelText", "Ground Truth"),
false);
}
void FLegacyVertexDeltaEditorModel::CreateGeomCacheActor(UWorld* World, int32 ActorID, const FName& Name, UGeometryCache* GeomCache, FLinearColor LabelColor, FLinearColor WireframeColor, const FText& LabelText, bool bIsTrainingActor)
{
FActorSpawnParameters SpawnParams;
SpawnParams.Name = MakeUniqueObjectName(World, AActor::StaticClass(), Name);
AActor* Actor = World->SpawnActor<AActor>(SpawnParams);
Actor->SetFlags(RF_Transient);
// Create the Geometry Cache Component.
UGeometryCacheComponent* GeomCacheComponent = NewObject<UGeometryCacheComponent>(Actor);
GeomCacheComponent->SetGeometryCache(GeomCache);
GeomCacheComponent->RegisterComponent();
GeomCacheComponent->SetOverrideWireframeColor(true);
GeomCacheComponent->SetWireframeOverrideColor(WireframeColor);
GeomCacheComponent->MarkRenderStateDirty();
GeomCacheComponent->SetVisibility(false);
Actor->SetRootComponent(GeomCacheComponent);
// Create the editor actor.
FMLDeformerEditorActor::FConstructSettings Settings;
Settings.Actor = Actor;
Settings.TypeID = ActorID;
Settings.LabelColor = LabelColor;
Settings.LabelText = LabelText;
Settings.bIsTrainingActor = bIsTrainingActor;
FLegacyVertexDeltaEditorModelActor* EditorActor = static_cast<FLegacyVertexDeltaEditorModelActor*>(CreateEditorActor(Settings));
EditorActor->SetGeometryCacheComponent(GeomCacheComponent);
EditorActors.Add(EditorActor);
}
FMLDeformerEditorActor* FLegacyVertexDeltaEditorModel::CreateEditorActor(const FMLDeformerEditorActor::FConstructSettings& Settings) const
{
return new FLegacyVertexDeltaEditorModelActor(Settings);
}
FLegacyVertexDeltaEditorModelActor* FLegacyVertexDeltaEditorModel::FindVertexDeltaModelEditorActor(int32 TypeID) const
{
return static_cast<FLegacyVertexDeltaEditorModelActor*>(FindEditorActor(TypeID));
}
ULegacyVertexDeltaModelVizSettings* FLegacyVertexDeltaEditorModel::GetVertexDeltaModelVizSettings() const
{
return Cast<ULegacyVertexDeltaModelVizSettings>(GetVertexDeltaModel()->GetVizSettings());
}
double FLegacyVertexDeltaEditorModel::GetTrainingTimeAtFrame(int32 FrameNumber) const
{
const FLegacyVertexDeltaEditorModelActor* EditorActor = static_cast<FLegacyVertexDeltaEditorModelActor*>(GetTimelineEditorActor());
if (EditorActor && EditorActor->GetGeometryCacheComponent())
{
return EditorActor->GetGeometryCacheComponent()->GetTimeAtFrame(FrameNumber);
}
return 0.0;
}
int32 FLegacyVertexDeltaEditorModel::GetTrainingFrameAtTime(double TimeInSeconds) const
{
const FLegacyVertexDeltaEditorModelActor* EditorActor = static_cast<FLegacyVertexDeltaEditorModelActor*>(GetTimelineEditorActor());
if (EditorActor && EditorActor->GetGeometryCacheComponent())
{
return EditorActor->GetGeometryCacheComponent()->GetFrameAtTime(TimeInSeconds);
}
return 0;
}
int32 FLegacyVertexDeltaEditorModel::GetNumTrainingFrames() const
{
const UGeometryCache* GeometryCache = GetVertexDeltaModel()->GetGeometryCache();
if (GeometryCache == nullptr)
{
return 0;
}
const int32 StartFrame = GeometryCache->GetStartFrame();
const int32 EndFrame = GeometryCache->GetEndFrame();
return (EndFrame - StartFrame) + 1;
}
void FLegacyVertexDeltaEditorModel::UpdateIsReadyForTrainingState()
{
bIsReadyForTraining = false;
// Do some basic checks first, like if there is a skeletal mesh, ground truth, anim sequence, and if there are frames.
if (!IsEditorReadyForTrainingBasicChecks())
{
return;
}
// Now make sure the assets are compatible.
ULegacyVertexDeltaModel* VertexDeltaModel = GetVertexDeltaModel();
UGeometryCache* GeomCache = VertexDeltaModel->GetGeometryCache();
USkeletalMesh* SkeletalMesh = VertexDeltaModel->GetSkeletalMesh();
if (!GetGeomCacheErrorText(SkeletalMesh, GeomCache).IsEmpty())
{
return;
}
// Make sure every skeletal imported mesh has some geometry track.
const int32 NumGeomCacheTracks = GeomCache ? GeomCache->Tracks.Num() : 0;
int32 NumSkelMeshes = 0;
if (SkeletalMesh)
{
FSkeletalMeshModel* ImportedModel = SkeletalMesh->GetImportedModel();
if (ImportedModel)
{
NumSkelMeshes = ImportedModel->LODModels[0].ImportedMeshInfos.Num();
}
}
// Allow the special case where there is just one mesh and track.
if (NumGeomCacheTracks != 1 || NumSkelMeshes != 1)
{
if (!GetGeomCacheSampler()->GetFailedImportedMeshNames().IsEmpty())
{
return;
}
}
bIsReadyForTraining = true;
}
ETrainingResult FLegacyVertexDeltaEditorModel::Train()
{
return TrainModel<ULegacyVertexDeltaTrainingModel>(this);
}
void FLegacyVertexDeltaEditorModel::OnPreTraining()
{
// Make a backup of the normalization values, as they get overwritten when training.
// However, when we abort, we want to restore to the original values again.
// See OnTrainingAborted for when we restore the backup again.
VertexDeltaMeanBackup = GetVertexDeltaModel()->GetVertexDeltaMean();
VertexDeltaScaleBackup = GetVertexDeltaModel()->GetVertexDeltaScale();
}
void FLegacyVertexDeltaEditorModel::OnPostTraining(ETrainingResult TrainingResult, bool bUsePartiallyTrainedWhenAborted)
{
// Restore the vertex delta mean and scale, as we aborted, and they could have changed when training
// on a smaller subset of frames/samples. If we don't do this, the mesh will deform incorrectly.
if (TrainingResult == ETrainingResult::Aborted && !bUsePartiallyTrainedWhenAborted)
{
GetVertexDeltaModel()->VertexDeltaMean = VertexDeltaMeanBackup;
GetVertexDeltaModel()->VertexDeltaScale = VertexDeltaScaleBackup;
}
}
FString FLegacyVertexDeltaEditorModel::GetTrainedNetworkOnnxFile() const
{
return FString(FPaths::ProjectIntermediateDir() + TEXT("LegacyVertexDeltaModel/latest_net_G.onnx"));
}
FString FLegacyVertexDeltaEditorModel::GetDefaultDeformerGraphAssetPath() const
{
return FString(TEXT("/LegacyVertexDeltaModel/Deformers/DG_LegacyVertexDeltaModel.DG_LegacyVertexDeltaModel"));
}
FString FLegacyVertexDeltaEditorModel::GetHeatMapDeformerGraphPath() const
{
return FString(TEXT("/LegacyVertexDeltaModel/Deformers/DG_LegacyVertexDeltaModel_HeatMap.DG_LegacyVertexDeltaModel_HeatMap"));
}
} // namespace UE::LegacyVertexDeltaModel
#undef LOCTEXT_NAMESPACE

View File

@@ -1,124 +0,0 @@
// Copyright Epic Games, Inc. All Rights Reserved.
#include "LegacyVertexDeltaEditorModelActor.h"
#include "GeometryCacheComponent.h"
#include "Animation/DebugSkelMeshComponent.h"
namespace UE::LegacyVertexDeltaModel
{
using namespace UE::MLDeformer;
FLegacyVertexDeltaEditorModelActor::FLegacyVertexDeltaEditorModelActor(const FConstructSettings& Settings)
: FMLDeformerEditorActor(Settings)
{
}
FLegacyVertexDeltaEditorModelActor::~FLegacyVertexDeltaEditorModelActor()
{
if (GeomCacheComponent)
{
Actor->RemoveOwnedComponent(GeomCacheComponent);
}
}
void FLegacyVertexDeltaEditorModelActor::SetVisibility(bool bIsVisible)
{
FMLDeformerEditorActor::SetVisibility(bIsVisible);
if (GeomCacheComponent && bIsVisible != GeomCacheComponent->IsVisible())
{
GeomCacheComponent->SetVisibility(bIsVisible, true);
}
}
bool FLegacyVertexDeltaEditorModelActor::IsVisible() const
{
if (SkeletalMeshComponent)
{
return SkeletalMeshComponent->IsVisible();
}
if (GeomCacheComponent)
{
return GeomCacheComponent->IsVisible();
}
return true;
}
void FLegacyVertexDeltaEditorModelActor::SetPlayPosition(float TimeInSeconds, bool bAutoPause)
{
if (SkeletalMeshComponent)
{
SkeletalMeshComponent->SetPosition(TimeInSeconds);
if (bAutoPause)
{
SkeletalMeshComponent->bPauseAnims = true;
}
}
if (GeomCacheComponent)
{
GeomCacheComponent->SetManualTick(true);
GeomCacheComponent->TickAtThisTime(TimeInSeconds, false, false, false);
}
}
float FLegacyVertexDeltaEditorModelActor::GetPlayPosition() const
{
if (SkeletalMeshComponent)
{
return SkeletalMeshComponent->GetPosition();
}
if (GeomCacheComponent)
{
return GeomCacheComponent->GetAnimationTime();
}
return 0.0f;
}
void FLegacyVertexDeltaEditorModelActor::SetPlaySpeed(float PlaySpeed)
{
if (SkeletalMeshComponent)
{
SkeletalMeshComponent->SetPlayRate(PlaySpeed);
}
if (GeomCacheComponent)
{
GeomCacheComponent->SetPlaybackSpeed(PlaySpeed);
}
}
void FLegacyVertexDeltaEditorModelActor::Pause(bool bPaused)
{
if (SkeletalMeshComponent)
{
SkeletalMeshComponent->bPauseAnims = bPaused;
}
if (GeomCacheComponent)
{
GeomCacheComponent->SetManualTick(bPaused);
}
}
FBox FLegacyVertexDeltaEditorModelActor::GetBoundingBox() const
{
if (SkeletalMeshComponent)
{
return SkeletalMeshComponent->Bounds.GetBox();
}
if (GeomCacheComponent)
{
return GeomCacheComponent->Bounds.GetBox();
}
FBox Box;
Box.Init();
return Box;
}
} // namespace UE::LegacyVertexDeltaModel

View File

@@ -1,137 +0,0 @@
// Copyright Epic Games, Inc. All Rights Reserved.
#include "LegacyVertexDeltaModelDetails.h"
#include "LegacyVertexDeltaEditorModel.h"
#include "LegacyVertexDeltaModel.h"
#include "MLDeformerModule.h"
#include "MLDeformerAsset.h"
#include "MLDeformerModel.h"
#include "MLDeformerEditorModel.h"
#include "MLDeformerEditorModule.h"
#include "MLDeformerGeomCacheHelpers.h"
#include "NeuralNetwork.h"
#include "GeometryCache.h"
#include "GeometryCacheTrack.h"
#include "Animation/AnimSequence.h"
#include "Engine/SkeletalMesh.h"
#include "PropertyCustomizationHelpers.h"
#include "AssetRegistry/AssetData.h"
#include "Modules/ModuleManager.h"
#include "DetailLayoutBuilder.h"
#include "DetailCategoryBuilder.h"
#include "DetailWidgetRow.h"
#include "IDetailsView.h"
#include "IDetailGroup.h"
#include "Widgets/DeclarativeSyntaxSupport.h"
#include "Widgets/Layout/SBox.h"
#include "Widgets/Input/SButton.h"
#include "DetailLayoutBuilder.h"
#include "SWarningOrErrorBox.h"
#define LOCTEXT_NAMESPACE "LegacyVertexDeltaModelDetails"
namespace UE::LegacyVertexDeltaModel
{
using namespace UE::MLDeformer;
TSharedRef<IDetailCustomization> FLegacyVertexDeltaModelDetails::MakeInstance()
{
return MakeShareable(new FLegacyVertexDeltaModelDetails());
}
bool FLegacyVertexDeltaModelDetails::UpdateMemberPointers(const TArray<TWeakObjectPtr<UObject>>& Objects)
{
if (!FMLDeformerModelDetails::UpdateMemberPointers(Objects))
{
return false;
}
VertexModel = Cast<ULegacyVertexDeltaModel>(Model);
check(VertexModel);
VertexEditorModel = static_cast<FLegacyVertexDeltaEditorModel*>(EditorModel);
return (VertexModel != nullptr && VertexEditorModel != nullptr);
}
void FLegacyVertexDeltaModelDetails::CustomizeDetails(IDetailLayoutBuilder& DetailBuilder)
{
// Create all the detail categories and add the properties of the base class.
FMLDeformerModelDetails::CustomizeDetails(DetailBuilder);
// Training settings.
SettingsCategoryBuilder->AddProperty(GET_MEMBER_NAME_CHECKED(ULegacyVertexDeltaModel, NumHiddenLayers));
SettingsCategoryBuilder->AddProperty(GET_MEMBER_NAME_CHECKED(ULegacyVertexDeltaModel, NumNeuronsPerLayer));
SettingsCategoryBuilder->AddProperty(GET_MEMBER_NAME_CHECKED(ULegacyVertexDeltaModel, Epochs));
// Check whether shrinkage settings should be visible or not.
auto IsShrinkageVisible = [this]()
{
return (VertexModel->GetLossFunction() == ELegacyVertexDeltaModelLossFunction::Shrinkage) ? EVisibility::Visible : EVisibility::Collapsed;
};
// Advanced settings.
SettingsCategoryBuilder->AddProperty(GET_MEMBER_NAME_CHECKED(ULegacyVertexDeltaModel, BatchSize));
SettingsCategoryBuilder->AddProperty(GET_MEMBER_NAME_CHECKED(ULegacyVertexDeltaModel, LearningRate));
SettingsCategoryBuilder->AddProperty(GET_MEMBER_NAME_CHECKED(ULegacyVertexDeltaModel, ActivationFunction));
SettingsCategoryBuilder->AddProperty(GET_MEMBER_NAME_CHECKED(ULegacyVertexDeltaModel, LossFunction));
SettingsCategoryBuilder->AddProperty(GET_MEMBER_NAME_CHECKED(ULegacyVertexDeltaModel, ShrinkageSpeed))
.Visibility(TAttribute<EVisibility>::CreateLambda(IsShrinkageVisible));
SettingsCategoryBuilder->AddProperty(GET_MEMBER_NAME_CHECKED(ULegacyVertexDeltaModel, ShrinkageThreshold))
.Visibility(TAttribute<EVisibility>::CreateLambda(IsShrinkageVisible));
SettingsCategoryBuilder->AddProperty(GET_MEMBER_NAME_CHECKED(ULegacyVertexDeltaModel, MaxCacheSizeGB));
}
void FLegacyVertexDeltaModelDetails::AddAnimSequenceErrors()
{
const FText WarningText = GetGeomCacheAnimSequenceErrorText(VertexModel->GetGeometryCache(), Model->GetAnimSequence());
BaseMeshCategoryBuilder->AddCustomRow(FText::FromString("AnimSeqWarning"))
.Visibility(!WarningText.IsEmpty() ? EVisibility::Visible : EVisibility::Collapsed)
.WholeRowContent()
[
SNew(SBox)
.Padding(FMargin(0.0f, 4.0f))
[
SNew(SWarningOrErrorBox)
.MessageStyle(EMessageStyle::Warning)
.Message(WarningText)
]
];
}
void FLegacyVertexDeltaModelDetails::AddTargetMesh()
{
TargetMeshCategoryBuilder->AddProperty(GET_MEMBER_NAME_CHECKED(ULegacyVertexDeltaModel, GeometryCache));
const FText TargetMeshErrorText = GetGeomCacheErrorText(VertexModel->GetSkeletalMesh(), VertexModel->GetGeometryCache());
TargetMeshCategoryBuilder->AddCustomRow(FText::FromString("TargetMeshError"))
.Visibility(!TargetMeshErrorText.IsEmpty() ? EVisibility::Visible : EVisibility::Collapsed)
.WholeRowContent()
[
SNew(SBox)
.Padding(FMargin(0.0f, 4.0f))
[
SNew(SWarningOrErrorBox)
.MessageStyle(EMessageStyle::Error)
.Message(TargetMeshErrorText)
]
];
const FText ChangedErrorText = EditorModel->GetTargetAssetChangedErrorText();
TargetMeshCategoryBuilder->AddCustomRow(FText::FromString("TargetMeshChangedError"))
.Visibility(!ChangedErrorText.IsEmpty() ? EVisibility::Visible : EVisibility::Collapsed)
.WholeRowContent()
[
SNew(SBox)
.Padding(FMargin(0.0f, 4.0f))
[
SNew(SWarningOrErrorBox)
.MessageStyle(EMessageStyle::Error)
.Message(ChangedErrorText)
]
];
AddGeomCacheMeshMappingWarnings(TargetMeshCategoryBuilder, Model->GetSkeletalMesh(), VertexModel->GetGeometryCache());
}
} // namespace UE::LegacyVertexDeltaModel
#undef LOCTEXT_NAMESPACE

View File

@@ -1,56 +0,0 @@
// Copyright Epic Games, Inc. All Rights Reserved.
#include "LegacyVertexDeltaModelEditorModule.h"
#include "MLDeformerEditorModule.h"
#include "LegacyVertexDeltaModelVizSettingsDetails.h"
#include "LegacyVertexDeltaModelDetails.h"
#include "LegacyVertexDeltaEditorModel.h"
#include "LegacyVertexDeltaModel.h"
#include "Modules/ModuleManager.h"
#include "EditorModeRegistry.h"
#define LOCTEXT_NAMESPACE "LegacyVertexDeltaModelEditorModule"
IMPLEMENT_MODULE(UE::LegacyVertexDeltaModel::FLegacyVertexDeltaModelEditorModule, LegacyVertexDeltaModelEditor)
namespace UE::LegacyVertexDeltaModel
{
using namespace UE::MLDeformer;
void FLegacyVertexDeltaModelEditorModule::StartupModule()
{
// Register object detail customizations.
FPropertyEditorModule& PropertyModule = FModuleManager::LoadModuleChecked<FPropertyEditorModule>("PropertyEditor");
PropertyModule.RegisterCustomClassLayout("LegacyVertexDeltaModelVizSettings", FOnGetDetailCustomizationInstance::CreateStatic(&FLegacyVertexDeltaModelVizSettingsDetails::MakeInstance));
PropertyModule.RegisterCustomClassLayout("LegacyVertexDeltaModel", FOnGetDetailCustomizationInstance::CreateStatic(&FLegacyVertexDeltaModelDetails::MakeInstance));
PropertyModule.NotifyCustomizationModuleChanged();
// Register our custom ML deformer model to the model registry in the ML Deformer Framework.
FMLDeformerEditorModule& EditorModule = FModuleManager::LoadModuleChecked<FMLDeformerEditorModule>("MLDeformerFrameworkEditor");
FMLDeformerEditorModelRegistry& ModelRegistry = EditorModule.GetModelRegistry();
ModelRegistry.RegisterEditorModel(ULegacyVertexDeltaModel::StaticClass(), FOnGetEditorModelInstance::CreateStatic(&FLegacyVertexDeltaEditorModel::MakeInstance), /*ModelPriority*/0);
}
void FLegacyVertexDeltaModelEditorModule::ShutdownModule()
{
// Unregister our ML Deformer model.
if (FModuleManager::Get().IsModuleLoaded(TEXT("MLDeformerFrameworkEditor")))
{
FMLDeformerEditorModule& EditorModule = FModuleManager::GetModuleChecked<FMLDeformerEditorModule>("MLDeformerFrameworkEditor");
FMLDeformerEditorModelRegistry& ModelRegistry = EditorModule.GetModelRegistry();
ModelRegistry.UnregisterEditorModel(ULegacyVertexDeltaModel::StaticClass());
}
// Unregister object detail customizations for this model.
if (FModuleManager::Get().IsModuleLoaded(TEXT("PropertyEditor")))
{
FPropertyEditorModule& PropertyModule = FModuleManager::GetModuleChecked<FPropertyEditorModule>(TEXT("PropertyEditor"));
PropertyModule.UnregisterCustomClassLayout(TEXT("LegacyVertexDeltaModelVizSettings"));
PropertyModule.UnregisterCustomClassLayout(TEXT("LegacyVertexDeltaModel"));
PropertyModule.NotifyCustomizationModuleChanged();
}
}
} // namespace UE::LegacyVertexDeltaModel
#undef LOCTEXT_NAMESPACE

View File

@@ -1,90 +0,0 @@
// Copyright Epic Games, Inc. All Rights Reserved.
#include "LegacyVertexDeltaModelVizSettingsDetails.h"
#include "MLDeformerModule.h"
#include "MLDeformerModel.h"
#include "MLDeformerEditorModule.h"
#include "MLDeformerGeomCacheHelpers.h"
#include "LegacyVertexDeltaModel.h"
#include "LegacyVertexDeltaEditorModel.h"
#include "LegacyVertexDeltaModelVizSettings.h"
#include "DetailLayoutBuilder.h"
#include "DetailCategoryBuilder.h"
#include "DetailWidgetRow.h"
#include "IDetailsView.h"
#include "IDetailChildrenBuilder.h"
#include "IDetailGroup.h"
#include "Modules/ModuleManager.h"
#include "Layout/Margin.h"
#include "Widgets/Layout/SBorder.h"
#include "Widgets/Text/STextBlock.h"
#include "Widgets/Layout/SBox.h"
#include "PropertyCustomizationHelpers.h"
#include "AssetRegistry/AssetData.h"
#include "PropertyHandle.h"
#include "DetailLayoutBuilder.h"
#include "SWarningOrErrorBox.h"
#include "GeometryCache.h"
#include "Animation/AnimSequence.h"
#include "Animation/MeshDeformer.h"
#include "Engine/SkeletalMesh.h"
#define LOCTEXT_NAMESPACE "LegacyVertexDeltaModelVizSettingsDetails"
namespace UE::LegacyVertexDeltaModel
{
using namespace UE::MLDeformer;
TSharedRef<IDetailCustomization> FLegacyVertexDeltaModelVizSettingsDetails::MakeInstance()
{
return MakeShareable(new FLegacyVertexDeltaModelVizSettingsDetails());
}
bool FLegacyVertexDeltaModelVizSettingsDetails::UpdateMemberPointers(const TArray<TWeakObjectPtr<UObject>>& Objects)
{
if (!FMLDeformerVizSettingsDetails::UpdateMemberPointers(Objects))
{
return false;
}
VertexDeltaModel = Cast<ULegacyVertexDeltaModel>(Model);
VertexDeltaVizSettings = Cast<ULegacyVertexDeltaModelVizSettings>(VizSettings);
return (VertexDeltaModel != nullptr && VertexDeltaVizSettings != nullptr);
}
void FLegacyVertexDeltaModelVizSettingsDetails::AddGroundTruth()
{
TestAssetsCategory->AddProperty(GET_MEMBER_NAME_CHECKED(ULegacyVertexDeltaModelVizSettings, GroundTruth));
// Show an error when the test anim sequence duration doesn't match the one of the ground truth.
const FText AnimErrorText = GetGeomCacheAnimSequenceErrorText(VertexDeltaVizSettings->GetTestGroundTruth(), VizSettings->GetTestAnimSequence());
FDetailWidgetRow& GroundTruthAnimErrorRow = TestAssetsCategory->AddCustomRow(FText::FromString("GroundTruthAnimMismatchError"))
.Visibility(!AnimErrorText.IsEmpty() ? EVisibility::Visible : EVisibility::Collapsed)
.WholeRowContent()
[
SNew(SBox)
.Padding(FMargin(0.0f, 4.0f))
[
SNew(SWarningOrErrorBox)
.MessageStyle(EMessageStyle::Warning)
.Message(AnimErrorText)
]
];
const FText GeomErrorText = GetGeomCacheErrorText(Model->GetSkeletalMesh(), VertexDeltaVizSettings->GetTestGroundTruth());
FDetailWidgetRow& GroundTruthGeomErrorRow = TestAssetsCategory->AddCustomRow(FText::FromString("GroundTruthGeomMismatchError"))
.Visibility(!GeomErrorText.IsEmpty() ? EVisibility::Visible : EVisibility::Collapsed)
.WholeRowContent()
[
SNew(SBox)
.Padding(FMargin(0.0f, 4.0f))
[
SNew(SWarningOrErrorBox)
.MessageStyle(EMessageStyle::Warning)
.Message(GeomErrorText)
]
];
}
} //namespace UE::LegacyVertexDeltaModel
#undef LOCTEXT_NAMESPACE

View File

@@ -1,117 +0,0 @@
// Copyright Epic Games, Inc. All Rights Reserved.
#include "LegacyVertexDeltaTrainingModel.h"
#include "LegacyVertexDeltaModel.h"
#include "LegacyVertexDeltaEditorModel.h"
#include "MLDeformerEditorModel.h"
#include "Misc/ScopedSlowTask.h"
#include "Math/NumericLimits.h"
#define LOCTEXT_NAMESPACE "LegacyVertexDeltaTrainingModel"
ULegacyVertexDeltaModel* ULegacyVertexDeltaTrainingModel::GetVertexDeltaModel() const
{
return Cast<ULegacyVertexDeltaModel>(GetModel());
}
UE::LegacyVertexDeltaModel::FLegacyVertexDeltaEditorModel* ULegacyVertexDeltaTrainingModel::GetVertexDeltaEditorModel() const
{
return static_cast<UE::LegacyVertexDeltaModel::FLegacyVertexDeltaEditorModel*>(EditorModel);
}
void ULegacyVertexDeltaTrainingModel::UpdateVertexDeltaMeanAndScale(const TArray<float>& VertexDeltas, FVector& InOutMeanVertexDelta, FVector& InOutVertexDeltaScale, float& InOutCount)
{
// Calculate this frame's mean.
FVector MeanDelta = FVector::ZeroVector;
FVector MinDelta(TNumericLimits<float>::Max());
FVector MaxDelta(-TNumericLimits<float>::Max());
const int32 NumVertices = VertexDeltas.Num() / 3;
for (int32 VertexIndex = 0; VertexIndex < NumVertices; ++VertexIndex)
{
const int Offset = VertexIndex * 3;
const FVector Delta(VertexDeltas[Offset], VertexDeltas[Offset+1], VertexDeltas[Offset+2]);
MeanDelta += Delta;
MinDelta = MinDelta.ComponentMin(Delta);
MaxDelta = MaxDelta.ComponentMax(Delta);
}
const float ValidVertexCount = (float)NumVertices;
if (NumVertices > 0)
{
MeanDelta /= (float)NumVertices;
}
// Update global mean.
InOutCount += 1.0f;
FVector TempDiff = MeanDelta - (FVector)InOutMeanVertexDelta;
InOutMeanVertexDelta = InOutMeanVertexDelta + FVector(TempDiff / InOutCount);
// Update global scale.
TempDiff = MaxDelta - MinDelta;
InOutVertexDeltaScale = InOutVertexDeltaScale.ComponentMax(TempDiff.GetAbs());
}
bool ULegacyVertexDeltaTrainingModel::ComputeVertexDeltaStatistics(uint32 LODIndex)
{
using namespace UE::LegacyVertexDeltaModel;
FLegacyVertexDeltaEditorModel* VertexDeltaEditorModel = GetVertexDeltaEditorModel();
ULegacyVertexDeltaModel* VertexDeltaModel = VertexDeltaEditorModel->GetVertexDeltaModel();
if (!VertexDeltaEditorModel->GetResamplingInputOutputsNeeded())
{
return true;
}
FMLDeformerSampler* Sampler = VertexDeltaEditorModel->GetSampler();
Sampler->SetVertexDeltaSpace(EVertexDeltaSpace::PreSkinning);
// Show some dialog with progress.
const FText Title(LOCTEXT("PreprocessTrainingDataMessage", "Calculating data statistics"));
const uint32 AnimNumFrames = EditorModel->GetNumFramesForTraining();
FScopedSlowTask Task((float)AnimNumFrames, Title);
Task.MakeDialog(true);
// Get the base actor data.
FVector Mean = FVector::ZeroVector;
FVector Scale = FVector::OneVector;
float Count = 0.0f;
const int32 FrameCount = VertexDeltaEditorModel->GetNumFramesForTraining();
for (int32 FrameIndex = 0; FrameIndex < FrameCount; FrameIndex++)
{
// Calculate the deltas and update the mean and scale.
Sampler->Sample(FrameIndex);
UpdateVertexDeltaMeanAndScale(Sampler->GetVertexDeltas(), Mean, Scale, Count);
// Forward the progress bar and check if we want to cancel.
Task.EnterProgressFrame();
if (Task.ShouldCancel())
{
return false;
}
}
// Update the asset with calculated statistics.
VertexDeltaModel->VertexDeltaMean = Mean;
if (Count > 0.0f)
{
VertexDeltaModel->VertexDeltaScale = FVector::OneVector * Scale.GetMax();
VertexDeltaEditorModel->SetResamplingInputOutputsNeeded(true);
}
return true;
}
bool ULegacyVertexDeltaTrainingModel::ComputeDeltasStatistics()
{
const ULegacyVertexDeltaModel* VertexDeltaModel = GetVertexDeltaModel();
const float DeltaCutoffLength = VertexDeltaModel->GetDeltaCutoffLength();
if (ComputeVertexDeltaStatistics(0))
{
VertexDeltaMean = VertexDeltaModel->VertexDeltaMean;
VertexDeltaScale = VertexDeltaModel->VertexDeltaScale;
return true;
}
return false;
}
#undef LOCTEXT_NAMESPACE

View File

@@ -1,69 +0,0 @@
// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "MLDeformerEditorModel.h"
#include "MLDeformerGeomCacheSampler.h"
#include "LegacyVertexDeltaModel.h"
#include "MLDeformerEditorActor.h"
#include "UObject/GCObject.h"
class UMLDeformerAsset;
class USkeletalMesh;
class UGeometryCache;
class ULegacyVertexDeltaModel;
class ULegacyVertexDeltaModelVizSettings;
namespace UE::LegacyVertexDeltaModel
{
using namespace UE::MLDeformer;
class FLegacyVertexDeltaEditorModelActor;
class FLegacyVertexDeltaModelSampler;
class LEGACYVERTEXDELTAMODELEDITOR_API FLegacyVertexDeltaEditorModel
: public UE::MLDeformer::FMLDeformerEditorModel
{
public:
// We need to implement this static MakeInstance method.
static FMLDeformerEditorModel* MakeInstance();
// FGCObject overrides.
virtual void AddReferencedObjects(FReferenceCollector& Collector) override;
virtual FString GetReferencerName() const override { return TEXT("FLegacyVertexDeltaEditorModel"); }
// ~END FGCObject overrides.
// FMLDeformerEditorModel overrides.
virtual FMLDeformerEditorActor* CreateEditorActor(const FMLDeformerEditorActor::FConstructSettings& Settings) const override;
virtual FMLDeformerSampler* CreateSampler() const;
virtual void CreateTrainingGroundTruthActor(UWorld* World) override;
virtual void CreateTestGroundTruthActor(UWorld* World) override;
virtual void OnPreTraining() override;
virtual void OnPostTraining(ETrainingResult TrainingResult, bool bUsePartiallyTrainedWhenAborted) override;
virtual void OnInputAssetsChanged() override;
virtual int32 GetNumTrainingFrames() const override;
virtual double GetTrainingTimeAtFrame(int32 FrameNumber) const override;
virtual int32 GetTrainingFrameAtTime(double TimeInSeconds) const override;
virtual void UpdateIsReadyForTrainingState() override;
virtual ETrainingResult Train() override;
virtual FString GetDefaultDeformerGraphAssetPath() const override;
virtual FString GetHeatMapDeformerGraphPath() const override;
virtual FString GetTrainedNetworkOnnxFile() const override;
virtual void OnPostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent) override;
// ~END FMLDeformerEditorModel overrides.
// Some helpers that cast to this model's variants of some classes.
ULegacyVertexDeltaModel* GetVertexDeltaModel() const { return Cast<ULegacyVertexDeltaModel>(Model); }
ULegacyVertexDeltaModelVizSettings* GetVertexDeltaModelVizSettings() const;
FLegacyVertexDeltaEditorModelActor* FindVertexDeltaModelEditorActor(int32 TypeID) const;
FMLDeformerGeomCacheSampler* GetGeomCacheSampler() const { return static_cast<FMLDeformerGeomCacheSampler*>(Sampler); }
protected:
void CreateGeomCacheActor(UWorld* World, int32 ActorID, const FName& Name, UGeometryCache* GeomCache, FLinearColor LabelColor, FLinearColor WireframeColor, const FText& LabelText, bool bIsTrainingActor);
protected:
FVector VertexDeltaMeanBackup = FVector::ZeroVector;
FVector VertexDeltaScaleBackup = FVector::OneVector;
};
} // namespace UE::LegacyVertexDeltaModel

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