diff --git a/public/map.json b/public/map.json index 4a71bee..d60ef46 100644 --- a/public/map.json +++ b/public/map.json @@ -37610,6 +37610,177 @@ "rotation": [-3.1416, -1.1003, -3.1416], "scale": [1, 1, 1], "children": [ + { + "name": "immeuble1", + "type": "Object3D", + "role": "group", + "position": [0, 0, 0], + "rotation": [0, 0, 0], + "scale": [1, 1, 1], + "children": [ + { + "name": "immeuble1", + "type": "Object3D", + "position": [-33.4517, 8.4233, -14.3777], + "rotation": [0, 1.0967, 0], + "scale": [1, 1, 1], + "children": [ + { + "name": "immeuble_2", + "type": "Mesh", + "position": [-35.0952, 7.4391, -11.2481], + "rotation": [0, 1.0967, 0], + "scale": [1, 1, 1] + }, + { + "name": "immeuble1", + "type": "Mesh", + "position": [-31.8081, 9.4074, -17.5073], + "rotation": [0, 1.0967, 0], + "scale": [1, 1, 1] + } + ] + }, + { + "name": "immeuble1", + "type": "Object3D", + "position": [-61.1478, 6.0441, 5.1504], + "rotation": [0, 0.8515, 0], + "scale": [1, 1, 1], + "children": [ + { + "name": "immeuble_2", + "type": "Mesh", + "position": [-63.5018, 5.0599, 7.7876], + "rotation": [0, 0.8515, 0], + "scale": [1, 1, 1] + }, + { + "name": "immeuble1", + "type": "Mesh", + "position": [-58.7939, 7.0283, 2.5133], + "rotation": [0, 0.8515, 0], + "scale": [1, 1, 1] + } + ] + }, + { + "name": "immeuble1", + "type": "Object3D", + "position": [-36.6903, 8.3502, 9.731], + "rotation": [0, 1.1991, 0], + "scale": [1, 1, 1], + "children": [ + { + "name": "immeuble_2", + "type": "Mesh", + "position": [-38.0051, 7.366, 13.0123], + "rotation": [0, 1.1992, 0], + "scale": [1, 1, 1] + }, + { + "name": "immeuble1", + "type": "Mesh", + "position": [-35.3756, 9.3343, 6.4496], + "rotation": [0, 1.1991, 0], + "scale": [1, 1, 1] + } + ] + }, + { + "name": "immeuble1", + "type": "Object3D", + "position": [-68.7111, 4.651, -50.5238], + "rotation": [0, 1.3104, 0], + "scale": [1, 1, 1], + "children": [ + { + "name": "immeuble_2", + "type": "Mesh", + "position": [-69.6533, 3.6669, -47.1168], + "rotation": [0, 1.3105, 0], + "scale": [1, 1, 1] + }, + { + "name": "immeuble1", + "type": "Mesh", + "position": [-67.7689, 5.6352, -53.9309], + "rotation": [0, 1.3104, 0], + "scale": [1, 1, 1] + } + ] + }, + { + "name": "immeuble1", + "type": "Object3D", + "position": [-100.9035, 4.19, -31.7676], + "rotation": [0, 0.9317, 0], + "scale": [1, 1, 1], + "children": [ + { + "name": "immeuble_2", + "type": "Mesh", + "position": [-103.0387, 3.2058, -28.9504], + "rotation": [0, 0.9317, 0], + "scale": [1, 1, 1] + }, + { + "name": "immeuble1", + "type": "Mesh", + "position": [-98.7682, 5.1742, -34.5848], + "rotation": [0, 0.9317, 0], + "scale": [1, 1, 1] + } + ] + }, + { + "name": "immeuble1", + "type": "Object3D", + "position": [-79.1874, 4.7345, -23.9129], + "rotation": [0, 1.0321, 0], + "scale": [1, 1, 1], + "children": [ + { + "name": "immeuble_2", + "type": "Mesh", + "position": [-81.0293, 3.7503, -20.8958], + "rotation": [0, 1.0322, 0], + "scale": [1, 1, 1] + }, + { + "name": "immeuble1", + "type": "Mesh", + "position": [-77.3455, 5.7187, -26.9301], + "rotation": [0, 1.0321, 0], + "scale": [1, 1, 1] + } + ] + }, + { + "name": "immeuble1", + "type": "Object3D", + "position": [-107.9151, 4.19, 1.755], + "rotation": [3.1416, 1.5267, -3.1416], + "scale": [1, 1, 1], + "children": [ + { + "name": "immeuble_2", + "type": "Mesh", + "position": [-107.7927, 3.2058, 5.2878], + "rotation": [3.1416, 1.5267, 3.1416], + "scale": [1, 1, 1] + }, + { + "name": "immeuble1", + "type": "Mesh", + "position": [-108.0375, 5.1742, -1.7778], + "rotation": [3.1416, 1.5267, -3.1416], + "scale": [1, 1, 1] + } + ] + } + ] + }, { "name": "maison1", "type": "Object3D", @@ -37684,250 +37855,6 @@ } ] }, - { - "name": "immeuble_2", - "type": "Object3D", - "role": "group", - "position": [0, 0, 0], - "rotation": [0, 0, 0], - "scale": [1, 1, 1], - "children": [ - { - "name": "immeuble_2", - "type": "Object3D", - "position": [-35.0952, 7.4391, -11.2481], - "rotation": [0, 1.0967, 0], - "scale": [1, 1, 1], - "children": [ - { - "name": "immeuble_2", - "type": "Mesh", - "position": [-35.0952, 7.4391, -11.2481], - "rotation": [0, 1.0967, 0], - "scale": [1, 1, 1] - } - ] - }, - { - "name": "immeuble_2", - "type": "Object3D", - "position": [-63.5018, 5.0599, 7.7876], - "rotation": [0, 0.8515, 0], - "scale": [1, 1, 1], - "children": [ - { - "name": "immeuble_2", - "type": "Mesh", - "position": [-63.5018, 5.0599, 7.7876], - "rotation": [0, 0.8515, 0], - "scale": [1, 1, 1] - } - ] - }, - { - "name": "immeuble_2", - "type": "Object3D", - "position": [-38.0051, 7.366, 13.0123], - "rotation": [0, 1.1992, 0], - "scale": [1, 1, 1], - "children": [ - { - "name": "immeuble_2", - "type": "Mesh", - "position": [-38.0051, 7.366, 13.0123], - "rotation": [0, 1.1992, 0], - "scale": [1, 1, 1] - } - ] - }, - { - "name": "immeuble_2", - "type": "Object3D", - "position": [-69.6533, 3.6669, -47.1168], - "rotation": [0, 1.3105, 0], - "scale": [1, 1, 1], - "children": [ - { - "name": "immeuble_2", - "type": "Mesh", - "position": [-69.6533, 3.6669, -47.1168], - "rotation": [0, 1.3105, 0], - "scale": [1, 1, 1] - } - ] - }, - { - "name": "immeuble_2", - "type": "Object3D", - "position": [-103.0387, 3.2058, -28.9504], - "rotation": [0, 0.9317, 0], - "scale": [1, 1, 1], - "children": [ - { - "name": "immeuble_2", - "type": "Mesh", - "position": [-103.0387, 3.2058, -28.9504], - "rotation": [0, 0.9317, 0], - "scale": [1, 1, 1] - } - ] - }, - { - "name": "immeuble_2", - "type": "Object3D", - "position": [-81.0293, 3.7503, -20.8958], - "rotation": [0, 1.0322, 0], - "scale": [1, 1, 1], - "children": [ - { - "name": "immeuble_2", - "type": "Mesh", - "position": [-81.0293, 3.7503, -20.8958], - "rotation": [0, 1.0322, 0], - "scale": [1, 1, 1] - } - ] - }, - { - "name": "immeuble_2", - "type": "Object3D", - "position": [-107.7927, 3.2058, 5.2878], - "rotation": [3.1416, 1.5267, 3.1416], - "scale": [1, 1, 1], - "children": [ - { - "name": "immeuble_2", - "type": "Mesh", - "position": [-107.7927, 3.2058, 5.2878], - "rotation": [3.1416, 1.5267, 3.1416], - "scale": [1, 1, 1] - } - ] - } - ] - }, - { - "name": "immeuble1", - "type": "Object3D", - "role": "group", - "position": [0, 0, 0], - "rotation": [0, 0, 0], - "scale": [1, 1, 1], - "children": [ - { - "name": "immeuble1", - "type": "Object3D", - "position": [-31.8081, 9.4074, -17.5073], - "rotation": [0, 1.0967, 0], - "scale": [1, 1, 1], - "children": [ - { - "name": "immeuble1", - "type": "Mesh", - "position": [-31.8081, 9.4074, -17.5073], - "rotation": [0, 1.0967, 0], - "scale": [1, 1, 1] - } - ] - }, - { - "name": "immeuble1", - "type": "Object3D", - "position": [-58.7939, 7.0283, 2.5133], - "rotation": [0, 0.8515, 0], - "scale": [1, 1, 1], - "children": [ - { - "name": "immeuble1", - "type": "Mesh", - "position": [-58.7939, 7.0283, 2.5133], - "rotation": [0, 0.8515, 0], - "scale": [1, 1, 1] - } - ] - }, - { - "name": "immeuble1", - "type": "Object3D", - "position": [-35.3756, 9.3343, 6.4496], - "rotation": [0, 1.1991, 0], - "scale": [1, 1, 1], - "children": [ - { - "name": "immeuble1", - "type": "Mesh", - "position": [-35.3756, 9.3343, 6.4496], - "rotation": [0, 1.1991, 0], - "scale": [1, 1, 1] - } - ] - }, - { - "name": "immeuble1", - "type": "Object3D", - "position": [-67.7689, 5.6352, -53.9309], - "rotation": [0, 1.3104, 0], - "scale": [1, 1, 1], - "children": [ - { - "name": "immeuble1", - "type": "Mesh", - "position": [-67.7689, 5.6352, -53.9309], - "rotation": [0, 1.3104, 0], - "scale": [1, 1, 1] - } - ] - }, - { - "name": "immeuble1", - "type": "Object3D", - "position": [-98.7682, 5.1742, -34.5848], - "rotation": [0, 0.9317, 0], - "scale": [1, 1, 1], - "children": [ - { - "name": "immeuble1", - "type": "Mesh", - "position": [-98.7682, 5.1742, -34.5848], - "rotation": [0, 0.9317, 0], - "scale": [1, 1, 1] - } - ] - }, - { - "name": "immeuble1", - "type": "Object3D", - "position": [-77.3455, 5.7187, -26.9301], - "rotation": [0, 1.0321, 0], - "scale": [1, 1, 1], - "children": [ - { - "name": "immeuble1", - "type": "Mesh", - "position": [-77.3455, 5.7187, -26.9301], - "rotation": [0, 1.0321, 0], - "scale": [1, 1, 1] - } - ] - }, - { - "name": "immeuble1", - "type": "Object3D", - "position": [-108.0375, 5.1742, -1.7778], - "rotation": [3.1416, 1.5267, -3.1416], - "scale": [1, 1, 1], - "children": [ - { - "name": "immeuble1", - "type": "Mesh", - "position": [-108.0375, 5.1742, -1.7778], - "rotation": [3.1416, 1.5267, -3.1416], - "scale": [1, 1, 1] - } - ] - } - ] - }, { "name": "boiteauxlettres", "type": "Object3D", @@ -38135,7 +38062,7 @@ { "name": "immeuble1", "type": "Object3D", - "position": [4.3643, 3.2151, 114.4985], + "position": [7.8967, 4.1992, 114.363], "rotation": [0, 0.0478, 0], "scale": [1, 1, 1], "children": [ @@ -38145,16 +38072,7 @@ "position": [4.3643, 3.2151, 114.4985], "rotation": [0, 0.0478, 0], "scale": [1, 1, 1] - } - ] - }, - { - "name": "immeuble1", - "type": "Object3D", - "position": [11.429, 5.1834, 114.2275], - "rotation": [0, 0.0478, 0], - "scale": [1, 1, 1], - "children": [ + }, { "name": "immeuble1", "type": "Mesh", @@ -38167,7 +38085,7 @@ { "name": "immeuble1", "type": "Object3D", - "position": [4.8661, 3.8156, 93.9483], + "position": [8.3955, 4.7997, 93.7519], "rotation": [0, 0.065, 0], "scale": [1, 1, 1], "children": [ @@ -38177,16 +38095,7 @@ "position": [4.8661, 3.8156, 93.9483], "rotation": [0, 0.065, 0], "scale": [1, 1, 1] - } - ] - }, - { - "name": "immeuble1", - "type": "Object3D", - "position": [11.925, 5.7839, 93.5555], - "rotation": [0, 0.065, 0], - "scale": [1, 1, 1], - "children": [ + }, { "name": "immeuble1", "type": "Mesh", @@ -38199,7 +38108,7 @@ { "name": "immeuble1", "type": "Object3D", - "position": [4.328, 6.8554, 54.6231], + "position": [7.8601, 7.8395, 54.7639], "rotation": [0, -0.0304, 0], "scale": [1, 1, 1], "children": [ @@ -38209,16 +38118,7 @@ "position": [4.328, 6.8554, 54.6231], "rotation": [0, -0.0304, 0], "scale": [1, 1, 1] - } - ] - }, - { - "name": "immeuble1", - "type": "Object3D", - "position": [11.3922, 8.8237, 54.9046], - "rotation": [0, -0.0304, 0], - "scale": [1, 1, 1], - "children": [ + }, { "name": "immeuble1", "type": "Mesh", @@ -38478,144 +38378,6 @@ "rotation": [3.1416, 1.1456, -3.1416], "scale": [1, 1, 1], "children": [ - { - "name": "immeuble_2", - "type": "Object3D", - "role": "group", - "position": [0, 0, 0], - "rotation": [0, 0, 0], - "scale": [1, 1, 1], - "children": [ - { - "name": "immeuble_2", - "type": "Object3D", - "position": [58.5315, 7.4391, 16.5809], - "rotation": [3.1416, 0.5971, 3.1416], - "scale": [1, 1, 1], - "children": [ - { - "name": "immeuble_2", - "type": "Mesh", - "position": [58.5315, 7.4391, 16.5809], - "rotation": [3.1416, 0.5971, 3.1416], - "scale": [1, 1, 1] - } - ] - }, - { - "name": "immeuble_2", - "type": "Object3D", - "position": [80.4667, 5.2224, 21.2652], - "rotation": [3.1416, 0.6567, 3.1416], - "scale": [1, 1, 1], - "children": [ - { - "name": "immeuble_2", - "type": "Mesh", - "position": [80.4667, 5.2224, 21.2652], - "rotation": [3.1416, 0.6567, 3.1416], - "scale": [1, 1, 1] - } - ] - }, - { - "name": "immeuble_2", - "type": "Object3D", - "position": [38.4102, 7.4391, -34.443], - "rotation": [3.1416, 0.7598, 3.1416], - "scale": [1, 1, 1], - "children": [ - { - "name": "immeuble_2", - "type": "Mesh", - "position": [38.4102, 7.4391, -34.443], - "rotation": [3.1416, 0.7598, 3.1416], - "scale": [1, 1, 1] - } - ] - }, - { - "name": "immeuble_2", - "type": "Object3D", - "position": [81.4108, 5.2437, 0.7526], - "rotation": [3.1416, 0.9283, 3.1416], - "scale": [1, 1, 1], - "children": [ - { - "name": "immeuble_2", - "type": "Mesh", - "position": [81.4108, 5.2437, 0.7526], - "rotation": [3.1416, 0.9283, 3.1416], - "scale": [1, 1, 1] - } - ] - }, - { - "name": "immeuble_2", - "type": "Object3D", - "position": [96.2087, 3.5829, -38.0843], - "rotation": [0, 1.4947, 0], - "scale": [1, 1, 1], - "children": [ - { - "name": "immeuble_2", - "type": "Mesh", - "position": [96.2087, 3.5829, -38.0843], - "rotation": [0, 1.4947, 0], - "scale": [1, 1, 1] - } - ] - }, - { - "name": "immeuble_2", - "type": "Object3D", - "position": [73.8823, 5.435, -18.1955], - "rotation": [3.1416, 1.2395, 3.1416], - "scale": [1, 1, 1], - "children": [ - { - "name": "immeuble_2", - "type": "Mesh", - "position": [73.8823, 5.435, -18.1955], - "rotation": [3.1416, 1.2395, 3.1416], - "scale": [1, 1, 1] - } - ] - }, - { - "name": "immeuble_2", - "type": "Object3D", - "position": [57.2363, 7.4391, -1.4223], - "rotation": [3.1416, 1.3941, 3.1416], - "scale": [1, 1, 1], - "children": [ - { - "name": "immeuble_2", - "type": "Mesh", - "position": [57.2363, 7.4391, -1.4223], - "rotation": [3.1416, 1.3941, 3.1416], - "scale": [1, 1, 1] - } - ] - }, - { - "name": "immeuble_2", - "type": "Object3D", - "position": [112.0712, 3.4242, -13.0076], - "rotation": [3.1416, 1.0875, 3.1416], - "scale": [1, 1, 1], - "children": [ - { - "name": "immeuble_2", - "type": "Mesh", - "position": [112.0712, 3.4242, -13.0076], - "rotation": [3.1416, 1.0875, 3.1416], - "scale": [1, 1, 1] - } - ] - } - ] - }, { "name": "immeuble1", "type": "Object3D", @@ -38627,10 +38389,17 @@ { "name": "immeuble1", "type": "Object3D", - "position": [52.7229, 9.4074, 12.5507], + "position": [55.6272, 8.4233, 14.5658], "rotation": [3.1416, 0.5972, -3.1416], "scale": [1, 1, 1], "children": [ + { + "name": "immeuble_2", + "type": "Mesh", + "position": [58.5315, 7.4391, 16.5809], + "rotation": [3.1416, 0.5971, 3.1416], + "scale": [1, 1, 1] + }, { "name": "immeuble1", "type": "Mesh", @@ -38643,10 +38412,17 @@ { "name": "immeuble1", "type": "Object3D", - "position": [74.9084, 7.1908, 16.8962], + "position": [77.6876, 6.2066, 19.0807], "rotation": [3.1416, 0.6567, -3.1416], "scale": [1, 1, 1], "children": [ + { + "name": "immeuble_2", + "type": "Mesh", + "position": [80.4667, 5.2224, 21.2652], + "rotation": [3.1416, 0.6567, 3.1416], + "scale": [1, 1, 1] + }, { "name": "immeuble1", "type": "Mesh", @@ -38659,10 +38435,17 @@ { "name": "immeuble1", "type": "Object3D", - "position": [33.331, 9.4074, -39.3608], + "position": [35.8706, 8.4233, -36.9019], "rotation": [3.1416, 0.7598, -3.1416], "scale": [1, 1, 1], "children": [ + { + "name": "immeuble_2", + "type": "Mesh", + "position": [38.4102, 7.4391, -34.443], + "rotation": [3.1416, 0.7598, 3.1416], + "scale": [1, 1, 1] + }, { "name": "immeuble1", "type": "Mesh", @@ -38675,10 +38458,17 @@ { "name": "immeuble1", "type": "Object3D", - "position": [77.2281, 7.212, -4.9471], + "position": [79.3194, 6.2278, -2.0972], "rotation": [3.1416, 0.9283, -3.1416], "scale": [1, 1, 1], "children": [ + { + "name": "immeuble_2", + "type": "Mesh", + "position": [81.4108, 5.2437, 0.7526], + "rotation": [3.1416, 0.9283, 3.1416], + "scale": [1, 1, 1] + }, { "name": "immeuble1", "type": "Mesh", @@ -38691,10 +38481,17 @@ { "name": "immeuble1", "type": "Object3D", - "position": [96.8126, 5.5512, -45.1283], + "position": [96.5106, 4.567, -41.6063], "rotation": [0, 1.4947, 0], "scale": [1, 1, 1], "children": [ + { + "name": "immeuble_2", + "type": "Mesh", + "position": [96.2087, 3.5829, -38.0843], + "rotation": [0, 1.4947, 0], + "scale": [1, 1, 1] + }, { "name": "immeuble1", "type": "Mesh", @@ -38707,10 +38504,17 @@ { "name": "immeuble1", "type": "Object3D", - "position": [71.646, 7.4033, -24.9023], + "position": [72.7641, 6.4192, -21.5489], "rotation": [3.1416, 1.2395, -3.1416], "scale": [1, 1, 1], "children": [ + { + "name": "immeuble_2", + "type": "Mesh", + "position": [73.8823, 5.435, -18.1955], + "rotation": [3.1416, 1.2395, 3.1416], + "scale": [1, 1, 1] + }, { "name": "immeuble1", "type": "Mesh", @@ -38723,10 +38527,17 @@ { "name": "immeuble1", "type": "Object3D", - "position": [56.0593, 9.4074, -8.3934], + "position": [56.6478, 8.4233, -4.9078], "rotation": [3.1416, 1.3941, -3.1416], "scale": [1, 1, 1], "children": [ + { + "name": "immeuble_2", + "type": "Mesh", + "position": [57.2363, 7.4391, -1.4223], + "rotation": [3.1416, 1.3941, 3.1416], + "scale": [1, 1, 1] + }, { "name": "immeuble1", "type": "Mesh", @@ -38739,10 +38550,17 @@ { "name": "immeuble1", "type": "Object3D", - "position": [108.8451, 5.3925, -19.2984], + "position": [110.4581, 4.4084, -16.153], "rotation": [3.1416, 1.0875, -3.1416], "scale": [1, 1, 1], "children": [ + { + "name": "immeuble_2", + "type": "Mesh", + "position": [112.0712, 3.4242, -13.0076], + "rotation": [3.1416, 1.0875, 3.1416], + "scale": [1, 1, 1] + }, { "name": "immeuble1", "type": "Mesh", @@ -40600,6 +40418,85 @@ "rotation": [0, -1.5519, 0], "scale": [1, 1, 1], "children": [ + { + "name": "immeuble1", + "type": "Object3D", + "role": "group", + "position": [0, 0, 0], + "rotation": [0, 0, 0], + "scale": [1, 1, 1], + "children": [ + { + "name": "immeuble1", + "type": "Object3D", + "position": [41.2436, 4.9268, 85.9236], + "rotation": [-3.1416, -0.7879, -3.1416], + "scale": [1, 1, 1], + "children": [ + { + "name": "immeuble_2", + "type": "Mesh", + "position": [43.9828, 3.8964, 80.0347], + "rotation": [3.0968, -0.7874, 3.1104], + "scale": [1, 1, 1] + }, + { + "name": "immeuble1", + "type": "Mesh", + "position": [38.9058, 5.8659, 84.9543], + "rotation": [3.0968, -0.7874, 3.1104], + "scale": [1, 1, 1] + } + ] + }, + { + "name": "immeuble1", + "type": "Object3D", + "position": [68.0365, 12.8264, 90.8185], + "rotation": [-3.1416, -0.5678, -3.1416], + "scale": [1, 1, 1], + "children": [ + { + "name": "immeuble_2", + "type": "Mesh", + "position": [72.189, 3.1922, 85.8558], + "rotation": [-3.1416, -0.5678, 3.1416], + "scale": [1, 1, 1] + }, + { + "name": "immeuble1", + "type": "Mesh", + "position": [66.1929, 5.1605, 89.6013], + "rotation": [-3.1416, -0.5678, -3.1416], + "scale": [1, 1, 1] + } + ] + }, + { + "name": "immeuble1", + "type": "Object3D", + "position": [61.7855, 15.3193, 38.8586], + "rotation": [-3.1416, -0.5678, -3.1416], + "scale": [1, 1, 1], + "children": [ + { + "name": "immeuble_2", + "type": "Mesh", + "position": [65.9379, 5.6851, 33.8958], + "rotation": [-3.1416, -0.5678, 3.1416], + "scale": [1, 1, 1] + }, + { + "name": "immeuble1", + "type": "Mesh", + "position": [59.9418, 7.6534, 37.6414], + "rotation": [-3.1416, -0.5678, -3.1416], + "scale": [1, 1, 1] + } + ] + } + ] + }, { "name": "lafabrik", "type": "Object3D", @@ -40626,122 +40523,6 @@ } ] }, - { - "name": "immeuble_2", - "type": "Object3D", - "role": "group", - "position": [0, 0, 0], - "rotation": [0, 0, 0], - "scale": [1, 1, 1], - "children": [ - { - "name": "immeuble_2", - "type": "Object3D", - "position": [43.9828, 3.8964, 80.0347], - "rotation": [3.0968, -0.7874, 3.1104], - "scale": [1, 1, 1], - "children": [ - { - "name": "immeuble_2", - "type": "Mesh", - "position": [43.9828, 3.8964, 80.0347], - "rotation": [3.0968, -0.7874, 3.1104], - "scale": [1, 1, 1] - } - ] - }, - { - "name": "immeuble_2", - "type": "Object3D", - "position": [72.189, 3.1922, 85.8558], - "rotation": [-3.1416, -0.5678, 3.1416], - "scale": [1, 1, 1], - "children": [ - { - "name": "immeuble_2", - "type": "Mesh", - "position": [72.189, 3.1922, 85.8558], - "rotation": [-3.1416, -0.5678, 3.1416], - "scale": [1, 1, 1] - } - ] - }, - { - "name": "immeuble_2", - "type": "Object3D", - "position": [65.9379, 5.6851, 33.8958], - "rotation": [-3.1416, -0.5678, 3.1416], - "scale": [1, 1, 1], - "children": [ - { - "name": "immeuble_2", - "type": "Mesh", - "position": [65.9379, 5.6851, 33.8958], - "rotation": [-3.1416, -0.5678, 3.1416], - "scale": [1, 1, 1] - } - ] - } - ] - }, - { - "name": "immeuble1", - "type": "Object3D", - "role": "group", - "position": [0, 0, 0], - "rotation": [0, 0, 0], - "scale": [1, 1, 1], - "children": [ - { - "name": "immeuble1", - "type": "Object3D", - "position": [38.9058, 5.8659, 84.9543], - "rotation": [3.0968, -0.7874, 3.1104], - "scale": [1, 1, 1], - "children": [ - { - "name": "immeuble1", - "type": "Mesh", - "position": [38.9058, 5.8659, 84.9543], - "rotation": [3.0968, -0.7874, 3.1104], - "scale": [1, 1, 1] - } - ] - }, - { - "name": "immeuble1", - "type": "Object3D", - "position": [66.1929, 5.1605, 89.6013], - "rotation": [-3.1416, -0.5678, -3.1416], - "scale": [1, 1, 1], - "children": [ - { - "name": "immeuble1", - "type": "Mesh", - "position": [66.1929, 5.1605, 89.6013], - "rotation": [-3.1416, -0.5678, -3.1416], - "scale": [1, 1, 1] - } - ] - }, - { - "name": "immeuble1", - "type": "Object3D", - "position": [59.9418, 7.6534, 37.6414], - "rotation": [-3.1416, -0.5678, -3.1416], - "scale": [1, 1, 1], - "children": [ - { - "name": "immeuble1", - "type": "Mesh", - "position": [59.9418, 7.6534, 37.6414], - "rotation": [-3.1416, -0.5678, -3.1416], - "scale": [1, 1, 1] - } - ] - } - ] - }, { "name": "maison1", "type": "Object3D", diff --git a/scripts/transformMap.cjs b/scripts/transformMap.cjs index f24616e..c95abd0 100644 --- a/scripts/transformMap.cjs +++ b/scripts/transformMap.cjs @@ -72,6 +72,14 @@ function createRenderableObject(objectNode, meshNode) { }; } +function createRenderableContainer(objectNode, meshNodes) { + return { + ...cloneNode(objectNode), + type: "Object3D", + children: meshNodes.map(mapMeshNode), + }; +} + function addRenderable(parent, objectNode, meshNode) { const renderable = createRenderableObject(objectNode, meshNode); getOrCreateModelGroup(parent, renderable.name).children.push(renderable); @@ -95,6 +103,36 @@ function addObjectsByRange(rawData, parent, start, end, allowedNames) { } } +function addBuildingsByRange(rawData, parent, start, end) { + for (let i = start; i <= end; i++) { + const node = rawData[i]; + if (node?.type !== "Object3D" || node.name !== "immeuble1") continue; + + const meshNodes = []; + for (let childIndex = i + 1; childIndex <= end; childIndex++) { + const childNode = rawData[childIndex]; + + if (childNode?.type === "Object3D") { + if (BUILDING_CHILD_OBJECT_NAMES.has(childNode.name)) continue; + break; + } + + if ( + childNode?.type === "Mesh" && + BUILDING_MESH_NAMES.has(childNode.name) + ) { + meshNodes.push(childNode); + } + } + + if (meshNodes.length > 0) { + getOrCreateModelGroup(parent, node.name).children.push( + createRenderableContainer(node, meshNodes), + ); + } + } +} + function getNearestGroup(groups, node) { const [x, , z] = node.position; @@ -116,6 +154,9 @@ function createResidenceZones(rawData, residence) { return zone; }); + addBuildingsByRange(rawData, zones[0], 831, 873); + addBuildingsByRange(rawData, zones[1], 875, 891); + addBuildingsByRange(rawData, zones[2], 893, 942); addObjectsByRange(rawData, zones[0], 831, 873, RESIDENCE_MESH_NAMES); addObjectsByRange(rawData, zones[1], 875, 891, RESIDENCE_MESH_NAMES); addObjectsByRange(rawData, zones[2], 893, 942, RESIDENCE_MESH_NAMES); @@ -144,7 +185,13 @@ const CHAMP_MESH_NAMES = new Set([ "champsdetournesol", ]); const FERME_MESH_NAMES = new Set(["buissons", "buisson", "fermeverticale"]); -const RESIDENCE_MESH_NAMES = new Set(["immeuble_1", "immeuble_2", "maison1"]); +const RESIDENCE_MESH_NAMES = new Set(["maison1"]); +const BUILDING_CHILD_OBJECT_NAMES = new Set([ + "immeuble", + "immeuble_1", + "immeuble_2", +]); +const BUILDING_MESH_NAMES = new Set(["immeuble_1", "immeuble_2"]); const ENERGIE_MESH_NAMES = new Set([ "pyloneelectrique", "eoliennes", @@ -161,12 +208,7 @@ const DIRECTION_MESH_NAMES = new Set([ "panneaudirresidences2", "panneauxquartier", ]); -const LAFABRIK_MESH_NAMES = new Set([ - "lafabrik", - "immeuble_1", - "immeuble_2", - "maison1", -]); +const LAFABRIK_MESH_NAMES = new Set(["lafabrik", "maison1"]); function transformMap() { console.log("Reading map_raw.json..."); const rawData = JSON.parse(fs.readFileSync(INPUT_PATH, "utf-8")); @@ -225,6 +267,7 @@ function transformMap() { addObjectsByRange(rawData, ferme, 4595, 4799, FERME_MESH_NAMES); addObjectsByRange(rawData, vegetation, 4750, 4797, VEGETATION_MESH_NAMES); addObjectsByRange(rawData, energie, 4801, 4872, ENERGIE_MESH_NAMES); + addBuildingsByRange(rawData, lafabrik, 4874, 4894); addObjectsByRange(rawData, lafabrik, 4874, 4894, LAFABRIK_MESH_NAMES); addObjectsByRange(rawData, direction, 4896, 4897, DIRECTION_MESH_NAMES); addObjectsByRange(rawData, vegetation, 4898, 4997, VEGETATION_MESH_NAMES); diff --git a/src/world/GameMap.tsx b/src/world/GameMap.tsx index d74d2dc..8635ea6 100644 --- a/src/world/GameMap.tsx +++ b/src/world/GameMap.tsx @@ -17,24 +17,18 @@ import type { SceneLoadingChangeHandler } from "@/types/world/sceneLoading"; import { logger } from "@/utils/core/Logger"; import { loadMapSceneData } from "@/utils/map/loadMapSceneData"; import { logModelLoadError } from "@/utils/three/modelLoadLogger"; +import { INSTANCED_MAP_EXCEPTIONS } from "@/world/vegetation/vegetationConfig"; import type { MapNode } from "@/types/editor/editor"; import type { OctreeReadyHandler } from "@/types/three/three"; +const MODEL_RENDER_SCALE: [number, number, number] = [1, 1, 1]; + interface LoadedMapNode { node: MapNode; modelUrl: string | null; } const MAP_STRUCTURE_NODE_NAMES = new Set(["Scene", "blocking"]); -const LITE_MAP_SKIPPED_NODE_NAMES = new Set([ - "arbre", - "buisson", - "champdeble", - "champdesoja", - "champsdetournesol", - "sapin", -]); - interface ErrorBoundaryProps { children: ReactNode; fallback: ReactNode; @@ -256,7 +250,7 @@ function liteMap(node: MapNode): boolean { return false; } - return !LITE_MAP_SKIPPED_NODE_NAMES.has(node.name); + return INSTANCED_MAP_EXCEPTIONS.has(node.name); } function MapNodeInstance({ @@ -294,12 +288,12 @@ function ModelInstance({ modelUrl: string; onLoaded: () => void; }): React.JSX.Element { - const { position, rotation, scale } = node; + const { position, rotation } = node; const { scene } = useLoggedGLTF(modelUrl, { scope: "GameMap.ModelInstance", position, rotation, - scale, + scale: MODEL_RENDER_SCALE, }); const sceneInstance = useClonedObject(scene); @@ -318,7 +312,7 @@ function ModelInstance({ object={sceneInstance} position={position} rotation={rotation} - scale={scale} + scale={MODEL_RENDER_SCALE} /> ); } diff --git a/src/world/vegetation/InstancedVegetation.tsx b/src/world/vegetation/InstancedVegetation.tsx index b7f73d1..710b917 100644 --- a/src/world/vegetation/InstancedVegetation.tsx +++ b/src/world/vegetation/InstancedVegetation.tsx @@ -14,10 +14,12 @@ interface InstancedVegetationProps { interface MeshData { geometry: THREE.BufferGeometry; material: THREE.Material | THREE.Material[]; + localMatrix: THREE.Matrix4; } function extractMeshes(scene: THREE.Group): MeshData[] { const meshes: MeshData[] = []; + scene.updateMatrixWorld(true); scene.traverse((child) => { if (child instanceof THREE.Mesh) { @@ -26,6 +28,7 @@ function extractMeshes(scene: THREE.Group): MeshData[] { material: Array.isArray(child.material) ? child.material.map((m) => m.clone()) : child.material.clone(), + localMatrix: child.matrixWorld.clone(), }); } }); @@ -40,7 +43,7 @@ function createInstanceMatrices( const position = new THREE.Vector3(); const rotation = new THREE.Euler(); const quaternion = new THREE.Quaternion(); - const scale = new THREE.Vector3(); + const scale = new THREE.Vector3(1, 1, 1); for (const instance of instances) { const matrix = new THREE.Matrix4(); @@ -48,8 +51,6 @@ function createInstanceMatrices( position.set(...instance.position); rotation.set(...instance.rotation); quaternion.setFromEuler(rotation); - scale.set(...instance.scale); - matrix.compose(position, quaternion, scale); matrices.push(matrix); } @@ -83,7 +84,10 @@ export function InstancedVegetation({ for (let i = 0; i < matrices.length; i++) { const matrix = matrices[i]; if (matrix) { - instancedMesh.setMatrixAt(i, matrix); + instancedMesh.setMatrixAt( + i, + new THREE.Matrix4().multiplyMatrices(matrix, meshData.localMatrix), + ); } } diff --git a/src/world/vegetation/VegetationSystem.tsx b/src/world/vegetation/VegetationSystem.tsx index f5bb962..a8e9d4c 100644 --- a/src/world/vegetation/VegetationSystem.tsx +++ b/src/world/vegetation/VegetationSystem.tsx @@ -1,10 +1,6 @@ import { Suspense } from "react"; import { InstancedVegetation } from "@/world/vegetation/InstancedVegetation"; import { useVegetationData } from "@/world/vegetation/useVegetationData"; -import { - VEGETATION_TYPES, - type VegetationType, -} from "@/world/vegetation/vegetationConfig"; export function VegetationSystem(): React.JSX.Element | null { const { data, isLoading } = useVegetationData(); @@ -13,26 +9,20 @@ export function VegetationSystem(): React.JSX.Element | null { return null; } - const enabledTypes = Object.entries(VEGETATION_TYPES).filter( - ([, config]) => config.enabled, - ); - return ( - - {enabledTypes.map(([type, config]) => { - const instances = data.get(type as VegetationType); - - if (!instances || instances.length === 0) { + + {[...data.entries()].map(([modelName, entry]) => { + if (entry.instances.length === 0) { return null; } return ( - + ); diff --git a/src/world/vegetation/useVegetationData.ts b/src/world/vegetation/useVegetationData.ts index 2695de2..c6a9e16 100644 --- a/src/world/vegetation/useVegetationData.ts +++ b/src/world/vegetation/useVegetationData.ts @@ -1,11 +1,8 @@ import { useEffect, useState } from "react"; import type { MapNode } from "@/types/editor/editor"; import type { Vector3Tuple } from "@/types/three/three"; -import { getMapNodes, loadMapSceneData } from "@/utils/map/loadMapSceneData"; -import { - VEGETATION_TYPES, - type VegetationType, -} from "@/world/vegetation/vegetationConfig"; +import { loadMapSceneData } from "@/utils/map/loadMapSceneData"; +import { INSTANCED_MAP_EXCEPTIONS } from "@/world/vegetation/vegetationConfig"; export interface VegetationInstance { position: Vector3Tuple; @@ -13,7 +10,12 @@ export interface VegetationInstance { scale: Vector3Tuple; } -export type VegetationData = Map; +export interface InstancedMapEntry { + modelPath: string; + instances: VegetationInstance[]; +} + +export type VegetationData = Map; function mapNodeToInstance(node: MapNode): VegetationInstance { return { @@ -23,20 +25,28 @@ function mapNodeToInstance(node: MapNode): VegetationInstance { }; } -function extractVegetationData(mapNodes: MapNode[]): VegetationData { +function extractVegetationData( + mapNodes: MapNode[], + models: Map, +): VegetationData { const data: VegetationData = new Map(); - for (const [type, config] of Object.entries(VEGETATION_TYPES)) { - if (!config.enabled) continue; + for (const node of mapNodes) { + if (node.type !== "Object3D") continue; + if (INSTANCED_MAP_EXCEPTIONS.has(node.name)) continue; - const instances = mapNodes - .filter( - (node) => node.name === config.mapName && node.type === "Object3D", - ) - .map(mapNodeToInstance); + const modelPath = models.get(node.name); + if (!modelPath) continue; - if (instances.length > 0) { - data.set(type as VegetationType, instances); + const entry = data.get(node.name); + + if (entry) { + entry.instances.push(mapNodeToInstance(node)); + } else { + data.set(node.name, { + modelPath, + instances: [mapNodeToInstance(node)], + }); } } @@ -54,21 +64,10 @@ export function useVegetationData(): { let cancelled = false; async function load() { - const cachedNodes = getMapNodes(); + const sceneData = await loadMapSceneData(); - if (cachedNodes) { - if (!cancelled) { - setData(extractVegetationData(cachedNodes)); - setIsLoading(false); - } - return; - } - - await loadMapSceneData(); - const nodes = getMapNodes(); - - if (!cancelled && nodes) { - setData(extractVegetationData(nodes)); + if (!cancelled && sceneData) { + setData(extractVegetationData(sceneData.mapNodes, sceneData.models)); setIsLoading(false); } } diff --git a/src/world/vegetation/vegetationConfig.ts b/src/world/vegetation/vegetationConfig.ts index ada9464..e904349 100644 --- a/src/world/vegetation/vegetationConfig.ts +++ b/src/world/vegetation/vegetationConfig.ts @@ -4,62 +4,11 @@ export const VEGETATION_LOD = { windFadeEnd: 70, }; -export const VEGETATION_TYPES = { - buissons: { - mapName: "buisson", - modelPath: "/models/buisson/model.gltf", - castShadow: true, - receiveShadow: true, - enabled: true, - windEnabled: false, - windIntensity: 1.2, - }, - sapin: { - mapName: "sapin", - modelPath: "/models/sapin/model.gltf", - castShadow: true, - receiveShadow: true, - enabled: true, - windEnabled: false, - windIntensity: 0.6, - }, - arbre: { - mapName: "arbre", - modelPath: "/models/arbre/model.gltf", - castShadow: true, - receiveShadow: true, - enabled: true, - windEnabled: false, - windIntensity: 0.8, - }, - champdeble: { - mapName: "champdeble", - modelPath: "/models/champdeble/model.gltf", - castShadow: true, - receiveShadow: true, - enabled: true, - windEnabled: false, - windIntensity: 1.0, - }, - champdesoja: { - mapName: "champdesoja", - modelPath: "/models/champdesoja/model.gltf", - castShadow: true, - receiveShadow: true, - enabled: true, - windEnabled: false, - windIntensity: 1.0, - }, - champsdetournesol: { - mapName: "champsdetournesol", - modelPath: "/models/champsdetournesol/model.gltf", - castShadow: true, - receiveShadow: true, - enabled: true, - windEnabled: false, - windIntensity: 0.9, - }, -} as const; - -export type VegetationType = keyof typeof VEGETATION_TYPES; -export type VegetationConfig = (typeof VEGETATION_TYPES)[VegetationType]; +export const INSTANCED_MAP_EXCEPTIONS = new Set([ + "Scene", + "blocking", + "terrain", + "ecole", + "generateur", + "lafabrik", +]);