diff --git a/Art/blender/vehicle/hot hatch.blend b/Art/blender/vehicle/hot hatch.blend new file mode 100644 index 0000000..1c25f7e --- /dev/null +++ b/Art/blender/vehicle/hot hatch.blend @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eadaaa28d60dcc97f7d101432852f9f31e8bf74b92f041d7520d1904591b3bfe +size 15292452 diff --git a/Game/GigLine/Content/Hollywood/DemoMap.umap b/Game/GigLine/Content/Hollywood/DemoMap.umap index 8062b75..2620196 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:404e12a156688d7b2015c949747f99950875f1e41b82024dd70f71ffe51aef20 -size 797320 +oid sha256:4c48ac43f690e8bcbbac8d3e16bf249bc4984cdda4afff31c0a70e4a05ac1b52 +size 790438 diff --git a/Game/GigLine/Content/Hollywood/Site/M_Asphalt.uasset b/Game/GigLine/Content/Hollywood/Site/M_Asphalt.uasset index 68d40fe..40201a1 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:a9a02a44ad879311295d925a7f0293e52bc1ccea580ff43f2942337a5f6731a3 +oid sha256:f28d4be29876f55e11eefce0c5b0ad7d90f0f440331f0717791ff8e9aff2c770 size 10019 diff --git a/Game/GigLine/Content/Hollywood/Site/M_Concrete.uasset b/Game/GigLine/Content/Hollywood/Site/M_Concrete.uasset index 6ee0f3d..a12c1ee 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:08db17e0ce9cda11a1c6667e14eb2c66a483016ac9cfd7f303298e57ab8f7b71 +oid sha256:bb3ba71852d0b59c6dd18ab4739d387d4675b792d90bfcf3e15fb54cf4f35019 size 10024 diff --git a/Game/GigLine/Content/Hollywood/Site/M_FacadeBanner.uasset b/Game/GigLine/Content/Hollywood/Site/M_FacadeBanner.uasset index a8ac435..52d35b1 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:4343a57e53dec3cb5cb555c44b8074ad4019bcbefbfb5532c4a7d53d8488d8e5 +oid sha256:a6e101040da7ee107da0bdb5c268a51bf8f8437fe09cc57a480a65bec6e9de7d size 11419 diff --git a/Game/GigLine/Content/Hollywood/Site/M_FacadeGlass.uasset b/Game/GigLine/Content/Hollywood/Site/M_FacadeGlass.uasset index 919e668..9c65847 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:21bbecb597e7968325f9230e3b85a9fdcb7afb58738a6943fcb02a079c69111c +oid sha256:385c6b7ecbeee26bae5f7c56c6d357fd929902c215fa267986316476541140e1 size 11414 diff --git a/Game/GigLine/Content/Hollywood/Site/M_FacadeStone.uasset b/Game/GigLine/Content/Hollywood/Site/M_FacadeStone.uasset index 8545ce1..65d3964 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:f112f8b4c3b196cae1e5c5eff07bc6292ec40d9f01670e0e6e9ea5db08f990cb +oid sha256:b6da3a6a667bb35d75382ebe31e8e12dee9eb64bdf05ede729f013214563b8d1 size 17083 diff --git a/Game/GigLine/Content/Hollywood/Site/M_FacadeStoneShadow.uasset b/Game/GigLine/Content/Hollywood/Site/M_FacadeStoneShadow.uasset index 7cd51a8..b6affb6 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:a0fc322f0101a85685210b3f7a7988351e70ffeb63772d18b66b96f3e8800dc7 +oid sha256:7bc5b327e35f100af836b7aab22917cea4e01c2e7aa13921be16fad3c960a922 size 17113 diff --git a/Game/GigLine/Content/Hollywood/Site/M_Ground.uasset b/Game/GigLine/Content/Hollywood/Site/M_Ground.uasset index bb4e12c..93ca609 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:2ef441aedb7161006a372d965c6090b2a09bdf01a04e71eee723c680587f72ce +oid sha256:048640d97683a99732dd98f90c1cd7b2298f6d3c432e470bc85807a539165303 size 10014 diff --git a/Game/GigLine/Content/Hollywood/Site/M_KerbConcrete.uasset b/Game/GigLine/Content/Hollywood/Site/M_KerbConcrete.uasset index 60d6a21..8df0b58 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:86469e7ae36decf86a609d5522c23213767812fc52cda2abafe4a00cee39461c +oid sha256:674870970ed75d3e44f14aa9049429bc2db43a2121201461b2e2afebb0ef1591 size 10044 diff --git a/Game/GigLine/Content/Hollywood/Site/M_RoadPaint.uasset b/Game/GigLine/Content/Hollywood/Site/M_RoadPaint.uasset index 8b23827..27988ba 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:eebcd74a32944fa7faadb0a4b2c1f3ad9353ba3e3d4316fcd9319786d381db54 +oid sha256:eda6a7e146462a166de8939cc35262722fc42c9b53ddfecfc174055415ee59da size 10029 diff --git a/Game/GigLine/Content/Hollywood/Site/M_Stucco.uasset b/Game/GigLine/Content/Hollywood/Site/M_Stucco.uasset index bd93662..517c24e 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:be21e5071e57a9ab24a129619e65a2c75a0cfd479e187d65e599750bd0dd7109 +oid sha256:33f62b7ecd71a4c3906539d544b8c9846aa664cbc8932c0c9c6134d5ad8ad691 size 11389 diff --git a/Game/GigLine/Content/Hollywood/Site/Terrain_DEM.uasset b/Game/GigLine/Content/Hollywood/Site/Terrain_DEM.uasset index 759b748..e2bfda1 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:92afacda552feaf7a852cba076ddece9a2871527f0827f3a2d174c1d551755e1 +oid sha256:457ab1f5147cb99a9c2d80193f9d556dd3fa5cd47021eb6de6d8a2df0982c5f9 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 a66f3ed..c5977de 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:7604882d579d4545b8ef4dbadd8946bc1eb801d5f92d8aa952d8f71c5c4b895d +oid sha256:08522db57c9a9999e6286bf1c178e04be2c878249f557ffb18dd0572020860be 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 e736d55..c12f481 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:f9922e02e7ce29f8ad2dd508eb09839115cb92370a4fb2b80725ab4cdbfd2368 +oid sha256:649acdfd1504b9c731c0c6806e27f7bf0040ed954bf809857c29578b8abfcfc4 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 1fcefe0..f70710c 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:6dc0a84af3566450ec79586e42cd49ad6c5f215703568f308948282a605ed717 +oid sha256:29dc96005db856f8f1d180a689dcbbad0b1720f372180a3be7ed00eb79238d90 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 755e931..b917d4e 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:05a4f626e62ade3f9acef8b508c8e4884b30b7c8e24c6e3a500ef34ad04d675a +oid sha256:04233133c06877f529a2eac482d236404b6501b05afcc92a9fa4c15b829ab22e 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 1a08707..43e0069 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:a41331f87830ff1728134025b98a9f9a921b0ee8b44fd04326cf05f0b1b68f85 +oid sha256:505d45e417f1e0bfd483c855f17e524e6e11e41a466cada9a97096882b05e088 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 db3413e..c05c598 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:078155f9861085a68f947103e708f5b100ce94643b4afb4f2088ef3b6066810f +oid sha256:b059b788a06ee8cb993ac33f3cf4f75ac537dd5fbfcef76e034f1a5125f2c0d3 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 17268d9..c4bf8fb 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:d9119dee37a0b737bab3d9eb1f567e98f8921a49c78aa06971ff8a93ecec4074 +oid sha256:c78d4272958fe897b98760b1f5029090771ac1aa8797f4c1c170f47002615b26 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 12e80fe..109e6b3 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:837dcf397680570762e0a74b4992d14616d732cb8d91b04e7e34749c321e1db4 +oid sha256:a02b1100d5fc912577d884a7f0ee3d229b441247d3378df066de9a436b4b3abd 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 4c9e3e2..9bfe393 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:85d50cb2d06c5e8969cfb31e7c2458f43777de8aa52680d26853fe02b0a5b5b7 +oid sha256:1d69cca0ab9387949067a77f943e001a0f10ac4be657ef537942233a21bdc5ea 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 28da028..a0d05a0 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:d80199a1f7abdd7294fcedbe7c5ebba22ed20f8ba10cab3af8a20d7831decc44 +oid sha256:07bbc3c239f003b3f452c71e3d3635177c5af62edd53fc9924cf60622055c31c 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 aa6a748..8be19ff 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:608dd8d23a99bf01cacf1c3570188ea4ac9ef86038e7cd20e4f8756571bbae52 +oid sha256:178b013d5045c185210b64d287d7c550742dbfe663e1f9bc3237ec81161d0a09 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 877c6d1..091c4b3 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:58e4ddc7e4cfd95e31b21ef80c77ae3c6546503dd64f34a395ce1d5c78d84f51 +oid sha256:1509b7cc385800ee9a8e781f7590120e1299bf351d3e1e39dac8347bffbf3cfb 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 a5901f8..b409ccd 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:a3b32c0ccc3befaae9d98f9a52f988a75735b0d2c630fee51be25a56b57f2255 +oid sha256:b141c225d0a67c19c593bfa457033859942393ef4c4b19e3d1146eb4f66c944b 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 3417c2d..1ba8433 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:ea5b749ed386c4d1cd5eefd6d3f02f7a214a8edca722d95bbbfe729f27cf99d0 +oid sha256:8f6ff992d78511932d158257b87a40585079ef17f2384ef4c589d5377aa159aa size 72413 diff --git a/Game/GigLine/Content/Hollywood/Vehicle/SM_Vehicle_Body.uasset b/Game/GigLine/Content/Hollywood/Vehicle/SM_Vehicle_Body.uasset index f29f254..0798484 100644 --- a/Game/GigLine/Content/Hollywood/Vehicle/SM_Vehicle_Body.uasset +++ b/Game/GigLine/Content/Hollywood/Vehicle/SM_Vehicle_Body.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0edff2128161a1d113449c3a849df2a9a9b1e37f47ad2bf608ac1465a7c870a0 -size 84317 +oid sha256:99f56daee44e7dc4b886f3e2251c22137b03c7cbcd105cf83853e0c967f03a25 +size 2971486 diff --git a/Game/GigLine/Content/Hollywood/Vehicle/SM_Vehicle_Body_LOD1.uasset b/Game/GigLine/Content/Hollywood/Vehicle/SM_Vehicle_Body_LOD1.uasset index 16ef7b1..f1add34 100644 --- a/Game/GigLine/Content/Hollywood/Vehicle/SM_Vehicle_Body_LOD1.uasset +++ b/Game/GigLine/Content/Hollywood/Vehicle/SM_Vehicle_Body_LOD1.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5e1d4112392bc169a04fc5cfc11b8bb75e618f9723008bf5694ad45ace1d1678 -size 83801 +oid sha256:e4bb5d4078fc4b7de7743eb3e980d1771c9b460a96e2487b1fe8a2ac4028b713 +size 1417611 diff --git a/Game/GigLine/Content/Hollywood/Vehicle/SM_Vehicle_Body_LOD2.uasset b/Game/GigLine/Content/Hollywood/Vehicle/SM_Vehicle_Body_LOD2.uasset index 2bc0dba..03ecb53 100644 --- a/Game/GigLine/Content/Hollywood/Vehicle/SM_Vehicle_Body_LOD2.uasset +++ b/Game/GigLine/Content/Hollywood/Vehicle/SM_Vehicle_Body_LOD2.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:466d57262edd6c0f54805b9c68a627ca064219f2393fb1f7b355befeeb90c908 -size 79148 +oid sha256:bb810c05a06608b7a038e18dad7e778ba2098cfd9ea4b010b9e6fea40908584c +size 577867 diff --git a/Game/GigLine/Content/Hollywood/Vehicle/SM_Vehicle_Glass.uasset b/Game/GigLine/Content/Hollywood/Vehicle/SM_Vehicle_Glass.uasset index 4e0c888..fbf92b0 100644 --- a/Game/GigLine/Content/Hollywood/Vehicle/SM_Vehicle_Glass.uasset +++ b/Game/GigLine/Content/Hollywood/Vehicle/SM_Vehicle_Glass.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b3cdaf03455f25ace0e6f08764c56b403653e121366777ae9b5d63bf4b5293a3 -size 75795 +oid sha256:31ac5d53ae2993e9d36667bf6becd33c6416436428c247db8aa5d94aa105d556 +size 637564 diff --git a/Game/GigLine/Content/Hollywood/Vehicle/SM_Vehicle_Lights.uasset b/Game/GigLine/Content/Hollywood/Vehicle/SM_Vehicle_Lights.uasset new file mode 100644 index 0000000..13fc07f --- /dev/null +++ b/Game/GigLine/Content/Hollywood/Vehicle/SM_Vehicle_Lights.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:768e423f06b2dff690d0a6f3aeb6a4dd176c7c4c81ddcae6915dbbbaf89abd21 +size 1106404 diff --git a/Game/GigLine/Content/Hollywood/Vehicle/SM_Vehicle_Trim.uasset b/Game/GigLine/Content/Hollywood/Vehicle/SM_Vehicle_Trim.uasset new file mode 100644 index 0000000..7ae4dbe --- /dev/null +++ b/Game/GigLine/Content/Hollywood/Vehicle/SM_Vehicle_Trim.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:540b5b29083d0b97fb0b46c8e6e319e6dfd2e93a2a053f401b87fa6457d6c7dd +size 394905 diff --git a/Game/GigLine/Content/Hollywood/Vehicle/SM_Vehicle_Wheels.uasset b/Game/GigLine/Content/Hollywood/Vehicle/SM_Vehicle_Wheels.uasset new file mode 100644 index 0000000..63db0dc --- /dev/null +++ b/Game/GigLine/Content/Hollywood/Vehicle/SM_Vehicle_Wheels.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4e69cb23f55e3a57ac7f59d6bbf8feb0de726ce902909abe6148d4d39bd0b550 +size 2571645 diff --git a/Game/GigLine/Content/Hollywood/Vehicle/black_metal.uasset b/Game/GigLine/Content/Hollywood/Vehicle/black_metal.uasset new file mode 100644 index 0000000..398cb84 --- /dev/null +++ b/Game/GigLine/Content/Hollywood/Vehicle/black_metal.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0818338ad583276d9fa0a64aa82028d2c054140ca9b0f6dcf3c2fb4a22948d2d +size 56169 diff --git a/Game/GigLine/Content/Hollywood/Vehicle/black_shiny_metal_.uasset b/Game/GigLine/Content/Hollywood/Vehicle/black_shiny_metal_.uasset new file mode 100644 index 0000000..eaa45ed --- /dev/null +++ b/Game/GigLine/Content/Hollywood/Vehicle/black_shiny_metal_.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b20b9e470f1401ced8a546a407ef1a6680cf9f3f13a2a7f961fe4420bed680de +size 56281 diff --git a/Game/GigLine/Content/Hollywood/Vehicle/brake_caliper.uasset b/Game/GigLine/Content/Hollywood/Vehicle/brake_caliper.uasset new file mode 100644 index 0000000..470689f --- /dev/null +++ b/Game/GigLine/Content/Hollywood/Vehicle/brake_caliper.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e6c800341a8580c2c977681f7af4154bdef3b19ef11e444d30f5e741c222f9c4 +size 56201 diff --git a/Game/GigLine/Content/Hollywood/Vehicle/chrome.uasset b/Game/GigLine/Content/Hollywood/Vehicle/chrome.uasset new file mode 100644 index 0000000..589b454 --- /dev/null +++ b/Game/GigLine/Content/Hollywood/Vehicle/chrome.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7e67aa88741dd2d4cc47a0002f6c8c4317e45f59f4564827e775b94334333325 +size 56083 diff --git a/Game/GigLine/Content/Hollywood/Vehicle/light_cover.uasset b/Game/GigLine/Content/Hollywood/Vehicle/light_cover.uasset new file mode 100644 index 0000000..d49cb52 --- /dev/null +++ b/Game/GigLine/Content/Hollywood/Vehicle/light_cover.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:308d8759557fc554431e3304883819cd657277f6c4b52969cf8bd4f3003c77a0 +size 56169 diff --git a/Game/GigLine/Content/Hollywood/Vehicle/lights.uasset b/Game/GigLine/Content/Hollywood/Vehicle/lights.uasset new file mode 100644 index 0000000..fbd020d --- /dev/null +++ b/Game/GigLine/Content/Hollywood/Vehicle/lights.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ea8ee4b7260a18eca7e68dff5b823f94c4dfb811e31d301b2ebf1c1462ec51f7 +size 56089 diff --git a/Game/GigLine/Content/Hollywood/Vehicle/mirror.uasset b/Game/GigLine/Content/Hollywood/Vehicle/mirror.uasset new file mode 100644 index 0000000..ddf12e6 --- /dev/null +++ b/Game/GigLine/Content/Hollywood/Vehicle/mirror.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9ba6465ed51413f13e5663b53a0d517dd0d3fe7cc0c6cbac50826576bd8577f6 +size 56089 diff --git a/Game/GigLine/Content/Hollywood/Vehicle/orange_light.uasset b/Game/GigLine/Content/Hollywood/Vehicle/orange_light.uasset new file mode 100644 index 0000000..138e1e6 --- /dev/null +++ b/Game/GigLine/Content/Hollywood/Vehicle/orange_light.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:db81928ea490455114bfd0f734edc03d6a32e6d3bf55a2f23b00390f05ca369d +size 56185 diff --git a/Game/GigLine/Content/Hollywood/Vehicle/orange_light_off.uasset b/Game/GigLine/Content/Hollywood/Vehicle/orange_light_off.uasset new file mode 100644 index 0000000..8ae910f --- /dev/null +++ b/Game/GigLine/Content/Hollywood/Vehicle/orange_light_off.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:070d29e6b169013a7860fc131700abc0b48ea9ddc6cba4756e427b4637a65aa9 +size 56249 diff --git a/Game/GigLine/Content/Hollywood/Vehicle/orange_reflector.uasset b/Game/GigLine/Content/Hollywood/Vehicle/orange_reflector.uasset new file mode 100644 index 0000000..4cae2ba --- /dev/null +++ b/Game/GigLine/Content/Hollywood/Vehicle/orange_reflector.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bff7645c65a7555d6d4bfe42080666a8c41e3c718a3284343e676dc239b747ce +size 56249 diff --git a/Game/GigLine/Content/Hollywood/Vehicle/plastic_black.uasset b/Game/GigLine/Content/Hollywood/Vehicle/plastic_black.uasset new file mode 100644 index 0000000..03f2170 --- /dev/null +++ b/Game/GigLine/Content/Hollywood/Vehicle/plastic_black.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7de690fff9efda596b4e5dae71a19a52aff8fed5d9033669587668247c7d3ba0 +size 56195 diff --git a/Game/GigLine/Content/Hollywood/Vehicle/pure_black.uasset b/Game/GigLine/Content/Hollywood/Vehicle/pure_black.uasset new file mode 100644 index 0000000..b65a6f4 --- /dev/null +++ b/Game/GigLine/Content/Hollywood/Vehicle/pure_black.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b9d0fac0b3cbe13c6806ec256169e1ff45d2b7164f467a4de335fecb5749d6c9 +size 56147 diff --git a/Game/GigLine/Content/Hollywood/Vehicle/red_light.uasset b/Game/GigLine/Content/Hollywood/Vehicle/red_light.uasset new file mode 100644 index 0000000..260336c --- /dev/null +++ b/Game/GigLine/Content/Hollywood/Vehicle/red_light.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:382c0118d6e3b24eb10b61f6ed683819e0025f1ea41b828d031351e96e828e91 +size 56137 diff --git a/Game/GigLine/Content/Hollywood/Vehicle/red_reflector.uasset b/Game/GigLine/Content/Hollywood/Vehicle/red_reflector.uasset new file mode 100644 index 0000000..d9fd5e8 --- /dev/null +++ b/Game/GigLine/Content/Hollywood/Vehicle/red_reflector.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c80ff6af72674cdf117a59288f498f5035ef5c60111fa07dc17c7cb113eaf987 +size 56201 diff --git a/Game/GigLine/Content/Hollywood/Vehicle/reverse_light_off.uasset b/Game/GigLine/Content/Hollywood/Vehicle/reverse_light_off.uasset new file mode 100644 index 0000000..87dec2a --- /dev/null +++ b/Game/GigLine/Content/Hollywood/Vehicle/reverse_light_off.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7d505a8ed1e78cd52a6678939f3d6379b06373224b6e490206d4c6546a8a034c +size 56265 diff --git a/Game/GigLine/Content/Hollywood/Vehicle/rough_chrome.uasset b/Game/GigLine/Content/Hollywood/Vehicle/rough_chrome.uasset new file mode 100644 index 0000000..461527f --- /dev/null +++ b/Game/GigLine/Content/Hollywood/Vehicle/rough_chrome.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ad21c54bff635aed0b66ea3272809036f157c7f160c7810cdc654dffbd44284c +size 56185 diff --git a/Game/GigLine/Content/Hollywood/Vehicle/rubber.uasset b/Game/GigLine/Content/Hollywood/Vehicle/rubber.uasset new file mode 100644 index 0000000..d51cd23 --- /dev/null +++ b/Game/GigLine/Content/Hollywood/Vehicle/rubber.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0cfaa02a65d2dff743d9e36c6c4f2dcebc9a26cf51f72b72d138c8425acdefa6 +size 56089 diff --git a/Game/GigLine/Content/Test/ReviewMap.umap b/Game/GigLine/Content/Test/ReviewMap.umap index 8e76233..0c45212 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:987a2ef7c3a73d56b988cda8fe33e728210a39a8ba2c51efacf647458a11cbd2 +oid sha256:9cd50f89b325212a95d9f4088266f9ed89a3bcdc1978108af6173392cbd36fae size 30542 diff --git a/Screenshots/demo/review-demo-crossing.png b/Screenshots/demo/review-demo-crossing.png index ea3e45c..da8b32d 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:482c0c575614c80fa0f55712e02212e83e63ba8f77b92db84bb697d16013952c -size 3056410 +oid sha256:14fb5d0f47c9e131d4ec08b67401149458d166c43186bf2072de6ed6c5f07eb0 +size 3056716 diff --git a/Screenshots/demo/review-demo-north-buildings.png b/Screenshots/demo/review-demo-north-buildings.png index 0d873aa..e042cd1 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:e87ad44cfb8b77f3b689823696d2828ac6d62f11b545b574fb0b2f01f6ef56e2 -size 2614066 +oid sha256:5ef4220ad0db75d5a7d335022b9a6452180a5ce28fdb12d29224e3c6ba915b74 +size 2614632 diff --git a/Screenshots/demo/review-demo-retail-frontage.png b/Screenshots/demo/review-demo-retail-frontage.png index 7f19a07..c035c7c 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:5b911dc2e10d99212ec18f8ac1dc8dd93775b488cbab312ca332edb20684320c -size 2488844 +oid sha256:f3914e2d236594d3154fe55bf42d38f12423c5153ab885263457fdb39101f2b8 +size 2487215 diff --git a/Screenshots/demo/review-demo-spawn-view.png b/Screenshots/demo/review-demo-spawn-view.png index 3746b64..4dea9c2 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:d733fa8658d4cbf04819c69b4ae4a9811d819865a927628a82e10f19c7513de0 -size 2884218 +oid sha256:7617557133bad10cdfeb2ea81c2e6d6d3304ebde76f93fc1d4b7c6fc4456b30a +size 2885391 diff --git a/Screenshots/demo/review-demo-street-level.png b/Screenshots/demo/review-demo-street-level.png index a3555a0..9da096c 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:546000b439fee9fb3196ca5970260a2828b6bac3d820348654eb47ee689c64f0 -size 2795488 +oid sha256:152f1e8402188155c93206d4a508bc75edbf0d4ce3739e14c077390aaf49a3c6 +size 2749739 diff --git a/Screenshots/demo/review-demo-third-person-front.png b/Screenshots/demo/review-demo-third-person-front.png index 01b082b..744d2e6 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:75b38075f13bd2ca539fe3a328426ecd93fbb516ff441ebe62c593e8345cedc5 -size 2792893 +oid sha256:11b811543d59a0dc94f264cb911b6965fca8372929a803ead999d1debdd7b3cf +size 2797808 diff --git a/Screenshots/demo/review-demo-third-person-walk.png b/Screenshots/demo/review-demo-third-person-walk.png index 990d80d..cda8069 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:79391b7762cf39c666dbf8c6a38eb0ab71a7574386e6346ad27b7ff31c346e25 -size 2171036 +oid sha256:a895dc8dd513a952251df145622843ee1470a38ebb3ac471cbcb3dfca6f69808 +size 2169539 diff --git a/Screenshots/demo/review-demo-third-person.png b/Screenshots/demo/review-demo-third-person.png index 3951593..fefd23f 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:718ba8241f65a9018d9e14109981426b6efb54067b839d39b1f99adbfed06087 -size 2974379 +oid sha256:4138f761a2210f5f816405d4e20708cd02f7d334e383f80a538aefcda7dd8ca7 +size 2950165 diff --git a/Screenshots/demo/review-demo-vehicle.png b/Screenshots/demo/review-demo-vehicle.png index 7c6067a..e54d2e2 100644 --- a/Screenshots/demo/review-demo-vehicle.png +++ b/Screenshots/demo/review-demo-vehicle.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5de5fead4633cfbb0bf48bb930981a681aa7495a4818cb6d6cd8a9b3f9ef37fb -size 3048456 +oid sha256:7f2074af11118e42c9751e16117254164ca9ec5fcc699a2a4473d496545206e5 +size 2961884 diff --git a/TODO.md b/TODO.md index 4351cf9..6133dd9 100644 --- a/TODO.md +++ b/TODO.md @@ -21,7 +21,7 @@ Actionable task list for this project. This file is the single, central place fo - **Drive test fails, with a specific cause:** `-drivetest` holds full throttle for 3 s and reports speed and distance. Result: `speed=0 cm/s, travelled 2.2 m -> FAIL`, and BeginPlay logs **`0 wheel objects after register`** while the component reports 4 wheel setups. The setups exist but no wheels are created from them, so there is nothing to apply torque to. - **Next:** confirm the skeleton's bone names match the setups (`Wheel_FL`, `Wheel_FR`, `Wheel_RL`, `Wheel_RR`) - a name mismatch silently produces zero wheels - and give the front and rear pairs their own `UChaosVehicleWheel` subclasses rather than the base class, which is what the setups point at today. - **Also open:** LOD group wiring, enter/exit, driving route, handling. -- [A] Fix the vehicle not rendering in the scene. **Chased to a strong clue, not yet solved.** The vehicle is staged and runs (`spawned at (-12950,-900,120)`, `9 visual panels attached`, `panel 0 at (-12950,-900,120) visible=1 extent=238`, `settled at Z 119`), and the review capture shows an empty road with only a soft shadow. `Tools/visual_loop.py --verify` passes the frame; `Tools/judge_screenshot.py` returns `verdict=no confidence=1.0`. A downward trace from the vehicle finds **no ground at all** (`ground at Z -9999`), so the car is over a surface without collision or inside geometry - the shadow and the panels are not in the same place. **Fixed:** the vehicle was spawned 2.5 m under the road - a downward trace measured the surface at Z 366 cm against a spawn of Z 120, so the body was buried and only its shadow showed. The spawn is now Z 470 and it settles there. +- [x] Fix the vehicle not rendering in the scene. **Chased to a strong clue, not yet solved.** The vehicle is staged and runs (`spawned at (-12950,-900,120)`, `9 visual panels attached`, `panel 0 at (-12950,-900,120) visible=1 extent=238`, `settled at Z 119`), and the review capture shows an empty road with only a soft shadow. `Tools/visual_loop.py --verify` passes the frame; `Tools/judge_screenshot.py` returns `verdict=no confidence=1.0`. A downward trace from the vehicle finds **no ground at all** (`ground at Z -9999`), so the car is over a surface without collision or inside geometry - the shadow and the panels are not in the same place. **Fixed 2026-11-09** — the car renders, built from the owner's `hot hatch.blend`. **Fixed:** the vehicle was spawned 2.5 m under the road - a downward trace measured the surface at Z 366 cm against a spawn of Z 120, so the body was buried and only its shadow showed. The spawn is now Z 470 and it settles there. - **Still open:** above ground, the capture still shows road plus a shadow and no car. Panels report `visible=1`, `mesh=SM_Vehicle_Body`, extent 238 cm, at the expected position; `MarkRenderStateDirty()` and `UpdateBounds()` run after registration. Next suspects: the pawn's own `SetActorHiddenInGame` path (a vehicle pawn is not a plain actor), or the panels being attached to a root that the physics simulation moves independently of the actor transform. - [ ] Implement enter/exit interaction. - [ ] Build a closed driving route with boundaries. diff --git a/Tools/README.md b/Tools/README.md index 9e11c14..2ba579f 100644 --- a/Tools/README.md +++ b/Tools/README.md @@ -96,6 +96,7 @@ Geographic tools live in [`Geo/tools/`](../Geo/README.md) and the Blender-side b | `generate_character_textures.py` | Procedural skin-pore and hair-strand textures with sidecars; no model involved. | `--out` | `python3 Tools/generate_character_textures.py --out Art/textures/generated` | | `vehicle_build.py` | Models the drivable sedan: three-tier body, four wheels, lamps and bumpers, plus four `UCX_` convex collision hulls; saves the .blend, exports an FBX with the `ue_metric_v1` preset, and writes a report with every dimension the vehicle config needs. | `--out`, `--fbx`, `--report` | `blender -b --factory-startup --python Tools/vehicle_build.py -- --out Art/blender/vehicle/gigline-sedan.blend --fbx /tmp/gigline/vehicle/sedan.fbx` | | `ue_vehicle_import.py` | Imports the sedan's six systems into `/Game/Hollywood/Vehicle` as separate static meshes, plus the two LOD meshes; the body carries the `UCX_` hulls as simple collision. | (no arguments; reads `/tmp/gigline/vehicle`) | `UnrealEditor-Cmd -run=pythonscript -script=Tools/ue_vehicle_import.py -nullrhi -unattended -nopause` | +| `vehicle_from_template.py` | Converts the owner's `hot hatch.blend` into UE-ready assets: normalises the scale to a documented 4.05 m, splits systems (body/trim/glass/lights/wheels), adds a `UCX_` hull, decimates two LODs, exports FBX per system and writes a report. | `--out`, `--report` | `blender -b "Art/blender/vehicle/hot hatch.blend" --python Tools/vehicle_from_template.py -- --out /tmp/gigline/hatch` | ## Tests diff --git a/Tools/ue_build_demo_map.py b/Tools/ue_build_demo_map.py index afc5767..0f8b553 100644 --- a/Tools/ue_build_demo_map.py +++ b/Tools/ue_build_demo_map.py @@ -661,34 +661,28 @@ def build(): # attached to the vehicle pawn stay invisible, so the visuals do not depend on the # pawn until that is solved. A visible car that does not drive yet beats an invisible # one that does. - vehicle_origin = unreal.Vector(-12950.0, -900.0, 470.0) + # The hot-hatch template, normalised to 4.05 m and split per the vehicle-artist + # object split. Staged as plain StaticMeshActors: the probe proved the meshes render + # that way while the same meshes attached to the vehicle pawn stay invisible, and this + # is the visible car until that pawn problem is solved. + vehicle_origin = unreal.Vector(-12950.0, -900.0, 372.0) + vehicle_rotation = unreal.Rotator(pitch=0.0, yaw=0.0, roll=0.0) - vehicle_class = unreal.load_class(None, "/Script/GigLine.GigLineVehicle") - if vehicle_class: - vehicle = spawn(vehicle_class, vehicle_origin, "Demo_Vehicle_Sedan") - log(f"staged: Demo_Vehicle_Sedan ({'ok' if vehicle else 'FAILED'})") - else: - log("staged: Demo_Vehicle_Sedan skipped - class not found") - - panels = ( - ("SM_Vehicle_Body", unreal.Vector(0.0, 0.0, -72.0)), - ("SM_Vehicle_Glass", unreal.Vector(0.0, 0.0, -72.0)), - ("SM_Vehicle_Light_Front", unreal.Vector(0.0, 0.0, -72.0)), - ("SM_Vehicle_Light_Rear", unreal.Vector(0.0, 0.0, -72.0)), - ("SM_Vehicle_Mirrors", unreal.Vector(0.0, 0.0, -72.0)), - ("SM_Vehicle_Wheel", unreal.Vector(139.0, 81.0, -88.0)), - ("SM_Vehicle_Wheel", unreal.Vector(139.0, -81.0, -88.0)), - ("SM_Vehicle_Wheel", unreal.Vector(-139.0, 81.0, -88.0)), - ("SM_Vehicle_Wheel", unreal.Vector(-139.0, -81.0, -88.0)), + panel_systems = ( + "SM_Vehicle_Body", + "SM_Vehicle_Trim", + "SM_Vehicle_Glass", + "SM_Vehicle_Lights", + "SM_Vehicle_Wheels", ) staged_panels = 0 - for index, (mesh_name, offset) in enumerate(panels): + for index, mesh_name in enumerate(panel_systems): mesh = unreal.EditorAssetLibrary.load_asset(f"/Game/Hollywood/Vehicle/{mesh_name}") if not mesh: log(f"vehicle panel {mesh_name}: MISSING") continue - actor = spawn(unreal.StaticMeshActor, vehicle_origin + offset, - f"Demo_VehiclePanel_{index:02d}") + actor = spawn(unreal.StaticMeshActor, vehicle_origin, + f"Demo_VehiclePanel_{index:02d}", vehicle_rotation) if actor: comp = actor.get_component_by_class(unreal.StaticMeshComponent) if comp: diff --git a/Tools/ue_build_review_map.py b/Tools/ue_build_review_map.py index 68aece5..f28aa32 100644 --- a/Tools/ue_build_review_map.py +++ b/Tools/ue_build_review_map.py @@ -292,7 +292,7 @@ try: # The sedan, staged on the carriageway at (-12950, -900). Three-quarter front # view from the road so both the body and the wheels are visible: a side-on # or rear view hides the wheel stances that the build is judged on. - ("demo-vehicle", unreal.Vector(-12250, -1600, 620), unreal.Vector(-12950, -900, 430), 50.0), + ("demo-vehicle", unreal.Vector(-12560, -1560, 560), unreal.Vector(-12950, -900, 420), 45.0), ("demo-spawn-view", unreal.Vector(-13336, -3100, 620), unreal.Vector(-13336, 1300, 620), 48.0), # Street level, from the north sidewalk: the old camera sat at Y -400, # inside the facade body (which spans Y -1457..-200), so it looked at diff --git a/Tools/ue_vehicle_import.py b/Tools/ue_vehicle_import.py index 82ca336..dedab69 100644 --- a/Tools/ue_vehicle_import.py +++ b/Tools/ue_vehicle_import.py @@ -16,14 +16,13 @@ import os import unreal DEST = "/Game/Hollywood/Vehicle" -SOURCE = "/tmp/gigline/vehicle" +SOURCE = "/tmp/gigline/hatch" SYSTEMS = ( ("body", "SM_Vehicle_Body"), + ("trim", "SM_Vehicle_Trim"), ("glass", "SM_Vehicle_Glass"), - ("light_front", "SM_Vehicle_Light_Front"), - ("light_rear", "SM_Vehicle_Light_Rear"), - ("mirrors", "SM_Vehicle_Mirrors"), - ("wheel", "SM_Vehicle_Wheel"), + ("lights", "SM_Vehicle_Lights"), + ("wheels", "SM_Vehicle_Wheels"), ) RESULT = "/tmp/gigline/vehicle-import.txt" lines = [] @@ -103,7 +102,8 @@ def main(): log(f"{name}: imported as its own asset ({'ok' if mesh else 'MISSING'}); " "LOD group wiring needs an editor session") - # Skeletal vehicle for Chaos: a root bone plus one bone per wheel, everything skinned. + # Skeletal vehicle for Chaos is not built from this template yet: the hatch is a + # static model, and the drivable rig has to be authored around it. skel_path = os.path.join(SOURCE, "vehicle_skeletal.fbx") if os.path.exists(skel_path): task = unreal.AssetImportTask() diff --git a/Tools/vehicle_from_template.py b/Tools/vehicle_from_template.py new file mode 100644 index 0000000..eb99fa9 --- /dev/null +++ b/Tools/vehicle_from_template.py @@ -0,0 +1,243 @@ +#!/usr/bin/env python3 +"""Turn the provided hot-hatch .blend into UE-ready assets. + + blender -b "Art/blender/vehicle/hot hatch.blend" \ + --python Tools/vehicle_from_template.py -- \ + --out /tmp/gigline/hatch --report /tmp/gigline/hatch/report.json + +Follows two skills: + +* **vehicle-artist** — one object per system (body, wheels, glass, lights, trim, + mirrors), collision planned with the body, LODs planned before export. +* **unreal-export** — scale confirmed with a known dimension, `SM_`/`UCX_` naming, + LOD chain, and every asset measured after import. + +The template is not to scale: its longest axis is 7.21 m, which no hot hatch is. The +tool therefore normalises to a documented real length (default 4.05 m) and records the +factor, rather than exporting whatever units the file happened to use. That is the +"confirm scale with known-dimension test" step, done before the export instead of after +the import. +""" + +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 # noqa: E402 + +# A three-door hot hatch: 4.05 m long, 1.75 m wide, 1.42 m tall. +TARGET_LENGTH_M = 4.05 +TARGET_WIDTH_M = 1.75 +TARGET_HEIGHT_M = 1.42 + +PARTS: list[str] = [] + + +def log(message: str) -> None: + PARTS.append(message) + print(f"[hatch] {message}") + + +SYSTEM_RULES = ( + # (system, material substrings that identify it, object-name substrings) + ("glass", ("windows",), ("Cube.003",)), + ("lights", ("light", "reflector"), ("lights and grill", "Cylinder.003", "Cylinder.004")), + ("mirrors", ("mirror",), ("Cube.005",)), + ("wheels", ("rubber", "brake caliper", "black shiny metal"), ("Cylinder", "Cylinder.001")), + ("trim", ("plastic black", "pure black", "chrome", "black metal", "rough chrome"), + ("Cube.001", "Cube.002", "Cube.004", "Cube.006", "Cube.007", "Cylinder.002")), +) + + +def classify(obj): + """Assign an object to a system by its materials first, then by its name.""" + materials = [m.name.lower() for m in obj.data.materials if m] + name = obj.name.lower() + for system, materials_hint, names_hint in SYSTEM_RULES: + if any(hint in name for hint in (n.lower() for n in names_hint)): + return system + if any(any(h in material for h in materials_hint) for material in materials): + return system + return "body" + + +def normalise_scale(objects): + """Scale and centre the whole car so it matches the documented dimensions.""" + xs, ys, zs = [], [], [] + for obj in objects: + for corner in obj.bound_box: + world = obj.matrix_world @ __import__("mathutils").Vector(corner) + xs.append(world.x) + ys.append(world.y) + zs.append(world.z) + length = max(ys) - min(ys) + width = max(xs) - min(xs) + height = max(zs) - min(zs) + log(f"template bounds: {length:.2f} x {width:.2f} x {height:.2f} m") + factor = TARGET_LENGTH_M / length if length > 0.01 else 1.0 + log(f"scale factor {factor:.4f} (target length {TARGET_LENGTH_M} m, " + f"was {length:.2f} m)") + + for obj in objects: + obj.scale = tuple(s * factor for s in obj.scale) + obj.location = tuple(l * factor for l in obj.location) + bpy.context.view_layer.update() + + # Drop the car onto Z 0 and centre it on the origin in X/Y. + xs, ys, zs = [], [], [] + for obj in objects: + for corner in obj.bound_box: + world = obj.matrix_world @ __import__("mathutils").Vector(corner) + xs.append(world.x) + ys.append(world.y) + zs.append(world.z) + offset = __import__("mathutils").Vector( + (-(min(xs) + max(xs)) / 2.0, -(min(ys) + max(ys)) / 2.0, -min(zs))) + for obj in objects: + obj.location = tuple(l + o for l, o in zip(obj.location, offset)) + bpy.context.view_layer.update() + log(f"centred and grounded (offset {offset.x:.2f}, {offset.y:.2f}, {offset.z:.2f} m)") + + +def join_system(objects, name): + bpy.ops.object.select_all(action="DESELECT") + for obj in objects: + obj.select_set(True) + bpy.context.view_layer.objects.active = objects[0] + if len(objects) > 1: + bpy.ops.object.join() + joined = bpy.context.active_object + joined.name = name + return joined + + +def add_collision(body): + """One convex box per major volume, `UCX_`-prefixed for Unreal.""" + hulls = [] + xs, ys, zs = [], [], [] + for corner in body.bound_box: + world = body.matrix_world @ __import__("mathutils").Vector(corner) + xs.append(world.x) + ys.append(world.y) + zs.append(world.z) + length, width, height = max(ys) - min(ys), max(xs) - min(xs), max(zs) - min(zs) + centre = ((min(xs) + max(xs)) / 2.0, (min(ys) + max(ys)) / 2.0, + min(zs) + height * 0.5) + bpy.ops.mesh.primitive_cube_add(size=1.0, location=centre) + hull = bpy.context.active_object + hull.name = "UCX_SM_Vehicle_Body_01" + hull.scale = (width * 0.96, length * 0.98, height * 0.62) + bpy.ops.object.transform_apply(location=False, rotation=False, scale=True) + hull.hide_render = True + hulls.append(hull) + log(f"collision: 1 hull {width*0.96:.2f} x {length*0.98:.2f} x {height*0.62:.2f} m") + return hulls + + +def decimate_copy(source, name, ratio): + bpy.ops.object.select_all(action="DESELECT") + source.select_set(True) + bpy.context.view_layer.objects.active = source + bpy.ops.object.duplicate() + copy = bpy.context.active_object + copy.name = name + modifier = copy.modifiers.new(name="LOD", type="DECIMATE") + modifier.ratio = ratio + bpy.ops.object.modifier_apply(modifier=modifier.name) + return copy + + +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/hatch") + ap.add_argument("--report", default="/tmp/gigline/hatch/report.json") + args = ap.parse_args(argv) + + meshes = [o for o in bpy.data.objects if o.type == "MESH"] + if not meshes: + raise SystemExit("no meshes in the template") + log(f"template: {len(meshes)} mesh objects, " + f"{sum(len(o.data.vertices) for o in meshes)} vertices") + + normalise_scale(meshes) + + systems = {} + for obj in meshes: + systems.setdefault(classify(obj), []).append(obj) + log("systems: " + ", ".join(f"{k}={len(v)} objects" for k, v in systems.items())) + + os.makedirs(args.out, exist_ok=True) + exported = {} + joined = {} + for system, objects in systems.items(): + name = { + "body": "SM_Vehicle_Body", + "glass": "SM_Vehicle_Glass", + "lights": "SM_Vehicle_Lights", + "mirrors": "SM_Vehicle_Mirrors", + "wheels": "SM_Vehicle_Wheels", + "trim": "SM_Vehicle_Trim", + }[system] + obj = join_system(objects, name) + joined[system] = obj + path = os.path.join(args.out, f"{system}.fbx") + bpy.ops.object.select_all(action="DESELECT") + obj.select_set(True) + bpy.context.view_layer.objects.active = obj + fbx_export_preset.export_static(path, selection=True) + exported[system] = path + tris = sum(len(p.vertices) - 2 for p in obj.data.polygons) + log(f"{name}: {tris} triangles -> {path}") + + hulls = add_collision(joined["body"]) + bpy.ops.object.select_all(action="DESELECT") + joined["body"].select_set(True) + for hull in hulls: + hull.select_set(True) + bpy.context.view_layer.objects.active = joined["body"] + fbx_export_preset.export_static(os.path.join(args.out, "body.fbx"), selection=True) + log("body re-exported with its UCX hull") + + lods = {} + for index, ratio in ((1, 0.35), (2, 0.12)): + lod = decimate_copy(joined["body"], f"SM_Vehicle_Body_LOD{index}", ratio) + path = os.path.join(args.out, f"body_lod{index}.fbx") + bpy.ops.object.select_all(action="DESELECT") + lod.select_set(True) + bpy.context.view_layer.objects.active = lod + fbx_export_preset.export_static(path, selection=True) + tris = sum(len(p.vertices) - 2 for p in lod.data.polygons) + lods[f"body_lod{index}"] = {"path": path, "triangles": tris} + log(f"SM_Vehicle_Body_LOD{index}: {tris} triangles") + bpy.data.objects.remove(lod, do_unlink=True) + + report = { + "template": bpy.data.filepath, + "target_dimensions_m": {"length": TARGET_LENGTH_M, "width": TARGET_WIDTH_M, + "height": TARGET_HEIGHT_M}, + "systems": {system: {"object": joined[system].name, + "triangles": sum(len(p.vertices) - 2 + for p in joined[system].data.polygons), + "fbx": exported.get(system)} + for system in joined}, + "lods": lods, + "collision": [h.name for h in hulls], + "log": PARTS, + } + os.makedirs(os.path.dirname(os.path.abspath(args.report)), exist_ok=True) + with open(args.report, "w") as handle: + json.dump(report, handle, indent=2) + print(f"[hatch] report -> {args.report}") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main())