diff --git a/Game/GigLine/Content/Hollywood/DemoMap.umap b/Game/GigLine/Content/Hollywood/DemoMap.umap index e4b24ce..6c5d70d 100644 --- a/Game/GigLine/Content/Hollywood/DemoMap.umap +++ b/Game/GigLine/Content/Hollywood/DemoMap.umap @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9229a96601288722aa7e4ef16b34a996fe648a93b6a2d780a17542474abc5155 -size 782187 +oid sha256:fefd4f0b82a2d683acef909b974688b9b31f6b232e96071a1fe49de4cd741701 +size 782191 diff --git a/Game/GigLine/Content/Hollywood/Site/M_Asphalt.uasset b/Game/GigLine/Content/Hollywood/Site/M_Asphalt.uasset index 3443e03..db43dd2 100644 --- a/Game/GigLine/Content/Hollywood/Site/M_Asphalt.uasset +++ b/Game/GigLine/Content/Hollywood/Site/M_Asphalt.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:01a61fc301e719b0fb5a85a5520eae2e3c2582ff398beb2d7ef74e474158dbbe +oid sha256:ddf1c61be6475f33aa5721aafe4fcde685e22f27422e1c593a919e4c42c73ea7 size 10019 diff --git a/Game/GigLine/Content/Hollywood/Site/M_Concrete.uasset b/Game/GigLine/Content/Hollywood/Site/M_Concrete.uasset index 2a99f66..29f5c65 100644 --- a/Game/GigLine/Content/Hollywood/Site/M_Concrete.uasset +++ b/Game/GigLine/Content/Hollywood/Site/M_Concrete.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f9e14cb34146477665681b5c070c59b9901017ae057b2266559fb0e8cc494f34 +oid sha256:00e5d95b839f41f86c29437183a8ee164676aa1dae5fd000f4677c4a12ba4c9e size 10024 diff --git a/Game/GigLine/Content/Hollywood/Site/M_FacadeBanner.uasset b/Game/GigLine/Content/Hollywood/Site/M_FacadeBanner.uasset index ba5e3be..be0fef1 100644 --- a/Game/GigLine/Content/Hollywood/Site/M_FacadeBanner.uasset +++ b/Game/GigLine/Content/Hollywood/Site/M_FacadeBanner.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2f2ae03ce8f34395aaba2bbe0f0e962143f5f38d70229a089fb1508e933d8e39 +oid sha256:2374ed4b1522375a48ca29af95d9a72b74eae3a13971b63078a5b52c28af432a size 11419 diff --git a/Game/GigLine/Content/Hollywood/Site/M_FacadeGlass.uasset b/Game/GigLine/Content/Hollywood/Site/M_FacadeGlass.uasset index ba88624..9ff68de 100644 --- a/Game/GigLine/Content/Hollywood/Site/M_FacadeGlass.uasset +++ b/Game/GigLine/Content/Hollywood/Site/M_FacadeGlass.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:24433c6ecf229dcb2f5e445641b969550da7e1ca23f3b6b721d8947dc89fb058 +oid sha256:871856d181773b13ca698914bd6e5734df08859d4d127744a8bd2043f310fbfc size 11414 diff --git a/Game/GigLine/Content/Hollywood/Site/M_FacadeStone.uasset b/Game/GigLine/Content/Hollywood/Site/M_FacadeStone.uasset index 500b461..c1a7c38 100644 --- a/Game/GigLine/Content/Hollywood/Site/M_FacadeStone.uasset +++ b/Game/GigLine/Content/Hollywood/Site/M_FacadeStone.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:224b6f3b688a0697928248302d932000a5c3ddb68a52eba31ed52f8e64cc6bf5 +oid sha256:087e64b751377e6fd434d3f8980cf93ad7103b21067e58d671ba3e1c4299d0c9 size 17083 diff --git a/Game/GigLine/Content/Hollywood/Site/M_FacadeStoneShadow.uasset b/Game/GigLine/Content/Hollywood/Site/M_FacadeStoneShadow.uasset index 299d4ec..246830e 100644 --- a/Game/GigLine/Content/Hollywood/Site/M_FacadeStoneShadow.uasset +++ b/Game/GigLine/Content/Hollywood/Site/M_FacadeStoneShadow.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6c983fcbd556eabb29c34ca442a5b7627fbdc1ee6101a54106527f4580e9251d +oid sha256:3a7fcdb1aa8c6560031c428f5c729af38d071af94ffcfb0adfd37b00e189f6bd size 17113 diff --git a/Game/GigLine/Content/Hollywood/Site/M_Ground.uasset b/Game/GigLine/Content/Hollywood/Site/M_Ground.uasset index bbd875f..d565495 100644 --- a/Game/GigLine/Content/Hollywood/Site/M_Ground.uasset +++ b/Game/GigLine/Content/Hollywood/Site/M_Ground.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:63324c618d4a0fe1b51c640d786c5ad207ab3f3de76ce3fb4d516a8bf072a6ae +oid sha256:9135badbc94b261eaceae9997f52f477d6f30fa7342f1440c9fb1550259d9f18 size 10014 diff --git a/Game/GigLine/Content/Hollywood/Site/M_KerbConcrete.uasset b/Game/GigLine/Content/Hollywood/Site/M_KerbConcrete.uasset index 2a6afa8..d135ea4 100644 --- a/Game/GigLine/Content/Hollywood/Site/M_KerbConcrete.uasset +++ b/Game/GigLine/Content/Hollywood/Site/M_KerbConcrete.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:afe14fa4be700b4bc2f915c50f17f322085a98629a6993fafc3496d7acda84aa +oid sha256:c46c70ea02afedf95b103909790cd375824230104915665dd077e1a2f9fe1931 size 10044 diff --git a/Game/GigLine/Content/Hollywood/Site/M_RoadPaint.uasset b/Game/GigLine/Content/Hollywood/Site/M_RoadPaint.uasset index 49a491c..d25b862 100644 --- a/Game/GigLine/Content/Hollywood/Site/M_RoadPaint.uasset +++ b/Game/GigLine/Content/Hollywood/Site/M_RoadPaint.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:cb75951f8dc347f98d6d50b9fd51064a441469b25fc98f167cf25c25f99f7a39 +oid sha256:0da60e4b0d21266a9ea139fc50479f7eaa42ea993da756f3bca9846f173705de size 10029 diff --git a/Game/GigLine/Content/Hollywood/Site/M_Stucco.uasset b/Game/GigLine/Content/Hollywood/Site/M_Stucco.uasset index c9f822b..140ac86 100644 --- a/Game/GigLine/Content/Hollywood/Site/M_Stucco.uasset +++ b/Game/GigLine/Content/Hollywood/Site/M_Stucco.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:895d6ede81d352a800e00573de532d79337388f23e7d4f3eb70d39344b32a058 +oid sha256:b4b3c11ad2e291aa9fb1938ebe0e0e7b36314f21748197ef8602aa5bc496f04a size 11389 diff --git a/Game/GigLine/Content/Hollywood/Site/Terrain_DEM.uasset b/Game/GigLine/Content/Hollywood/Site/Terrain_DEM.uasset index f8668c3..bb8533e 100644 --- a/Game/GigLine/Content/Hollywood/Site/Terrain_DEM.uasset +++ b/Game/GigLine/Content/Hollywood/Site/Terrain_DEM.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:612b77812422285e230c237ddc7ddef08b671e4a1a19070d0d38cd520ba12ff3 +oid sha256:a06f0695c1588ccdf236111100e76e1a672b93cdcc4d16e073c11c8f1556e4b7 size 357901 diff --git a/Game/GigLine/Content/Hollywood/Textures/T_Asphalt_BC.uasset b/Game/GigLine/Content/Hollywood/Textures/T_Asphalt_BC.uasset index eb0065f..df676c0 100644 --- a/Game/GigLine/Content/Hollywood/Textures/T_Asphalt_BC.uasset +++ b/Game/GigLine/Content/Hollywood/Textures/T_Asphalt_BC.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:28a054343fcd153f523f053aec9b380165058cd953f4a10389f3cf5804c62a94 +oid sha256:f7934695c2b913fb1f95c5779b182ef356cfa32d5262d6448710c87473e5f4ec size 70879 diff --git a/Game/GigLine/Content/Hollywood/Textures/T_Asphalt_R.uasset b/Game/GigLine/Content/Hollywood/Textures/T_Asphalt_R.uasset index 4d0d55a..0c6b38e 100644 --- a/Game/GigLine/Content/Hollywood/Textures/T_Asphalt_R.uasset +++ b/Game/GigLine/Content/Hollywood/Textures/T_Asphalt_R.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a8a822a2f08e88ff930ce4c7dbc8b2190595102c0715cc3ffa340bc9e71f0307 +oid sha256:97262b87ac0d4e65ed22b381b98f8eabf751c0f9c1e8422da870ce6ebc654aa2 size 29011 diff --git a/Game/GigLine/Content/Hollywood/Textures/T_Concrete_BC.uasset b/Game/GigLine/Content/Hollywood/Textures/T_Concrete_BC.uasset index a982322..063a056 100644 --- a/Game/GigLine/Content/Hollywood/Textures/T_Concrete_BC.uasset +++ b/Game/GigLine/Content/Hollywood/Textures/T_Concrete_BC.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:01f1073a13c880a9baa9849f34ebd268cf2bbeff1763bc39852f8206eff2df19 +oid sha256:6e5bf05eb9521e34e3bd5bcfc6d47c3b727b57333451fb5032701d4a7a404058 size 58568 diff --git a/Game/GigLine/Content/Hollywood/Textures/T_Concrete_R.uasset b/Game/GigLine/Content/Hollywood/Textures/T_Concrete_R.uasset index f7d18e3..3e4fda8 100644 --- a/Game/GigLine/Content/Hollywood/Textures/T_Concrete_R.uasset +++ b/Game/GigLine/Content/Hollywood/Textures/T_Concrete_R.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5f2aca192bf4db7869b2e129bee441add45b6e4394d33ba410db4513054620c8 +oid sha256:c864f50af6f0394e3de9f72ce5179fcd48ba200938af0a41328c3d2c5ef9da75 size 17517 diff --git a/Game/GigLine/Content/Hollywood/Textures/T_StoneAshlar_BC.uasset b/Game/GigLine/Content/Hollywood/Textures/T_StoneAshlar_BC.uasset index 47bf7f6..ab82d71 100644 --- a/Game/GigLine/Content/Hollywood/Textures/T_StoneAshlar_BC.uasset +++ b/Game/GigLine/Content/Hollywood/Textures/T_StoneAshlar_BC.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:11d0f740ba7f8f479af29d6a6648fd915011e45008b96315d071335371e180f9 +oid sha256:7687c9211a78ccd4334af1ff12900ef24b018aebd026546cdb3c15f473266bdb size 40610 diff --git a/Game/GigLine/Content/Hollywood/Textures/T_StoneAshlar_R.uasset b/Game/GigLine/Content/Hollywood/Textures/T_StoneAshlar_R.uasset index 4bf77e0..9b003a0 100644 --- a/Game/GigLine/Content/Hollywood/Textures/T_StoneAshlar_R.uasset +++ b/Game/GigLine/Content/Hollywood/Textures/T_StoneAshlar_R.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7568d7b8f861889822311588bf09e74a831c01de78f1c08dec2be49411f39612 +oid sha256:035d7646a8e3e4aa9b815c774839b753cc1d0cb6b9e95714cf43aac48070eda0 size 18770 diff --git a/Game/GigLine/Content/Hollywood/Textures/T_Stucco_BC.uasset b/Game/GigLine/Content/Hollywood/Textures/T_Stucco_BC.uasset index 0264d3c..ec64d5d 100644 --- a/Game/GigLine/Content/Hollywood/Textures/T_Stucco_BC.uasset +++ b/Game/GigLine/Content/Hollywood/Textures/T_Stucco_BC.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9a2deedda78e49b1b75ed825b76feae4ce2b5efa2ee2e4d828796e70a705e3a2 +oid sha256:54d50c97f02e336c5c7f9c6a8c3c439ee08260d02e93def9d1b48cdfb8a9620d size 62746 diff --git a/Game/GigLine/Content/Hollywood/Textures/T_Stucco_R.uasset b/Game/GigLine/Content/Hollywood/Textures/T_Stucco_R.uasset index 7f4b4f4..cf62fae 100644 --- a/Game/GigLine/Content/Hollywood/Textures/T_Stucco_R.uasset +++ b/Game/GigLine/Content/Hollywood/Textures/T_Stucco_R.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1155ba8d223052c5d484cdd898c2be056fe2c78d2982c875d0f836bf00ef767c +oid sha256:1edaafb2925737a7e2d8a1d88b139553aca54ba680ee687bb0473c7af9f7a4d5 size 17541 diff --git a/Game/GigLine/Content/Hollywood/Theatre/SM_Trim_BladeSign.uasset b/Game/GigLine/Content/Hollywood/Theatre/SM_Trim_BladeSign.uasset index 969e675..83acdc1 100644 --- a/Game/GigLine/Content/Hollywood/Theatre/SM_Trim_BladeSign.uasset +++ b/Game/GigLine/Content/Hollywood/Theatre/SM_Trim_BladeSign.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:35ffbccc5f265507ce17b01ab397c363b112ac43f1b6df43aece52ae749a0846 +oid sha256:f81c8ae249ecabc83152f3a9ff22435b6e9c1577a78198af8ce5a6c0fbe6586b size 72330 diff --git a/Game/GigLine/Content/Hollywood/Theatre/SM_Trim_BladeSignBracket.uasset b/Game/GigLine/Content/Hollywood/Theatre/SM_Trim_BladeSignBracket.uasset index d80b024..89433f7 100644 --- a/Game/GigLine/Content/Hollywood/Theatre/SM_Trim_BladeSignBracket.uasset +++ b/Game/GigLine/Content/Hollywood/Theatre/SM_Trim_BladeSignBracket.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ff26d8e57db1f6fd6d118d0096abcacb2e42b9069c348552223d968542932415 +oid sha256:4b2c651d7e235ee2180d9e2a0bb65cab0876d916ed2c51070659ddce34cac9ca size 72466 diff --git a/Game/GigLine/Content/Hollywood/Theatre/SM_Trim_BladeSignFrame.uasset b/Game/GigLine/Content/Hollywood/Theatre/SM_Trim_BladeSignFrame.uasset index f4261fc..e004420 100644 --- a/Game/GigLine/Content/Hollywood/Theatre/SM_Trim_BladeSignFrame.uasset +++ b/Game/GigLine/Content/Hollywood/Theatre/SM_Trim_BladeSignFrame.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f8416d544f721321f6ae3406ec871cab5a80c1038a45db344a24ed867eccb61f +oid sha256:ea04a31d60f36ac4a4de9d8ac86bf1aecfcf689538cf143ce02e4ff5441a8d26 size 72406 diff --git a/Game/GigLine/Content/Hollywood/Theatre/SM_Trim_MarqueeCanopy.uasset b/Game/GigLine/Content/Hollywood/Theatre/SM_Trim_MarqueeCanopy.uasset index 2de20c1..25c7e6c 100644 --- a/Game/GigLine/Content/Hollywood/Theatre/SM_Trim_MarqueeCanopy.uasset +++ b/Game/GigLine/Content/Hollywood/Theatre/SM_Trim_MarqueeCanopy.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e772acdf849b682dc22cd0558d9e2d75b0473cc3f7457d58877bcd4f11ad2db5 +oid sha256:92660e4ae53b438692bc1725b995b8d76135a2f565a8641c6b98ef648794f82b size 72370 diff --git a/Game/GigLine/Content/Hollywood/Theatre/SM_Trim_MarqueeFascia.uasset b/Game/GigLine/Content/Hollywood/Theatre/SM_Trim_MarqueeFascia.uasset index bbda8e9..ac28654 100644 --- a/Game/GigLine/Content/Hollywood/Theatre/SM_Trim_MarqueeFascia.uasset +++ b/Game/GigLine/Content/Hollywood/Theatre/SM_Trim_MarqueeFascia.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f3ddfbafd5bcc99378d0c4818250d2e61aac372e9c1e8914fa4f0c7ca1e004df +oid sha256:8ebe7b2bc839c641df2b95f154ed02fdb42388253514b8418cd70c29af67e0c4 size 72438 diff --git a/Game/GigLine/Content/Hollywood/Theatre/SM_Trim_MarqueeSoffit.uasset b/Game/GigLine/Content/Hollywood/Theatre/SM_Trim_MarqueeSoffit.uasset index fc5adcc..df4d806 100644 --- a/Game/GigLine/Content/Hollywood/Theatre/SM_Trim_MarqueeSoffit.uasset +++ b/Game/GigLine/Content/Hollywood/Theatre/SM_Trim_MarqueeSoffit.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:91a1c11ec799f2e661f890b381b92388d34c324a10631f02c6385e891d77b594 +oid sha256:b8265121a70e3764d94a03baba76a978580f8c72d47f7bfc99f892144b195910 size 72413 diff --git a/Game/GigLine/Content/Test/Character/CharacterJeans.uasset b/Game/GigLine/Content/Test/Character/CharacterJeans.uasset new file mode 100644 index 0000000..c780c28 --- /dev/null +++ b/Game/GigLine/Content/Test/Character/CharacterJeans.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:30343da2b0d68148d6429367b9b4be8ad5b3043601dee2b0d0cd7ad877b61d00 +size 1068248 diff --git a/Game/GigLine/Content/Test/Character/CharacterJeans_Skeleton.uasset b/Game/GigLine/Content/Test/Character/CharacterJeans_Skeleton.uasset new file mode 100644 index 0000000..e2c75c9 --- /dev/null +++ b/Game/GigLine/Content/Test/Character/CharacterJeans_Skeleton.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b7a09425ef9659f279a9556c1a4f1a6908575b18e41e4212d5484a1c93dcf9ce +size 29892 diff --git a/Game/GigLine/Content/Test/Character/CharacterShoes.uasset b/Game/GigLine/Content/Test/Character/CharacterShoes.uasset new file mode 100644 index 0000000..e9b6036 --- /dev/null +++ b/Game/GigLine/Content/Test/Character/CharacterShoes.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0f726d0e2a9f65363aeba44056054619f5695fa4cc06a0e47cff0802bbaf398f +size 1337081 diff --git a/Game/GigLine/Content/Test/Character/CharacterShoes_Skeleton.uasset b/Game/GigLine/Content/Test/Character/CharacterShoes_Skeleton.uasset new file mode 100644 index 0000000..49748c3 --- /dev/null +++ b/Game/GigLine/Content/Test/Character/CharacterShoes_Skeleton.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:91911a36719c449c40468ce27c40f4fc7abd633f916fa5b0207ee7ee104fee2c +size 29892 diff --git a/Game/GigLine/Content/Test/Character/CharacterTee.uasset b/Game/GigLine/Content/Test/Character/CharacterTee.uasset new file mode 100644 index 0000000..a85ce77 --- /dev/null +++ b/Game/GigLine/Content/Test/Character/CharacterTee.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:53e6ba455263681f9e1c39b438642ce94b16f41c0a51279aa172be16a37717d8 +size 1130508 diff --git a/Game/GigLine/Content/Test/Character/CharacterTee_Skeleton.uasset b/Game/GigLine/Content/Test/Character/CharacterTee_Skeleton.uasset new file mode 100644 index 0000000..5887456 --- /dev/null +++ b/Game/GigLine/Content/Test/Character/CharacterTee_Skeleton.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:649e40ffa8d79d3bd1c1ed49e1059466b9544bdd1d276a848e3ee791b1bc1b96 +size 29876 diff --git a/Game/GigLine/Content/Test/Character/M_Char_jeans.uasset b/Game/GigLine/Content/Test/Character/M_Char_jeans.uasset new file mode 100644 index 0000000..38a84d2 --- /dev/null +++ b/Game/GigLine/Content/Test/Character/M_Char_jeans.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:053b24b7fd538ba86d9cc38c7802611c45e8b867ec3b539576825fd2c82ba20d +size 56611 diff --git a/Game/GigLine/Content/Test/Character/M_Char_shoes.uasset b/Game/GigLine/Content/Test/Character/M_Char_shoes.uasset new file mode 100644 index 0000000..e4d3fdd --- /dev/null +++ b/Game/GigLine/Content/Test/Character/M_Char_shoes.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:032d75d76536afe92a10dbc5ed0cdf5c76dc3df1a147d2d07296777356a2bc5f +size 56611 diff --git a/Game/GigLine/Content/Test/Character/M_Char_tee.uasset b/Game/GigLine/Content/Test/Character/M_Char_tee.uasset new file mode 100644 index 0000000..4beae9a --- /dev/null +++ b/Game/GigLine/Content/Test/Character/M_Char_tee.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9f17000d34a07012fa5b4c59b071f4c037c927c85d27e97d77727c4cc8cbd165 +size 56565 diff --git a/Game/GigLine/Content/Test/ReviewMap.umap b/Game/GigLine/Content/Test/ReviewMap.umap index d096902..1bc57cd 100644 --- a/Game/GigLine/Content/Test/ReviewMap.umap +++ b/Game/GigLine/Content/Test/ReviewMap.umap @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:62cfb637d094a22cc8f60cb406117a53f2a530cd7c905c08dfdb6e68d912aeef -size 29694 +oid sha256:f8724029a034d68eb377dc2930e3fb97f8088a61dbbdf06d28833df02069e955 +size 30542 diff --git a/Game/GigLine/Source/GigLine/GigLineCharacter.cpp b/Game/GigLine/Source/GigLine/GigLineCharacter.cpp index 3a9717d..8d958fd 100644 --- a/Game/GigLine/Source/GigLine/GigLineCharacter.cpp +++ b/Game/GigLine/Source/GigLine/GigLineCharacter.cpp @@ -117,6 +117,30 @@ AGigLineCharacter::AGigLineCharacter() HairMesh->SetLeaderPoseComponent(GetMesh()); } + // Garments: tee, jeans, shoes. Each is its own mesh with its own single material, + // attached to the capsule and posed from the body so there is no second rig. + static const TCHAR* GarmentPaths[] = { + TEXT("/Game/Test/Character/CharacterTee.CharacterTee"), + TEXT("/Game/Test/Character/CharacterJeans.CharacterJeans"), + TEXT("/Game/Test/Character/CharacterShoes.CharacterShoes"), + }; + for (const TCHAR* Path : GarmentPaths) + { + USkeletalMeshComponent* Piece = CreateDefaultSubobject( + FName(*FString::Printf(TEXT("Cloth_%s"), *FPaths::GetBaseFilename(Path)))); + Piece->SetupAttachment(GetCapsuleComponent()); + Piece->SetCollisionEnabled(ECollisionEnabled::NoCollision); + Piece->SetHiddenInGame(true); + Piece->SetRelativeLocation(FVector(0.0f, 0.0f, -87.5f)); + Piece->SetRelativeRotation(FRotator(0.0f, -90.0f, 0.0f)); + if (USkeletalMesh* Mesh = LoadObject(nullptr, Path)) + { + Piece->SetSkeletalMesh(Mesh); + Piece->SetLeaderPoseComponent(GetMesh()); + } + Clothing.Add(Piece); + } + // Third-person boom. bDoCollisionTest is the camera-collision feature: the arm // shortens when something is between the pivot and the desired camera position. ThirdPersonArm = CreateDefaultSubobject(TEXT("ThirdPersonArm")); @@ -826,6 +850,13 @@ void AGigLineCharacter::ToggleCamera() { HairMesh->SetHiddenInGame(!bThirdPerson); } + for (USkeletalMeshComponent* Piece : Clothing) + { + if (Piece) + { + Piece->SetHiddenInGame(!bThirdPerson); + } + } if (bThirdPerson) { UpdateBodyAnimation(); diff --git a/Game/GigLine/Source/GigLine/GigLineCharacter.h b/Game/GigLine/Source/GigLine/GigLineCharacter.h index 601c530..4759592 100644 --- a/Game/GigLine/Source/GigLine/GigLineCharacter.h +++ b/Game/GigLine/Source/GigLine/GigLineCharacter.h @@ -166,6 +166,16 @@ protected: UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Body") TObjectPtr HairMesh; + /** + * Garments, each its own skeletal mesh on a leader pose component. + * + * The character-artist skill keeps clothing separate so a piece can be swapped or + * re-materialled on its own; it also sidesteps the material-slot collapse that + * makes joined multi-material meshes arrive with one slot. + */ + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Body") + TArray> Clothing; + UPROPERTY() TObjectPtr IdleAnimation; diff --git a/MEMORY.md b/MEMORY.md index a7e49b5..148dfc2 100644 --- a/MEMORY.md +++ b/MEMORY.md @@ -505,3 +505,6 @@ Scope: facts and traps that cost time to establish. Planned work lives in [TODO. - **Segmenting the character out of a review shot does not work by colour.** The sky band, the pale wall and the dark pavement are each larger and more saturated than the body, so every size-based rule picked a backdrop blob and the first report measured the whole frame. `Tools/character_match.py` now takes an explicit `--render-box`; the proper fix is a background plate rendered without the character. - **The report has to separate the failures it measures.** Aspect, fill, coverage and two colour distances are reported apart on purpose: an absolute similarity number between a photoreal sheet and a low-detail body would mean nothing. The first real comparison (aspect Δ1.24, mean ΔE 31.9) was dominated by the model being **unclothed** while the blueprint wears a tee and jeans. - **`SetMaterial(0, ...)` in the pawn constructor does not visibly land** on the body mesh: `M_Character_Skin` is built and assigned, yet the render stays neutral grey. Either the slot does not exist yet at that point or the assignment is dropped; `BeginPlay` is the next thing to try. +- **MPFB vertex groups are polluted by helper geometry.** The body mesh weights its helper cubes to groups named `Left`, `Right`, `HelperGeometry` and `JointCubes` at 1.0, so a "strongest group" lookup returns a helper for most vertices - the first clothing build selected **zero** faces. Filter helper names out before asking which bone a vertex belongs to. +- **Blender refuses to apply a modifier to a mesh with shape keys.** The body carries ten; a garment copy must clear them (`shape_key_remove(all=True)`) before solidify can be applied. +- **Edit-mode selection reverts to vertex selection.** Setting `polygon.select` in object mode and then entering edit mode re-derives selection from the vertices, which were all still selected - deleting "the unselected faces" wiped the entire garment. Filter with `bmesh.ops.delete(context="FACES")` instead. diff --git a/Screenshots/demo/review-demo-crossing.png b/Screenshots/demo/review-demo-crossing.png index a5a409b..2fcce98 100644 --- a/Screenshots/demo/review-demo-crossing.png +++ b/Screenshots/demo/review-demo-crossing.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0b4f3e30949fa1c9a8600ed91d53520face8bc8468cd028b4aac4659b794de7b -size 3089070 +oid sha256:f81f49911a7bb9aacd53876b879065b6ec120d027f484c5ee96b6b582cc595c7 +size 3090004 diff --git a/Screenshots/demo/review-demo-north-buildings.png b/Screenshots/demo/review-demo-north-buildings.png index 84459e1..a767a08 100644 --- a/Screenshots/demo/review-demo-north-buildings.png +++ b/Screenshots/demo/review-demo-north-buildings.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6799bc0877d804a3fd9843b6d4cba11424da973f0faf8eff76f48cb32c4c375e -size 2618462 +oid sha256:cd6959f464cf447884ff70c8e8e113bd819a7e03ce7a2af7ced03226b8898462 +size 2620154 diff --git a/Screenshots/demo/review-demo-retail-frontage.png b/Screenshots/demo/review-demo-retail-frontage.png index 131d32b..67411f6 100644 --- a/Screenshots/demo/review-demo-retail-frontage.png +++ b/Screenshots/demo/review-demo-retail-frontage.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:83b391960a3d82a83c883d7281f990a7c3c2b578a9025b05e8069a0c7dcb6c01 -size 2521541 +oid sha256:e440d59b2ef60fadbcb976d1bbc793e053bfc07ceaef8aded17d085c2dc3ea19 +size 2524127 diff --git a/Screenshots/demo/review-demo-spawn-view.png b/Screenshots/demo/review-demo-spawn-view.png index 198256e..23a03ce 100644 --- a/Screenshots/demo/review-demo-spawn-view.png +++ b/Screenshots/demo/review-demo-spawn-view.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9cda1db8213fffb97c219041fad585ae296869669d86456f9676a23b6a35e6ee -size 2938130 +oid sha256:630df4f6bb32c3c9d84ffd564ce1b327259d3f66b5c2844ddc4c9f238fb78cd4 +size 2934218 diff --git a/Screenshots/demo/review-demo-street-level.png b/Screenshots/demo/review-demo-street-level.png index 20ac6d5..c142181 100644 --- a/Screenshots/demo/review-demo-street-level.png +++ b/Screenshots/demo/review-demo-street-level.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2301692535e0368749fbbf4218502107b001c2e6776b4c5ec0f0f575d67042f7 -size 2851281 +oid sha256:0fbfe443aac4620af516b912bf127bfd0930a663c5ed17ec3dff37baabc0b3a9 +size 2849095 diff --git a/Screenshots/demo/review-demo-third-person-front.png b/Screenshots/demo/review-demo-third-person-front.png index 01b4a40..210ad7f 100644 --- a/Screenshots/demo/review-demo-third-person-front.png +++ b/Screenshots/demo/review-demo-third-person-front.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b5435c34d7e8d2e2d525834f791766645c426905e900416b735915b61f1022d6 -size 2794992 +oid sha256:83c2285fb767d5ee9eab73d2abf12b8d23e0fcae5c18d60feef3c1ddd6532baa +size 2793641 diff --git a/Screenshots/demo/review-demo-third-person-walk.png b/Screenshots/demo/review-demo-third-person-walk.png index ccb910b..e4be209 100644 --- a/Screenshots/demo/review-demo-third-person-walk.png +++ b/Screenshots/demo/review-demo-third-person-walk.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b09a33aaf05e1d0f974c328c15ca6f873f3a15a53b2835ddde448ce00837ea99 -size 2185715 +oid sha256:62d0d57bbb40bc0fe2e3ea6a22dd0d4ca572143b0e10bcd2f0df91de21861720 +size 2155728 diff --git a/Screenshots/demo/review-demo-third-person.png b/Screenshots/demo/review-demo-third-person.png index efb6a67..7412a8c 100644 --- a/Screenshots/demo/review-demo-third-person.png +++ b/Screenshots/demo/review-demo-third-person.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:36622b16a60f68ddaf18e0fd1479eb6c97970a326ef92a5830bf3ce45273378f -size 3001358 +oid sha256:ab85571608f91aa13368cebdfb0f5eddf0b2e3231325a2b573f31ebe88ca9397 +size 3003366 diff --git a/TODO.md b/TODO.md index 93cd910..3b492f3 100644 --- a/TODO.md +++ b/TODO.md @@ -22,7 +22,9 @@ Actionable task list for this project. This file is the single, central place fo - **The card layout now hugs the skull.** Each card is oriented by the scalp normal at its anchor — the length runs along the downward tangent, the width across it, and a small lift at the tip gives the cut volume. Three overlapping rows (7/9/10 cards, 26 total, 468 tris) replaced the single outward-pointing ring that read as a spiked crown. Overlap is what stops cards reading as separate spikes. - **Skin still needs work.** `M_Character_Skin` (constant tone 0.62/0.42/0.33, roughness 0.58) is built and the pawn calls `SetMaterial(0, ...)`, but the body still renders neutral grey in review shots, so the assignment is not taking. The baked `T_Character_Diffuse` cannot be used either: sampling it renders the body black, so the MPFB mesh's UVs do not map onto that bake. Next: verify the slot index after `SetSkeletalMesh`, or assign in `BeginPlay` instead of the constructor. - **Character blueprint and evaluation tools exist.** `Tools/comfyui_character_blueprint.py` generates a four-view sheet (front/side/back/head) from one description with fixed seeds; `Tools/character_match.py` compares a render against it and reports aspect, fill, coverage, mean CIE76 and palette distance plus a side-by-side montage. First result against `Screenshots/demo/review-demo-third-person-front.png`: **aspect delta 1.24, fill delta 0.12, mean ΔE 31.9, palette ΔE 25.4** — and the montage shows why: the model is a **nude body**, the blueprint is clothed (navy tee, jeans, sneakers). - - **Clothing is the largest visible gap** and is not in this patch's scope: the body carries no garments, so every colour and silhouette metric is dominated by the missing clothes rather than by skin or hair tuning. + - **Clothing exists now** (`Tools/character_clothing_build.py` + `Tools/ue_character_clothing_import.py`): tee, jeans and shoes as three separate skinned meshes, built from the body's own faces per the character-artist workflow (duplicate faces, solidify for thickness, one mesh per piece), imported as `CharacterTee` / `CharacterJeans` / `CharacterShoes` and attached as leader-pose components. The navy tee, dark jeans and off-white shoes read correctly at review distance. + - **The garments have coverage holes.** Grey skin shows through at the shoulders, hips and knees. Solidify offset (1 cm) is not enough where the body is convex, and trimming by x-width removes faces the body then shows through. Next: raise the offset, or grow the garment along its own normals after the solidify. + - **Hair reads light and wispy** since its material instance was repointed to `M_Character_Hair_Mat` (masked strand sheet): the alpha is cutting the cards into separate hairs and the base colour is being lifted by the texture. Either darken the texture or drive colour from a constant and use the sheet only as an opacity mask. - **Figure segmentation is explicit, not automatic.** Auto-detection failed on the review shots: the backdrop (sky band, pale wall, dark pavement) is larger and more saturated than the subject, so every size-based rule picked a backdrop blob. `--render-box` takes the figure box as fractions of the frame. A background plate rendered without the character would make this automatic. - `Tools/ue_character_materials.py` (wiring the generated textures into the skin and hair materials) **segfaults in the headless commandlet** when it edits the material graph. Not wired; the hair keeps the dark base colour it carries from Blender. Needs either an editor-session run or a material asset built from scratch instead of edited in place. diff --git a/Tools/character_clothing_build.py b/Tools/character_clothing_build.py new file mode 100644 index 0000000..798c109 --- /dev/null +++ b/Tools/character_clothing_build.py @@ -0,0 +1,218 @@ +#!/usr/bin/env python3 +"""Build the character's clothing as separate skinned meshes. + +The `character-artist` skill's clothing workflow, followed literally: duplicate body +faces for the clothing base, solidify for cloth thickness, and keep each piece a +separate mesh so it can be swapped or re-materialled on its own. + + blender -b Art/blender/character/character-2026-11-07.blend \ + --python Tools/character_clothing_build.py -- \ + --out /tmp/gigline/clothing --report /tmp/gigline/clothing.json + +Outputs one FBX per garment (`tee`, `jeans`, `shoes`), each carrying the character +armature so Unreal imports it as a skeletal mesh with the body's skeleton. + +Selection is by **dominant vertex group**, not by height band alone: a z-range band +would swallow the arms hanging at the sides, and the arms have to stay bare below the +cap sleeves. Each garment lists the bones whose weights it accepts. +""" + +from __future__ import annotations + +import argparse +import json +import os +import sys + +import bpy + +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +import fbx_export_preset as fbx_preset # noqa: E402 + +GARMENTS = ( + { + "name": "tee", + "asset": "SM_Char_Cloth_Tee", + "bones": ["spine01", "spine02", "spine03", "spine04", "spine05", + "clavicle.L", "clavicle.R", "shoulder01.L", "shoulder01.R", + "upperarm01.L", "upperarm01.R", "breast.L", "breast.R", + "neck01", "neck02", "pelvis.L", "pelvis.R"], + "z_min": 0.90, "z_max": 1.44, + "x_max": 0.235, # trims the bare arms out of the tee + "use_bones": False, + "thickness": 0.009, + "colour": (0.020, 0.032, 0.075, 1.0), # navy cotton + "roughness": 0.78, + }, + { + "name": "jeans", + "asset": "SM_Char_Cloth_Jeans", + "bones": ["pelvis.L", "pelvis.R", "upperleg01.L", "upperleg01.R", + "upperleg02.L", "upperleg02.R", "lowerleg01.L", "lowerleg01.R", + "lowerleg02.L", "lowerleg02.R", "spine01"], + "z_min": 0.06, "z_max": 1.06, + "x_max": 0.30, + "use_bones": False, + "thickness": 0.010, + "colour": (0.032, 0.055, 0.105, 1.0), # dark denim + "roughness": 0.62, + }, + { + "name": "shoes", + "asset": "SM_Char_Cloth_Shoes", + "bones": ["foot.L", "foot.R", "toe1-1.L", "toe1-1.R", + "lowerleg02.L", "lowerleg02.R"], + "z_min": -0.05, "z_max": 0.16, + "x_max": 0.40, + "use_bones": False, + "thickness": 0.012, + "colour": (0.72, 0.71, 0.68, 1.0), # off-white canvas + "roughness": 0.55, + }, +) + +PARTS: list[str] = [] + + +def log(message: str) -> None: + PARTS.append(message) + print(f"[cloth] {message}") + + +# MPFB ships helper geometry in the same mesh, weighted 1.0 to groups called +# 'Left', 'Right', 'HelperGeometry' and 'JointCubes'. Those dominate the raw weights, +# so the first build selected zero faces: every vertex's strongest group was a helper. +_HELPER_PREFIXES = ("helper", "joint", "Helper", "Joint") +_HELPER_NAMES = {"Left", "Right", "Mid", "body", "HelperGeometry", "JointCubes"} + + +def is_deform_bone(name: str) -> bool: + return bool(name) and not name.startswith(_HELPER_PREFIXES) and name not in _HELPER_NAMES + + +def dominant_groups(mesh) -> dict[int, str]: + """Vertex index -> its strongest *deforming bone* group, ignoring helpers.""" + index_to_name = {g.index: g.name for g in mesh.vertex_groups} + result = {} + for vertex in mesh.data.vertices: + candidates = [(g.weight, index_to_name.get(g.group, "")) for g in vertex.groups] + candidates = [(w, n) for w, n in candidates if is_deform_bone(n)] + if not candidates: + continue + result[vertex.index] = max(candidates)[1] + return result + + +def build_garment(body, arm, spec, out_dir): + bpy.ops.object.select_all(action="DESELECT") + body.select_set(True) + bpy.context.view_layer.objects.active = body + bpy.ops.object.duplicate() + garment = bpy.context.active_object + garment.name = spec["asset"] + + allowed = set(spec["bones"]) + dominant = dominant_groups(body) + + mesh = garment.data + # Filter with bmesh instead of edit-mode selection. Setting polygon.select in + # object mode and then entering edit mode re-derives selection from the vertices, + # which were still all selected - the delete wiped the whole garment every time. + import bmesh + bm = bmesh.new() + bm.from_mesh(mesh) + doomed = [] + for face in bm.faces: + centre_z = sum(v.co.z for v in face.verts) / len(face.verts) + groups = [dominant.get(v.index, "") for v in face.verts] + centre_x = abs(sum(v.co.x for v in face.verts) / len(face.verts)) + keep = (spec["z_min"] <= centre_z <= spec["z_max"] + and centre_x <= spec.get("x_max", 10.0) + and (not spec.get("use_bones") or any(g in allowed for g in groups))) + face.tag = keep + if not keep: + doomed.append(face) + bmesh.ops.delete(bm, geom=doomed, context="FACES") + bm.to_mesh(mesh) + bm.free() + mesh.update() + log(f"{spec['asset']}: kept {len(mesh.polygons)} faces") + + if not mesh.polygons: + log(f"{spec['asset']}: no faces selected - check the bone list and z range") + return None + + # The body carries MPFB shape keys, and Blender refuses to apply a modifier to a + # mesh that has any. A garment does not need the morph targets. + if garment.data.shape_keys: + bpy.ops.object.shape_key_remove(all=True) + + # Cloth thickness: solidify outward so the garment sits over the body rather + # than inside it. + solidify = garment.modifiers.new(name="Cloth", type="SOLIDIFY") + solidify.thickness = spec["thickness"] + solidify.offset = 1.0 + bpy.ops.object.modifier_apply(modifier=solidify.name) + + material = bpy.data.materials.get(f"M_Char_{spec['name']}") \ + or bpy.data.materials.new(f"M_Char_{spec['name']}") + material.use_nodes = True + bsdf = material.node_tree.nodes.get("Principled BSDF") + if bsdf: + bsdf.inputs["Base Color"].default_value = spec["colour"] + bsdf.inputs["Roughness"].default_value = spec["roughness"] + garment.data.materials.clear() + garment.data.materials.append(material) + + bpy.ops.object.select_all(action="DESELECT") + arm.select_set(True) + garment.select_set(True) + bpy.context.view_layer.objects.active = arm + path = os.path.join(out_dir, f"{spec['name']}.fbx") + fbx_preset.export_character(path, selection=True) + + stats = { + "asset": spec["asset"], + "file": path, + "vertices": len(garment.data.vertices), + "triangles": sum(len(p.vertices) - 2 for p in garment.data.polygons), + "thickness_m": spec["thickness"], + "bones": spec["bones"], + "z_range": [spec["z_min"], spec["z_max"]], + "colour": spec["colour"], + "roughness": spec["roughness"], + } + log(f"{spec['asset']}: {stats['vertices']} verts, {stats['triangles']} tris -> {path}") + return stats + + +def main(argv=None) -> int: + argv = sys.argv[sys.argv.index("--") + 1:] if "--" in sys.argv else [] + ap = argparse.ArgumentParser(description=__doc__, + formatter_class=argparse.RawDescriptionHelpFormatter) + ap.add_argument("--out", default="/tmp/gigline/clothing") + ap.add_argument("--report", default=None) + args = ap.parse_args(argv) + + arm = next((o for o in bpy.data.objects if o.type == "ARMATURE"), None) + body = next((o for o in bpy.data.objects if o.type == "MESH" and o.parent == arm), None) + if arm is None or body is None: + raise SystemExit("need the character armature and its body mesh") + log(f"body {body.name}: {len(body.data.vertices)} verts") + + os.makedirs(args.out, exist_ok=True) + built = [] + for spec in GARMENTS: + stats = build_garment(body, arm, spec, args.out) + if stats: + built.append(stats) + + if args.report: + with open(args.report, "w") as handle: + json.dump({"garments": built, "log": PARTS}, handle, indent=2) + print(f"[cloth] report -> {args.report}") + return 0 if len(built) == len(GARMENTS) else 1 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/Tools/ue_character_clothing_import.py b/Tools/ue_character_clothing_import.py new file mode 100644 index 0000000..827a8d9 --- /dev/null +++ b/Tools/ue_character_clothing_import.py @@ -0,0 +1,71 @@ +# Import the garment meshes as separate skeletal meshes (0.2.2). +# +# blender -b Art/blender/character/character-2026-11-07.blend \ +# --python Tools/character_clothing_build.py -- --out /tmp/gigline/clothing +# /Engine/Binaries/Linux/UnrealEditor-Cmd -run=pythonscript \ +# -script=/Tools/ue_character_clothing_import.py -nullrhi -unattended -nopause -stdout +# +# Each garment is its own asset, per the character-artist skill's rule that clothing +# stays separate so it can be swapped or re-materialled. The pawn attaches each one as +# a component using the body as the leader pose. +# +# Result file: /tmp/gigline/character-clothing-import.txt + +import unreal + +DEST = "/Game/Test/Character" +SOURCE = "/tmp/gigline/clothing" +GARMENTS = (("tee", "CharacterTee"), ("jeans", "CharacterJeans"), ("shoes", "CharacterShoes")) +RESULT = "/tmp/gigline/character-clothing-import.txt" +lines = [] + + +def log(msg): + lines.append(str(msg)) + unreal.log(str(msg)) + + +def main(): + for source, name in GARMENTS: + task = unreal.AssetImportTask() + task.filename = f"{SOURCE}/{source}.fbx" + task.destination_path = DEST + task.destination_name = name + task.automated = True + task.save = True + task.replace_existing = True + + ui = unreal.FbxImportUI() + ui.import_mesh = True + ui.import_as_skeletal = True + ui.import_animations = False + ui.import_materials = True + ui.import_textures = False + ui.skeletal_mesh_import_data.import_uniform_scale = 1.0 + task.options = ui + unreal.AssetToolsHelpers.get_asset_tools().import_asset_tasks([task]) + + mesh = unreal.EditorAssetLibrary.load_asset(f"{DEST}/{name}") + if mesh is None: + log(f"{name}: MISSING after import") + lines.append("VERDICT: FAIL") + return + mats = mesh.get_editor_property("materials") + log(f"{name}: imported, {len(mats)} slot(s): " + + ", ".join((m.get_editor_property("material_interface").get_name() + if m.get_editor_property("material_interface") else "None") + for m in mats)) + lines.append("VERDICT: PASS") + + +try: + main() +except Exception as exc: # noqa: BLE001 + import traceback + log(f"FAILED: {type(exc).__name__}: {exc}") + log(traceback.format_exc()) + lines.append("VERDICT: FAIL") + +unreal.EditorLoadingAndSavingUtils.save_dirty_packages(True, True) +with open(RESULT, "w") as f: + f.write("\n".join(lines) + "\n")