Feat/map-environment #6
+320
-539
@@ -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",
|
||||
|
||||
@@ -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);
|
||||
|
||||
+7
-13
@@ -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}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -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),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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 (
|
||||
<group name="vegetation-system">
|
||||
{enabledTypes.map(([type, config]) => {
|
||||
const instances = data.get(type as VegetationType);
|
||||
|
||||
if (!instances || instances.length === 0) {
|
||||
<group name="instanced-map-system">
|
||||
{[...data.entries()].map(([modelName, entry]) => {
|
||||
if (entry.instances.length === 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return (
|
||||
<Suspense key={type} fallback={null}>
|
||||
<Suspense key={modelName} fallback={null}>
|
||||
<InstancedVegetation
|
||||
modelPath={config.modelPath}
|
||||
instances={instances}
|
||||
castShadow={config.castShadow}
|
||||
receiveShadow={config.receiveShadow}
|
||||
modelPath={entry.modelPath}
|
||||
instances={entry.instances}
|
||||
castShadow={true}
|
||||
receiveShadow={true}
|
||||
/>
|
||||
</Suspense>
|
||||
);
|
||||
|
||||
@@ -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<VegetationType, VegetationInstance[]>;
|
||||
export interface InstancedMapEntry {
|
||||
modelPath: string;
|
||||
instances: VegetationInstance[];
|
||||
}
|
||||
|
||||
export type VegetationData = Map<string, InstancedMapEntry>;
|
||||
|
||||
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<string, string>,
|
||||
): 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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
]);
|
||||
|
||||
Reference in New Issue
Block a user