Compare commits
	
		
			77 Commits
		
	
	
		
			b1199f6a21
			...
			v4.3-beta1
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| e22b888bfc | |||
| 88ef1d3202 | |||
| f2af90c876 | |||
| 4dba3c3a71 | |||
| e31a677d83 | |||
| 35fcbe54b5 | |||
| 9e83fe0a10 | |||
| 33fb1a65d3 | |||
| 415cc98758 | |||
| 2d93ce1340 | |||
| 1129872234 | |||
| 2b2b18cfa4 | |||
| b19800e37f | |||
| e14729500c | |||
| 48bfc54830 | |||
| 7e74e42bd7 | |||
| 96a81b165b | |||
| 0681f0d240 | |||
| d700f1276a | |||
| 3bea3d67b9 | |||
| ec41b7553a | |||
| 9e2539499e | |||
| 3a5cd1c937 | |||
| 1afa5f9893 | |||
| 1383e87104 | |||
| a2b8f41a21 | |||
| 93f23abeb9 | |||
| 4ba3ff9e5a | |||
| a9a889a8fd | |||
| fc34b19a42 | |||
| 9e65d258d7 | |||
| ab266a07fb | |||
| 61c7709b97 | |||
| 1044d4b450 | |||
| 54edc4dab7 | |||
| f40efb0467 | |||
| 10de948a79 | |||
| 0ae95e927f | |||
| 9f591113f8 | |||
| 685a0b8066 | |||
| a1a215ec19 | |||
| 3bed920f11 | |||
| 6dc82aade6 | |||
| ac6692cd97 | |||
| 14de9f3f1b | |||
| dd64c0ce04 | |||
| 84f6baae6a | |||
| 5afbf679ed | |||
| 89f5b5990d | |||
| b441063061 | |||
| b96550ca5c | |||
| cc74a2ca8b | |||
| f9fe4af1fe | |||
| 4a96906002 | |||
| c448216496 | |||
| f10c273067 | |||
| 04aa879c22 | |||
| 4ffe29654b | |||
| 1d7ac76d0e | |||
| 77315ffbea | |||
| 0862ecd269 | |||
| f4d3e48be2 | |||
| 6ae8899912 | |||
| 76f1cdc3c7 | |||
| 8105b110f2 | |||
| acb87b3844 | |||
| 94d5c934c6 | |||
| 3372c7a4b7 | |||
| 4181096a9e | |||
| 89a5e6367b | |||
| cb893b770a | |||
| 2f08455518 | |||
| 729e12ed7b | |||
| fe47861bd0 | |||
| c894d88c54 | |||
| c8d59ef5f4 | |||
| f5c50ae079 | 
							
								
								
									
										11
									
								
								.gitattributes
									
									
									
									
										vendored
									
									
								
							
							
						
						| @ -1,7 +1,6 @@ | ||||
| # all png are binary | ||||
| # All PNG image are binary | ||||
| *.png binary | ||||
| # our generated mesh should be save as binary | ||||
| *.bin binary | ||||
| # the raw json data should be binary | ||||
| # although i edit it manually | ||||
| bbp_ng/raw_jsons/*.json    binary | ||||
| # Element placeholder mesh should be save as binary | ||||
| *.ph binary | ||||
| # Raw json data should be binary, although i edit it manually | ||||
| assets/jsons/*.json5    binary | ||||
|  | ||||
							
								
								
									
										5
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						| @ -1,2 +1,3 @@ | ||||
| # disable distribution build folder | ||||
| redist/ | ||||
| ## ===== Personal ===== | ||||
| # Disable VSCode | ||||
| .vscode/ | ||||
|  | ||||
| Before Width: | Height: | Size: 785 B After Width: | Height: | Size: 785 B | 
| Before Width: | Height: | Size: 6.3 KiB After Width: | Height: | Size: 6.3 KiB | 
| Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB | 
| Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 31 KiB | 
| Before Width: | Height: | Size: 6.7 KiB After Width: | Height: | Size: 6.7 KiB | 
| Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 24 KiB | 
							
								
								
									
										
											BIN
										
									
								
								assets/icons/bme/NormalFloorTerminal.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 30 KiB | 
| Before Width: | Height: | Size: 6.2 KiB After Width: | Height: | Size: 6.2 KiB | 
| Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 30 KiB | 
| Before Width: | Height: | Size: 7.0 KiB After Width: | Height: | Size: 7.0 KiB | 
| Before Width: | Height: | Size: 58 KiB After Width: | Height: | Size: 58 KiB | 
| Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 22 KiB | 
| Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 27 KiB | 
| Before Width: | Height: | Size: 39 KiB After Width: | Height: | Size: 39 KiB | 
| Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB | 
| Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB | 
| Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB | 
| Before Width: | Height: | Size: 108 KiB After Width: | Height: | Size: 108 KiB | 
| Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 31 KiB | 
| Before Width: | Height: | Size: 6.8 KiB After Width: | Height: | Size: 6.8 KiB | 
| Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 25 KiB | 
							
								
								
									
										
											BIN
										
									
								
								assets/icons/bme/SinkFloorTerminal.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 31 KiB | 
| Before Width: | Height: | Size: 6.5 KiB After Width: | Height: | Size: 6.5 KiB | 
| Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 30 KiB | 
| Before Width: | Height: | Size: 7.2 KiB After Width: | Height: | Size: 7.2 KiB | 
| Before Width: | Height: | Size: 108 KiB After Width: | Height: | Size: 108 KiB | 
| Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 23 KiB | 
| Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 28 KiB | 
| Before Width: | Height: | Size: 39 KiB After Width: | Height: | Size: 39 KiB | 
| Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 25 KiB | 
| Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 26 KiB | 
							
								
								
									
										
											BIN
										
									
								
								assets/icons/bme/WideFloorTerminal.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 42 KiB | 
| Before Width: | Height: | Size: 58 KiB After Width: | Height: | Size: 58 KiB | 
| Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 32 KiB | 
| Before Width: | Height: | Size: 43 KiB After Width: | Height: | Size: 43 KiB | 
| Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 27 KiB | 
| Before Width: | Height: | Size: 663 B After Width: | Height: | Size: 663 B | 
| Before Width: | Height: | Size: 745 B After Width: | Height: | Size: 745 B | 
| Before Width: | Height: | Size: 945 B After Width: | Height: | Size: 945 B | 
| Before Width: | Height: | Size: 818 B After Width: | Height: | Size: 818 B | 
| Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 2.3 KiB | 
| Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 2.6 KiB | 
| Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 2.6 KiB | 
| Before Width: | Height: | Size: 984 B After Width: | Height: | Size: 984 B | 
| Before Width: | Height: | Size: 611 B After Width: | Height: | Size: 611 B | 
| Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB | 
| Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB | 
| Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB | 
| Before Width: | Height: | Size: 471 B After Width: | Height: | Size: 471 B | 
| Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB | 
| Before Width: | Height: | Size: 494 B After Width: | Height: | Size: 494 B | 
| Before Width: | Height: | Size: 360 B After Width: | Height: | Size: 360 B | 
| Before Width: | Height: | Size: 992 B After Width: | Height: | Size: 992 B | 
| Before Width: | Height: | Size: 444 B After Width: | Height: | Size: 444 B | 
| Before Width: | Height: | Size: 691 B After Width: | Height: | Size: 691 B | 
| Before Width: | Height: | Size: 775 B After Width: | Height: | Size: 775 B | 
| Before Width: | Height: | Size: 807 B After Width: | Height: | Size: 807 B | 
| Before Width: | Height: | Size: 652 B After Width: | Height: | Size: 652 B | 
| Before Width: | Height: | Size: 695 B After Width: | Height: | Size: 695 B | 
| Before Width: | Height: | Size: 550 B After Width: | Height: | Size: 550 B | 
| Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 1.8 KiB | 
| Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 1.9 KiB | 
| Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 1.9 KiB | 
| Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 2.2 KiB | 
| Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 2.5 KiB | 
| Before Width: | Height: | Size: 265 B After Width: | Height: | Size: 265 B | 
| @ -22,52 +22,61 @@ | ||||
|         "faces": [], | ||||
|         "instances": [ | ||||
|             { | ||||
|                 "identifier": "raw_floor_corner", | ||||
|                 "identifier": "cv_triangle_side", | ||||
|                 "skip": "False", | ||||
|                 "params": { | ||||
|                     "edge_length": "5", | ||||
|                     "tip_offset": "2.5", | ||||
|                     "height": "height", | ||||
|                     "face": "(face[0], face[1], face[4], False, face[3], False)", | ||||
|                     "is_sink": "is_sink", | ||||
|                     "is_inner": "False", | ||||
|                     "is_ribbon": "False" | ||||
|                     "face": "(face[0], False, False, False, face[3], None)", | ||||
|                     "is_sink": "is_sink" | ||||
|                 }, | ||||
|                 "transform": "move(5, 0, 0) @ rot(0, 0, -270)" | ||||
|                 "transform": "move(5, 0, 0) @ rot(0, 0, 90)" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "raw_floor_corner", | ||||
|                 "identifier": "cv_triangle_side", | ||||
|                 "skip": "False", | ||||
|                 "params": { | ||||
|                     "edge_length": "5", | ||||
|                     "tip_offset": "2.5", | ||||
|                     "height": "height", | ||||
|                     "face": "(face[0], face[1], face[3], False, face[5], False)", | ||||
|                     "is_sink": "is_sink", | ||||
|                     "is_inner": "False", | ||||
|                     "is_ribbon": "False" | ||||
|                     "face": "(face[0], False, False, False, face[5], None)", | ||||
|                     "is_sink": "is_sink" | ||||
|                 }, | ||||
|                 "transform": "move(5, 5, 0) @ rot(0, 0, -180)" | ||||
|                 "transform": "move(5, 5, 0) @ rot(0, 0, 180)" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "raw_floor_corner", | ||||
|                 "identifier": "cv_triangle_side", | ||||
|                 "skip": "False", | ||||
|                 "params": { | ||||
|                     "edge_length": "5", | ||||
|                     "tip_offset": "2.5", | ||||
|                     "height": "height", | ||||
|                     "face": "(face[0], face[1], face[5], False, face[2], False)", | ||||
|                     "is_sink": "is_sink", | ||||
|                     "is_inner": "False", | ||||
|                     "is_ribbon": "False" | ||||
|                     "face": "(face[0], False, False, False, face[2], None)", | ||||
|                     "is_sink": "is_sink" | ||||
|                 }, | ||||
|                 "transform": "move(0, 5, 0) @ rot(0, 0, -90)" | ||||
|                 "transform": "move(0, 5, 0) @ rot(0, 0, 270)" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "raw_floor_corner", | ||||
|                 "identifier": "cv_triangle_side", | ||||
|                 "skip": "False", | ||||
|                 "params": { | ||||
|                     "edge_length": "5", | ||||
|                     "tip_offset": "2.5", | ||||
|                     "height": "height", | ||||
|                     "face": "(face[0], face[1], face[2], False, face[4], False)", | ||||
|                     "is_sink": "is_sink", | ||||
|                     "is_inner": "False", | ||||
|                     "is_ribbon": "False" | ||||
|                     "face": "(face[0], False, False, False, face[4], None)", | ||||
|                     "is_sink": "is_sink" | ||||
|                 }, | ||||
|                 "transform": "move(0, 0, 0)" | ||||
|                 "transform": "ident()" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "floor_rectangle_bottom", | ||||
|                 "skip": "not face[1]", | ||||
|                 "params": { | ||||
|                     "length": "5", | ||||
|                     "width": "5" | ||||
|                 }, | ||||
|                 "transform": "move(0, 0, -height)" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
| @ -75,6 +84,7 @@ | ||||
|         "identifier": "floor_normal_1x1", | ||||
|         "showcase": { | ||||
|             "title": "Normal 1x1", | ||||
|             "category": "1x1 Blocks", | ||||
|             "icon": "Normal1x1", | ||||
|             "type": "floor", | ||||
|             "cfgs": [ | ||||
| @ -125,6 +135,7 @@ | ||||
|         "identifier": "floor_sink_1x1", | ||||
|         "showcase": { | ||||
|             "title": "Sink 1x1", | ||||
|             "category": "1x1 Blocks", | ||||
|             "icon": "Sink1x1", | ||||
|             "type": "floor", | ||||
|             "cfgs": [ | ||||
| @ -25,105 +25,23 @@ | ||||
|             } | ||||
|         ], | ||||
|         "skip": "length == 0.0", | ||||
|         "vars": [ | ||||
|             { | ||||
|                 "field": "uv_length", | ||||
|                 "data": "length / 5.0" | ||||
|             }, | ||||
|             { | ||||
|                 "field": "uv_border_texture", | ||||
|                 "data": "1.0 if is_ribbon else 0.5" | ||||
|             }, | ||||
|             { | ||||
|                 "field": "sink", | ||||
|                 "data": "0.7 if is_sink else 0.0" | ||||
|             } | ||||
|         ], | ||||
|         "vertices": [ | ||||
|             { | ||||
|                 "skip": "not face[0]", | ||||
|                 "data": "(0, 0, 0)" | ||||
|             }, | ||||
|             { | ||||
|                 "skip": "not face[0]", | ||||
|                 "data": "(0, 2.5, -sink)" | ||||
|             }, | ||||
|             { | ||||
|                 "skip": "not face[0]", | ||||
|                 "data": "(length, 0, 0)" | ||||
|             }, | ||||
|             { | ||||
|                 "skip": "not face[0]", | ||||
|                 "data": "(length, 2.5, -sink)" | ||||
|             } | ||||
|         ], | ||||
|         "faces": [ | ||||
|             { | ||||
|                 "skip": "not face[0]", | ||||
|                 "texture": "(\"FloorTopFlat\" if is_ribbon else \"FloorTopProfil\") if is_sink else \"FloorTopBorder\"", | ||||
|                 "indices": [0, 2, 3, 1], | ||||
|                 "uvs": [ | ||||
|                     "(0, 0)", | ||||
|                     "(0, uv_length)", | ||||
|                     "(uv_border_texture, uv_length)", | ||||
|                     "(uv_border_texture, 0)" | ||||
|                 ], | ||||
|                 "normals": null | ||||
|             } | ||||
|         ], | ||||
|         "vars": [], | ||||
|         "vertices": [], | ||||
|         "faces": [], | ||||
|         "instances": [ | ||||
|             { | ||||
|                 "identifier": "raw_floor_side", | ||||
|                 "skip": "not face[4]", | ||||
|                 "identifier": "cv_trapezoid_side", | ||||
|                 "skip": "False", | ||||
|                 "params": { | ||||
|                     "long_edge_length": "length", | ||||
|                     "short_edge_offset": "0", | ||||
|                     "short_edge_length": "length", | ||||
|                     "height": "height", | ||||
|                     "length": "length", | ||||
|                     "is_left_sink": "False", | ||||
|                     "is_right_sink": "False" | ||||
|                     "face": "face", | ||||
|                     "is_sink": "is_sink", | ||||
|                     "is_ribbon": "is_ribbon" | ||||
|                 }, | ||||
|                 "transform": "ident()" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "raw_floor_side", | ||||
|                 "skip": "not face[2]", | ||||
|                 "params": { | ||||
|                     "height": "height", | ||||
|                     "length": "2.5", | ||||
|                     "is_left_sink": "is_sink", | ||||
|                     "is_right_sink": "False" | ||||
|                 }, | ||||
|                 "transform": "move(0, 2.5, 0) @ rot(0, 0, -90)" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "raw_floor_side", | ||||
|                 "skip": "not face[3]", | ||||
|                 "params": { | ||||
|                     "height": "height", | ||||
|                     "length": "2.5", | ||||
|                     "is_left_sink": "False", | ||||
|                     "is_right_sink": "is_sink" | ||||
|                 }, | ||||
|                 "transform": "move(length, 0, 0) @ rot(0, 0, 90)" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "raw_floor_side", | ||||
|                 "skip": "not face[5]", | ||||
|                 "params": { | ||||
|                     "height": "height", | ||||
|                     "length": "length", | ||||
|                     "is_left_sink": "is_sink", | ||||
|                     "is_right_sink": "is_sink" | ||||
|                 }, | ||||
|                 "transform": "move(length, 2.5, 0) @ rot(0, 0, 180)" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "floor_bottom", | ||||
|                 "skip": "not face[1]", | ||||
|                 "params": { | ||||
|                     "length": "length", | ||||
|                     "width": "2.5" | ||||
|                 }, | ||||
|                 "transform": "move(0, 0, -height)" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
| @ -131,6 +49,7 @@ | ||||
|         "identifier": "floor_normal_border", | ||||
|         "showcase": { | ||||
|             "title": "Normal Border", | ||||
|             "category": "Borders", | ||||
|             "icon": "NormalBorder", | ||||
|             "type": "floor", | ||||
|             "cfgs": [ | ||||
| @ -194,6 +113,7 @@ | ||||
|         "identifier": "floor_sink_border", | ||||
|         "showcase": { | ||||
|             "title": "Sink Border", | ||||
|             "category": "Borders", | ||||
|             "icon": "SinkBorder", | ||||
|             "type": "floor", | ||||
|             "cfgs": [ | ||||
| @ -257,6 +177,7 @@ | ||||
|         "identifier": "floor_ribbon_border", | ||||
|         "showcase": { | ||||
|             "title": "Ribbon Border", | ||||
|             "category": "Borders", | ||||
|             "icon": "RibbonBorder", | ||||
|             "type": "floor", | ||||
|             "cfgs": [ | ||||
							
								
								
									
										427
									
								
								assets/jsons/chris_vanilla.json5
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,427 @@ | ||||
| [ | ||||
|     // One of Chris suggested more vanilla prototypes. | ||||
|     // This prototype represent a half of a normal, sink or double ribbon border, | ||||
|     // which looks like trapezoid from top to bottom. | ||||
|     //  | ||||
|     // The bottom edge of trapezoid is from origin to +X with `long_edge_length` length. | ||||
|     // The length of top edge is `short_edge_length` and it just like moving bottom edge to +Y direction. | ||||
|     // The offset between top edge and bottom edge is always 2.5. | ||||
|     // The distance from the closest point of top edge, to Y axis is `short_edge_offset`. | ||||
|     { | ||||
|         "identifier": "cv_trapezoid_side", | ||||
|         "showcase": null, | ||||
|         "params": [ | ||||
|             { | ||||
|                 "field": "long_edge_length", | ||||
|                 "data": "5.0" | ||||
|             }, | ||||
|             { | ||||
|                 "field": "short_edge_offset", | ||||
|                 "data": "0.0" | ||||
|             }, | ||||
|             { | ||||
|                 "field": "short_edge_length", | ||||
|                 "data": "5.0" | ||||
|             }, | ||||
|             { | ||||
|                 "field": "height", | ||||
|                 "data": "5.0" | ||||
|             }, | ||||
|             { | ||||
|                 "field": "face", | ||||
|                 "data": "(True, False, False, False, True, False)" | ||||
|             }, | ||||
|             { | ||||
|                 "field": "is_sink", | ||||
|                 "data": "False" | ||||
|             }, | ||||
|             { | ||||
|                 "field": "is_ribbon", | ||||
|                 "data": "False" | ||||
|             } | ||||
|         ], | ||||
|         "skip": "long_edge_length == 0.0 or short_edge_length == 0.0", | ||||
|         "vars": [ | ||||
|             { | ||||
|                 "field": "long_edge_uv_length", | ||||
|                 "data": "long_edge_length / 5.0" | ||||
|             }, | ||||
|             { | ||||
|                 "field": "short_edge_uv_offset", | ||||
|                 "data": "short_edge_offset / 5.0" | ||||
|             }, | ||||
|             { | ||||
|                 "field": "short_edge_uv_length", | ||||
|                 "data": "short_edge_length / 5.0" | ||||
|             }, | ||||
|             { | ||||
|                 "field": "short_edge_total", | ||||
|                 "data": "short_edge_offset + short_edge_length" | ||||
|             }, | ||||
|             { | ||||
|                 "field": "short_edge_uv_total", | ||||
|                 "data": "short_edge_uv_offset + short_edge_uv_length" | ||||
|             }, | ||||
|             { | ||||
|                 "field": "uv_border_texture", | ||||
|                 "data": "1.0 if is_ribbon else 0.5" | ||||
|             }, | ||||
|             { | ||||
|                 "field": "sink", | ||||
|                 "data": "0.7 if is_sink else 0.0" | ||||
|             } | ||||
|         ], | ||||
|         "vertices": [ | ||||
|             { | ||||
|                 "skip": "not face[0]", | ||||
|                 "data": "(0, 0, 0)" | ||||
|             }, | ||||
|             { | ||||
|                 "skip": "not face[0]", | ||||
|                 "data": "(short_edge_offset, 2.5, -sink)" | ||||
|             }, | ||||
|             { | ||||
|                 "skip": "not face[0]", | ||||
|                 "data": "(long_edge_length, 0, 0)" | ||||
|             }, | ||||
|             { | ||||
|                 "skip": "not face[0]", | ||||
|                 "data": "(short_edge_total, 2.5, -sink)" | ||||
|             } | ||||
|         ], | ||||
|         "faces": [ | ||||
|             { | ||||
|                 "skip": "not face[0]", | ||||
|                 "texture": "(\"FloorTopFlat\" if is_ribbon else \"FloorTopProfil\") if is_sink else \"FloorTopBorder\"", | ||||
|                 "indices": [0, 2, 3, 1], | ||||
|                 "uvs": [ | ||||
|                     "(0, 0)", | ||||
|                     "(0, long_edge_uv_length)", | ||||
|                     "(uv_border_texture, short_edge_uv_total)", | ||||
|                     "(uv_border_texture, short_edge_uv_offset)" | ||||
|                 ], | ||||
|                 "normals": null | ||||
|             } | ||||
|         ], | ||||
|         "instances": [ | ||||
|             { | ||||
|                 "identifier": "raw_floor_side", | ||||
|                 "skip": "not face[4]", | ||||
|                 "params": { | ||||
|                     "height": "height", | ||||
|                     "length": "long_edge_length", | ||||
|                     "is_left_sink": "False", | ||||
|                     "is_right_sink": "False" | ||||
|                 }, | ||||
|                 "transform": "ident()" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "raw_floor_side", | ||||
|                 "skip": "not face[2]", | ||||
|                 "params": { | ||||
|                     "height": "height", | ||||
|                     "length": "distance(0, 0, short_edge_offset, 2.5)", | ||||
|                     "is_left_sink": "False", | ||||
|                     "is_right_sink": "is_sink" | ||||
|                 }, | ||||
|                 "transform": "rot(0, 0, angle(0, 0, short_edge_offset, 2.5)) @ scale(1, -1, 1)" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "raw_floor_side", | ||||
|                 "skip": "not face[3]", | ||||
|                 "params": { | ||||
|                     "height": "height", | ||||
|                     "length": "distance(long_edge_length, 0, short_edge_total, 2.5)", | ||||
|                     "is_left_sink": "False", | ||||
|                     "is_right_sink": "is_sink" | ||||
|                 }, | ||||
|                 "transform": "move(long_edge_length, 0, 0) @ rot(0, 0, angle(long_edge_length, 0, short_edge_total, 2.5))" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "raw_floor_side", | ||||
|                 "skip": "not face[5]", | ||||
|                 "params": { | ||||
|                     "height": "height", | ||||
|                     "length": "short_edge_length", | ||||
|                     "is_left_sink": "is_sink", | ||||
|                     "is_right_sink": "is_sink" | ||||
|                 }, | ||||
|                 "transform": "move(short_edge_offset, 2.5, 0) @ scale(1, -1, 1)" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "floor_4edges_bottom", | ||||
|                 "skip": "not face[1]", | ||||
|                 "params": { | ||||
|                     "top_left_pos": "(0, 0)", | ||||
|                     "top_right_pos": "(short_edge_offset, 2.5)", | ||||
|                     "bottom_left_pos": "(long_edge_length, 0)", | ||||
|                     "bottom_right_pos": "(short_edge_total, 2.5)" | ||||
|                 }, | ||||
|                 "transform": "move(0, 0, -height)" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     // Same as previous one, but looks like triangle from top to bottom. | ||||
|     //  | ||||
|     // The bottom edge is from origin to +X with `edge_length` length. | ||||
|     // The tip is going to +Y. | ||||
|     // The height of this triangle is always 2.5 and the offset between tip and Y axis is `tip_offset`. | ||||
|     { | ||||
|         "identifier": "cv_triangle_side", | ||||
|         "showcase": null, | ||||
|         "params": [ | ||||
|             { | ||||
|                 "field": "edge_length", | ||||
|                 "data": "5.0" | ||||
|             }, | ||||
|             { | ||||
|                 "field": "tip_offset", | ||||
|                 "data": "2.5" | ||||
|             }, | ||||
|             { | ||||
|                 "field": "height", | ||||
|                 "data": "5.0" | ||||
|             }, | ||||
|             { | ||||
|                 "field": "face", | ||||
|                 "data": "(True, False, False, False, True, None)" | ||||
|             }, | ||||
|             { | ||||
|                 "field": "is_sink", | ||||
|                 "data": "False" | ||||
|             } | ||||
|         ], | ||||
|         "skip": "edge_length == 0.0", | ||||
|         "vars": [ | ||||
|             { | ||||
|                 "field": "edge_uv_length", | ||||
|                 "data": "edge_length / 5.0" | ||||
|             }, | ||||
|             { | ||||
|                 "field": "tip_uv_offset", | ||||
|                 "data": "tip_offset / 5.0" | ||||
|             }, | ||||
|             { | ||||
|                 "field": "sink", | ||||
|                 "data": "0.7 if is_sink else 0.0" | ||||
|             } | ||||
|         ], | ||||
|         "vertices": [ | ||||
|             { | ||||
|                 "skip": "not face[0]", | ||||
|                 "data": "(0, 0, 0)" | ||||
|             }, | ||||
|             { | ||||
|                 "skip": "not face[0]", | ||||
|                 "data": "(tip_offset, 2.5, -sink)" | ||||
|             }, | ||||
|             { | ||||
|                 "skip": "not face[0]", | ||||
|                 "data": "(edge_length, 0, 0)" | ||||
|             } | ||||
|         ], | ||||
|         "faces": [ | ||||
|             { | ||||
|                 "skip": "not face[0]", | ||||
|                 "texture": "\"FloorTopProfil\" if is_sink else \"FloorTopBorder\"", | ||||
|                 "indices": [0, 2, 1], | ||||
|                 "uvs": [ | ||||
|                     "(0, 0)", | ||||
|                     "(0, edge_uv_length)", | ||||
|                     "(0.5, tip_uv_offset)" | ||||
|                 ], | ||||
|                 "normals": null | ||||
|             } | ||||
|         ], | ||||
|         "instances": [ | ||||
|             { | ||||
|                 "identifier": "raw_floor_side", | ||||
|                 "skip": "not face[4]", | ||||
|                 "params": { | ||||
|                     "height": "height", | ||||
|                     "length": "edge_length", | ||||
|                     "is_left_sink": "False", | ||||
|                     "is_right_sink": "False" | ||||
|                 }, | ||||
|                 "transform": "ident()" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "raw_floor_side", | ||||
|                 "skip": "not face[2]", | ||||
|                 "params": { | ||||
|                     "height": "height", | ||||
|                     "length": "distance(0, 0, tip_offset, 2.5)", | ||||
|                     "is_left_sink": "False", | ||||
|                     "is_right_sink": "is_sink" | ||||
|                 }, | ||||
|                 "transform": "rot(0, 0, angle(0, 0, tip_offset, 2.5)) @ scale(1, -1, 1)" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "raw_floor_side", | ||||
|                 "skip": "not face[3]", | ||||
|                 "params": { | ||||
|                     "height": "height", | ||||
|                     "length": "distance(edge_length, 0, tip_offset, 2.5)", | ||||
|                     "is_left_sink": "False", | ||||
|                     "is_right_sink": "is_sink" | ||||
|                 }, | ||||
|                 "transform": "move(edge_length, 0, 0) @ rot(0, 0, angle(edge_length, 0, tip_offset, 2.5))" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "floor_triangle_bottom", | ||||
|                 "skip": "not face[1]", | ||||
|                 "params": { | ||||
|                     "length": "edge_length", | ||||
|                     "width": "2.5", | ||||
|                     "tip_offset": "tip_offset" | ||||
|                 }, | ||||
|                 "transform": "move(0, 0, -height)" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "identifier": "cv_triangle_center", | ||||
|         "showcase": null, | ||||
|         "params": [ | ||||
|             { | ||||
|                 "field": "height", | ||||
|                 "data": "5.0" | ||||
|             }, | ||||
|             { | ||||
|                 "field": "face", | ||||
|                 "data": "(True, False, False, False, True, None)" | ||||
|             }, | ||||
|             { | ||||
|                 "field": "is_sink", | ||||
|                 "data": "False" | ||||
|             } | ||||
|         ], | ||||
|         "skip": "False", | ||||
|         "vars": [ | ||||
|             { | ||||
|                 "field": "sink", | ||||
|                 "data": "0.7 if is_sink else 0.0" | ||||
|             } | ||||
|         ], | ||||
|         "vertices": [ | ||||
|             { | ||||
|                 "skip": "not face[0]", | ||||
|                 "data": "(0, 0, 0)" | ||||
|             }, | ||||
|             { | ||||
|                 "skip": "not face[0]", | ||||
|                 "data": "(5, 0, 0)" | ||||
|             }, | ||||
|             { | ||||
|                 "skip": "not face[0]", | ||||
|                 "data": "(2.5, 2.5, -sink)" | ||||
|             }, | ||||
|             { | ||||
|                 "skip": "(not face[0]) or (not is_sink)", | ||||
|                 "data": "(2.5, 0, -sink)" | ||||
|             } | ||||
|         ], | ||||
|         "faces": [ | ||||
|             { | ||||
|                 "skip": "(not face[0]) or is_sink", | ||||
|                 "texture": "\"FloorTopFlat\"", | ||||
|                 "indices": [0, 1, 2], | ||||
|                 "uvs": [ | ||||
|                     "(0, 0)", | ||||
|                     "(1, 0)", | ||||
|                     "(0.5, 0.5)" | ||||
|                 ], | ||||
|                 "normals": null | ||||
|             }, | ||||
|             { | ||||
|                 "skip": "(not face[0]) or (not is_sink)", | ||||
|                 "texture": "\"FloorTopProfil\"", | ||||
|                 "indices": [0, 3, 2], | ||||
|                 "uvs": [ | ||||
|                     "(0, 0)", | ||||
|                     "(0.5, 0)", | ||||
|                     "(0.5, 0.5)" | ||||
|                 ], | ||||
|                 "normals": null | ||||
|             }, | ||||
|             { | ||||
|                 "skip": "(not face[0]) or (not is_sink)", | ||||
|                 "texture": "\"FloorTopProfil\"", | ||||
|                 "indices": [3, 1, 2], | ||||
|                 "uvs": [ | ||||
|                     "(0.5, 0)", | ||||
|                     "(1, 0)", | ||||
|                     "(0.5, 0.5)" | ||||
|                 ], | ||||
|                 "normals": null | ||||
|             } | ||||
|         ], | ||||
|         "instances": [ | ||||
|             { | ||||
|                 "identifier": "raw_floor_side", | ||||
|                 "skip": "not face[2]", | ||||
|                 "params": { | ||||
|                     "height": "height", | ||||
|                     "length": "distance(0, 0, 2.5, 2.5)", | ||||
|                     "is_left_sink": "False", | ||||
|                     "is_right_sink": "is_sink" | ||||
|                 }, | ||||
|                 "transform": "rot(0, 0, 45)" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "raw_floor_side", | ||||
|                 "skip": "not face[3]", | ||||
|                 "params": { | ||||
|                     "height": "height", | ||||
|                     "length": "distance(5, 0, 2.5, 2.5)", | ||||
|                     "is_left_sink": "False", | ||||
|                     "is_right_sink": "is_sink" | ||||
|                 }, | ||||
|                 "transform": "move(5, 0, 0) @ rot(0, 0, 135)" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "raw_floor_side", | ||||
|                 "skip": "(not face[4]) or (not is_sink)", | ||||
|                 "params": { | ||||
|                     "height": "height", | ||||
|                     "length": "2.5", | ||||
|                     "is_left_sink": "False", | ||||
|                     "is_right_sink": "True" | ||||
|                 }, | ||||
|                 "transform": "ident()" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "raw_floor_side", | ||||
|                 "skip": "(not face[4]) or (not is_sink)", | ||||
|                 "params": { | ||||
|                     "height": "height", | ||||
|                     "length": "2.5", | ||||
|                     "is_left_sink": "True", | ||||
|                     "is_right_sink": "False" | ||||
|                 }, | ||||
|                 "transform": "move(2.5, 0, 0)" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "raw_floor_side", | ||||
|                 "skip": "(not face[4]) or is_sink", | ||||
|                 "params": { | ||||
|                     "height": "height", | ||||
|                     "length": "5", | ||||
|                     "is_left_sink": "False", | ||||
|                     "is_right_sink": "False" | ||||
|                 }, | ||||
|                 "transform": "ident()" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "floor_triangle_bottom", | ||||
|                 "skip": "not face[1]", | ||||
|                 "params": { | ||||
|                     "length": "5", | ||||
|                     "width": "2.5", | ||||
|                     "tip_offset": "2.5" | ||||
|                 }, | ||||
|                 "transform": "move(0, 0, -height)" | ||||
|             } | ||||
|         ] | ||||
|     } | ||||
| ] | ||||
| @ -135,7 +135,7 @@ | ||||
|                 "transform": "move(2.5, 2.5, 0) @ rot(0, 0, 180)" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "floor_bottom", | ||||
|                 "identifier": "floor_rectangle_bottom", | ||||
|                 "skip": "not face[1]", | ||||
|                 "params": { | ||||
|                     "length": "2.5", | ||||
| @ -149,6 +149,7 @@ | ||||
|         "identifier": "floor_normal_inner_corner", | ||||
|         "showcase": { | ||||
|             "title": "Normal Inner Corner", | ||||
|             "category": "Half Block Corners", | ||||
|             "icon": "NormalInnerCorner", | ||||
|             "type": "floor", | ||||
|             "cfgs": [ | ||||
| @ -201,6 +202,7 @@ | ||||
|         "identifier": "floor_sink_inner_corner", | ||||
|         "showcase": { | ||||
|             "title": "Sink Inner Corner", | ||||
|             "category": "Half Block Corners", | ||||
|             "icon": "SinkInnerCorner", | ||||
|             "type": "floor", | ||||
|             "cfgs": [ | ||||
| @ -253,6 +255,7 @@ | ||||
|         "identifier": "floor_ribbon_inner_corner", | ||||
|         "showcase": { | ||||
|             "title": "Ribbon Inner Corner", | ||||
|             "category": "Half Block Corners", | ||||
|             "icon": "RibbonInnerCorner", | ||||
|             "type": "floor", | ||||
|             "cfgs": [ | ||||
| @ -305,6 +308,7 @@ | ||||
|         "identifier": "floor_normal_outter_corner", | ||||
|         "showcase": { | ||||
|             "title": "Normal Outter Corner", | ||||
|             "category": "Half Block Corners", | ||||
|             "icon": "NormalOutterCorner", | ||||
|             "type": "floor", | ||||
|             "cfgs": [ | ||||
| @ -357,6 +361,7 @@ | ||||
|         "identifier": "floor_sink_outter_corner", | ||||
|         "showcase": { | ||||
|             "title": "Sink Outter Corner", | ||||
|             "category": "Half Block Corners", | ||||
|             "icon": "SinkOutterCorner", | ||||
|             "type": "floor", | ||||
|             "cfgs": [ | ||||
| @ -409,6 +414,7 @@ | ||||
|         "identifier": "floor_ribbon_outter_corner", | ||||
|         "showcase": { | ||||
|             "title": "Ribbon Outter Corner", | ||||
|             "category": "Half Block Corners", | ||||
|             "icon": "RibbonOutterCorner", | ||||
|             "type": "floor", | ||||
|             "cfgs": [ | ||||
| @ -22,52 +22,57 @@ | ||||
|         "faces": [], | ||||
|         "instances": [ | ||||
|             { | ||||
|                 "identifier": "raw_floor_corner", | ||||
|                 "identifier": "cv_triangle_side", | ||||
|                 "skip": "False", | ||||
|                 "params": { | ||||
|                     "edge_length": "5", | ||||
|                     "tip_offset": "2.5", | ||||
|                     "height": "height", | ||||
|                     "face": "(face[0], face[1], face[2], False, face[4], False)", | ||||
|                     "is_sink": "is_sink", | ||||
|                     "is_inner": "False", | ||||
|                     "is_ribbon": "False" | ||||
|                     "face": "(face[0], False, False, False, face[4], None)", | ||||
|                     "is_sink": "is_sink" | ||||
|                 }, | ||||
|                 "transform": "ident()" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "raw_floor_border", | ||||
|                 "identifier": "cv_triangle_center", | ||||
|                 "skip": "False", | ||||
|                 "params": { | ||||
|                     "length": "2.5", | ||||
|                     "height": "height", | ||||
|                     "face": "(face[0], face[1], False, face[3], face[4], False)", | ||||
|                     "is_sink": "is_sink", | ||||
|                     "is_ribbon": "False" | ||||
|                     "face": "(face[0], False, False, False, face[3], None)", | ||||
|                     "is_sink": "is_sink" | ||||
|                 }, | ||||
|                 "transform": "move(2.5, 0, 0)" | ||||
|                 "transform": "move(5, 0, 0) @ rot(0, 0, 90)" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "raw_floor_border", | ||||
|                 "identifier": "cv_triangle_center", | ||||
|                 "skip": "False", | ||||
|                 "params": { | ||||
|                     "length": "2.5", | ||||
|                     "height": "height", | ||||
|                     "face": "(face[0], face[1], face[5], False, face[2], False)", | ||||
|                     "is_sink": "is_sink", | ||||
|                     "is_ribbon": "False" | ||||
|                     "face": "(face[0], False, False, False, face[5], None)", | ||||
|                     "is_sink": "is_sink" | ||||
|                 }, | ||||
|                 "transform": "move(5, 5, 0) @ rot(0, 0, 180)" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "cv_triangle_side", | ||||
|                 "skip": "False", | ||||
|                 "params": { | ||||
|                     "edge_length": "5", | ||||
|                     "tip_offset": "2.5", | ||||
|                     "height": "height", | ||||
|                     "face": "(face[0], False, False, False, face[2], None)", | ||||
|                     "is_sink": "is_sink" | ||||
|                 }, | ||||
|                 "transform": "move(0, 5, 0) @ rot(0, 0, -90)" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "raw_floor_corner", | ||||
|                 "skip": "False", | ||||
|                 "identifier": "floor_rectangle_bottom", | ||||
|                 "skip": "not face[1]", | ||||
|                 "params": { | ||||
|                     "height": "height", | ||||
|                     "face": "(face[0], face[1], False, face[3], False, face[5])", | ||||
|                     "is_sink": "is_sink", | ||||
|                     "is_inner": "True", | ||||
|                     "is_ribbon": "False" | ||||
|                     "length": "5", | ||||
|                     "width": "5" | ||||
|                 }, | ||||
|                 "transform": "move(2.5, 2.5, 0)" | ||||
|                 "transform": "move(0, 0, -height)" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
| @ -94,40 +99,55 @@ | ||||
|         "faces": [], | ||||
|         "instances": [ | ||||
|             { | ||||
|                 "identifier": "raw_floor_border", | ||||
|                 "identifier": "cv_triangle_center", | ||||
|                 "skip": "False", | ||||
|                 "params": { | ||||
|                     "length": "5", | ||||
|                     "height": "height", | ||||
|                     "face": "(face[0], face[1], face[5], face[4], face[2], False)", | ||||
|                     "is_sink": "is_sink", | ||||
|                     "is_ribbon": "False" | ||||
|                     "face": "(face[0], False, False, False, face[4], None)", | ||||
|                     "is_sink": "is_sink" | ||||
|                 }, | ||||
|                 "transform": "ident()" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "cv_triangle_center", | ||||
|                 "skip": "False", | ||||
|                 "params": { | ||||
|                     "height": "height", | ||||
|                     "face": "(face[0], False, False, False, face[3], None)", | ||||
|                     "is_sink": "is_sink" | ||||
|                 }, | ||||
|                 "transform": "move(5, 0, 0) @ rot(0, 0, 90)" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "cv_triangle_center", | ||||
|                 "skip": "False", | ||||
|                 "params": { | ||||
|                     "height": "height", | ||||
|                     "face": "(face[0], False, False, False, face[5], None)", | ||||
|                     "is_sink": "is_sink" | ||||
|                 }, | ||||
|                 "transform": "move(5, 5, 0) @ rot(0, 0, 180)" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "cv_triangle_side", | ||||
|                 "skip": "False", | ||||
|                 "params": { | ||||
|                     "edge_length": "5", | ||||
|                     "tip_offset": "2.5", | ||||
|                     "height": "height", | ||||
|                     "face": "(face[0], False, False, False, face[2], None)", | ||||
|                     "is_sink": "is_sink" | ||||
|                 }, | ||||
|                 "transform": "move(0, 5, 0) @ rot(0, 0, -90)" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "raw_floor_corner", | ||||
|                 "skip": "False", | ||||
|                 "identifier": "floor_rectangle_bottom", | ||||
|                 "skip": "not face[1]", | ||||
|                 "params": { | ||||
|                     "height": "height", | ||||
|                     "face": "(face[0], face[1], False, face[4], False, face[3])", | ||||
|                     "is_sink": "is_sink", | ||||
|                     "is_inner": "True", | ||||
|                     "is_ribbon": "False" | ||||
|                     "length": "5", | ||||
|                     "width": "5" | ||||
|                 }, | ||||
|                 "transform": "move(2.5, 2.5, 0) @ rot(0, 0, -90)" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "raw_floor_corner", | ||||
|                 "skip": "False", | ||||
|                 "params": { | ||||
|                     "height": "height", | ||||
|                     "face": "(face[0], face[1], False, face[3], False, face[5])", | ||||
|                     "is_sink": "is_sink", | ||||
|                     "is_inner": "True", | ||||
|                     "is_ribbon": "False" | ||||
|                 }, | ||||
|                 "transform": "move(2.5, 2.5, 0)" | ||||
|                 "transform": "move(0, 0, -height)" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
| @ -154,52 +174,53 @@ | ||||
|         "faces": [], | ||||
|         "instances": [ | ||||
|             { | ||||
|                 "identifier": "raw_floor_corner", | ||||
|                 "identifier": "cv_triangle_center", | ||||
|                 "skip": "False", | ||||
|                 "params": { | ||||
|                     "height": "height", | ||||
|                     "face": "(face[0], face[1], False, face[5], False, face[2])", | ||||
|                     "is_sink": "is_sink", | ||||
|                     "is_inner": "True", | ||||
|                     "is_ribbon": "False" | ||||
|                     "face": "(face[0], False, False, False, face[4], None)", | ||||
|                     "is_sink": "is_sink" | ||||
|                 }, | ||||
|                 "transform": "move(2.5, 2.5, 0) @ rot(0, 0, -270)" | ||||
|                 "transform": "ident()" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "raw_floor_corner", | ||||
|                 "identifier": "cv_triangle_center", | ||||
|                 "skip": "False", | ||||
|                 "params": { | ||||
|                     "height": "height", | ||||
|                     "face": "(face[0], face[1], False, face[2], False, face[4])", | ||||
|                     "is_sink": "is_sink", | ||||
|                     "is_inner": "True", | ||||
|                     "is_ribbon": "False" | ||||
|                     "face": "(face[0], False, False, False, face[3], None)", | ||||
|                     "is_sink": "is_sink" | ||||
|                 }, | ||||
|                 "transform": "move(2.5, 2.5, 0) @ rot(0, 0, -180)" | ||||
|                 "transform": "move(5, 0, 0) @ rot(0, 0, 90)" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "raw_floor_corner", | ||||
|                 "identifier": "cv_triangle_center", | ||||
|                 "skip": "False", | ||||
|                 "params": { | ||||
|                     "height": "height", | ||||
|                     "face": "(face[0], face[1], False, face[4], False, face[3])", | ||||
|                     "is_sink": "is_sink", | ||||
|                     "is_inner": "True", | ||||
|                     "is_ribbon": "False" | ||||
|                     "face": "(face[0], False, False, False, face[5], None)", | ||||
|                     "is_sink": "is_sink" | ||||
|                 }, | ||||
|                 "transform": "move(2.5, 2.5, 0) @ rot(0, 0, -90)" | ||||
|                 "transform": "move(5, 5, 0) @ rot(0, 0, 180)" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "raw_floor_corner", | ||||
|                 "identifier": "cv_triangle_center", | ||||
|                 "skip": "False", | ||||
|                 "params": { | ||||
|                     "height": "height", | ||||
|                     "face": "(face[0], face[1], False, face[3], False, face[5])", | ||||
|                     "is_sink": "is_sink", | ||||
|                     "is_inner": "True", | ||||
|                     "is_ribbon": "False" | ||||
|                     "face": "(face[0], False, False, False, face[2], None)", | ||||
|                     "is_sink": "is_sink" | ||||
|                 }, | ||||
|                 "transform": "move(2.5, 2.5, 0)" | ||||
|                 "transform": "move(0, 5, 0) @ rot(0, 0, -90)" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "floor_rectangle_bottom", | ||||
|                 "skip": "not face[1]", | ||||
|                 "params": { | ||||
|                     "length": "5", | ||||
|                     "width": "5" | ||||
|                 }, | ||||
|                 "transform": "move(0, 0, -height)" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
| @ -207,6 +228,7 @@ | ||||
|         "identifier": "floor_normal_l_crossing", | ||||
|         "showcase": { | ||||
|             "title": "Normal L Crossing", | ||||
|             "category": "Floor Crossings", | ||||
|             "icon": "NormalLCrossing", | ||||
|             "type": "floor", | ||||
|             "cfgs": [ | ||||
| @ -257,6 +279,7 @@ | ||||
|         "identifier": "floor_sink_l_crossing", | ||||
|         "showcase": { | ||||
|             "title": "Sink L Crossing", | ||||
|             "category": "Floor Crossings", | ||||
|             "icon": "SinkLCrossing", | ||||
|             "type": "floor", | ||||
|             "cfgs": [ | ||||
| @ -307,6 +330,7 @@ | ||||
|         "identifier": "floor_normal_t_crossing", | ||||
|         "showcase": { | ||||
|             "title": "Normal T Crossing", | ||||
|             "category": "Floor Crossings", | ||||
|             "icon": "NormalTCrossing", | ||||
|             "type": "floor", | ||||
|             "cfgs": [ | ||||
| @ -357,6 +381,7 @@ | ||||
|         "identifier": "floor_sink_t_crossing", | ||||
|         "showcase": { | ||||
|             "title": "Sink T Crossing", | ||||
|             "category": "Floor Crossings", | ||||
|             "icon": "SinkTCrossing", | ||||
|             "type": "floor", | ||||
|             "cfgs": [ | ||||
| @ -407,6 +432,7 @@ | ||||
|         "identifier": "floor_normal_x_crossing", | ||||
|         "showcase": { | ||||
|             "title": "Normal X Crossing", | ||||
|             "category": "Floor Crossings", | ||||
|             "icon": "NormalXCrossing", | ||||
|             "type": "floor", | ||||
|             "cfgs": [ | ||||
| @ -457,6 +483,7 @@ | ||||
|         "identifier": "floor_sink_x_crossing", | ||||
|         "showcase": { | ||||
|             "title": "Sink X Crossing", | ||||
|             "category": "Floor Crossings", | ||||
|             "icon": "SinkXCrossing", | ||||
|             "type": "floor", | ||||
|             "cfgs": [ | ||||
| @ -3,6 +3,7 @@ | ||||
|         "identifier": "floor_flat", | ||||
|         "showcase": { | ||||
|             "title": "Flat", | ||||
|             "category": "Miscellaneous", | ||||
|             "icon": "Flat", | ||||
|             "type": "floor", | ||||
|             "cfgs": [ | ||||
| @ -36,7 +37,7 @@ | ||||
|                 }, | ||||
|                 { | ||||
|                     "field": "is_sink_", | ||||
|                     "type": "float", | ||||
|                     "type": "bool", | ||||
|                     "title": "Is Sink", | ||||
|                     "desc": "Whether this flat floor is used for sink floor.", | ||||
|                     "default": "False" | ||||
| @ -158,7 +159,7 @@ | ||||
|                 "transform": "move(length, width, 0) @ rot(0, 0, 180)" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "floor_bottom", | ||||
|                 "identifier": "floor_rectangle_bottom", | ||||
|                 "skip": "not face[1]", | ||||
|                 "params": { | ||||
|                     "length": "length", | ||||
| @ -34,53 +34,61 @@ | ||||
|         "faces": [], | ||||
|         "instances": [ | ||||
|             { | ||||
|                 "identifier": "raw_floor_corner", | ||||
|                 "identifier": "cv_trapezoid_side", | ||||
|                 "skip": "False", | ||||
|                 "params": { | ||||
|                     "long_edge_length": "length + 5", | ||||
|                     "short_edge_offset": "2.5", | ||||
|                     "short_edge_length": "length", | ||||
|                     "height": "height", | ||||
|                     "face": "(face[0], face[1], face[4], False, face[3], False)", | ||||
|                     "face": "(face[0], False, False, False, face[4], False)", | ||||
|                     "is_sink": "is_sink", | ||||
|                     "is_inner": "False", | ||||
|                     "is_ribbon": "is_ribbon" | ||||
|                 }, | ||||
|                 "transform": "move(5 + length, 0, 0) @ rot(0, 0, -270)" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "raw_floor_corner", | ||||
|                 "skip": "False", | ||||
|                 "params": { | ||||
|                     "height": "height", | ||||
|                     "face": "(face[0], face[1], face[3], False, face[5], False)", | ||||
|                     "is_sink": "is_sink", | ||||
|                     "is_inner": "False", | ||||
|                     "is_ribbon": "is_ribbon" | ||||
|                 }, | ||||
|                 "transform": "move(5 + length, 5 + width, 0) @ rot(0, 0, -180)" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "raw_floor_corner", | ||||
|                 "skip": "False", | ||||
|                 "params": { | ||||
|                     "height": "height", | ||||
|                     "face": "(face[0], face[1], face[5], False, face[2], False)", | ||||
|                     "is_sink": "is_sink", | ||||
|                     "is_inner": "False", | ||||
|                     "is_ribbon": "is_ribbon" | ||||
|                 }, | ||||
|                 "transform": "move(0, 5 + width, 0) @ rot(0, 0, -90)" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "raw_floor_corner", | ||||
|                 "skip": "False", | ||||
|                 "params": { | ||||
|                     "height": "height", | ||||
|                     "face": "(face[0], face[1], face[2], False, face[4], False)", | ||||
|                     "is_sink": "is_sink", | ||||
|                     "is_inner": "False", | ||||
|                     "is_ribbon": "is_ribbon" | ||||
|                 }, | ||||
|                 "transform": "ident()" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "cv_trapezoid_side", | ||||
|                 "skip": "False", | ||||
|                 "params": { | ||||
|                     "long_edge_length": "length + 5", | ||||
|                     "short_edge_offset": "2.5", | ||||
|                     "short_edge_length": "length", | ||||
|                     "height": "height", | ||||
|                     "face": "(face[0], False, False, False, face[5], False)", | ||||
|                     "is_sink": "is_sink", | ||||
|                     "is_ribbon": "is_ribbon" | ||||
|                 }, | ||||
|                 "transform": "move(0, 5 + width, 0) @ scale(1, -1, 1)" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "cv_trapezoid_side", | ||||
|                 "skip": "False", | ||||
|                 "params": { | ||||
|                     "long_edge_length": "width + 5", | ||||
|                     "short_edge_offset": "2.5", | ||||
|                     "short_edge_length": "width", | ||||
|                     "height": "height", | ||||
|                     "face": "(face[0], False, False, False, face[3], False)", | ||||
|                     "is_sink": "is_sink", | ||||
|                     "is_ribbon": "is_ribbon" | ||||
|                 }, | ||||
|                 "transform": "move(5 + length, 0, 0) @ rot(0, 0, 90)" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "cv_trapezoid_side", | ||||
|                 "skip": "False", | ||||
|                 "params": { | ||||
|                     "long_edge_length": "width + 5", | ||||
|                     "short_edge_offset": "2.5", | ||||
|                     "short_edge_length": "width", | ||||
|                     "height": "height", | ||||
|                     "face": "(face[0], False, False, False, face[2], False)", | ||||
|                     "is_sink": "is_sink", | ||||
|                     "is_ribbon": "is_ribbon" | ||||
|                 }, | ||||
|                 "transform": "rot(0, 0, 90) @ scale(1, -1, 1)" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "floor_flat", | ||||
|                 "skip": "False", | ||||
| @ -88,58 +96,19 @@ | ||||
|                     "height": "height", | ||||
|                     "length": "length", | ||||
|                     "width": "width", | ||||
|                     "face": "(face[0], face[1], False, False, False, False)", | ||||
|                     "face": "(face[0], False, False, False, False, False)", | ||||
|                     "is_sink": "is_sink" | ||||
|                 }, | ||||
|                 "transform": "move(2.5, 2.5, 0)" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "raw_floor_border", | ||||
|                 "skip": "False", | ||||
|                 "identifier": "floor_rectangle_bottom", | ||||
|                 "skip": "not face[1]", | ||||
|                 "params": { | ||||
|                     "height": "height", | ||||
|                     "length": "length", | ||||
|                     "face": "(face[0], face[1], False, False, face[4], False)", | ||||
|                     "is_sink": "is_sink", | ||||
|                     "is_ribbon": "is_ribbon" | ||||
|                     "length": "5 + length", | ||||
|                     "width": "5 + width" | ||||
|                 }, | ||||
|                 "transform": "move(2.5, 0, 0)" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "raw_floor_border", | ||||
|                 "skip": "False", | ||||
|                 "params": { | ||||
|                     "height": "height", | ||||
|                     "length": "width", | ||||
|                     "face": "(face[0], face[1], False, False, face[2], False)", | ||||
|                     "is_sink": "is_sink", | ||||
|                     "is_ribbon": "is_ribbon" | ||||
|                 }, | ||||
|                 "transform": "move(0, 2.5 + width, 0) @ rot(0, 0, -90)" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "raw_floor_border", | ||||
|                 "skip": "False", | ||||
|                 "params": { | ||||
|                     "height": "height", | ||||
|                     "length": "length", | ||||
|                     "face": "(face[0], face[1], False, False, face[5], False)", | ||||
|                     "is_sink": "is_sink", | ||||
|                     "is_ribbon": "is_ribbon" | ||||
|                 }, | ||||
|                 "transform": "move(2.5 + length, 5 + width, 0) @ rot(0, 0, -180)" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "raw_floor_border", | ||||
|                 "skip": "False", | ||||
|                 "params": { | ||||
|                     "height": "height", | ||||
|                     "length": "width", | ||||
|                     "face": "(face[0], face[1], False, False, face[3], False)", | ||||
|                     "is_sink": "is_sink", | ||||
|                     "is_ribbon": "is_ribbon" | ||||
|                 }, | ||||
|                 "transform": "move(5 + length, 2.5, 0) @ rot(0, 0, -270)" | ||||
|                 "transform": "move(0, 0, -height)" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
| @ -147,6 +116,7 @@ | ||||
|         "identifier": "floor_normal_platform", | ||||
|         "showcase": { | ||||
|             "title": "Normal Platform", | ||||
|             "category": "Platforms", | ||||
|             "icon": "NormalPlatform", | ||||
|             "type": "floor", | ||||
|             "cfgs": [ | ||||
| @ -222,6 +192,7 @@ | ||||
|         "identifier": "floor_sink_platform", | ||||
|         "showcase": { | ||||
|             "title": "Sink Platform", | ||||
|             "category": "Platforms", | ||||
|             "icon": "SinkPlatform", | ||||
|             "type": "floor", | ||||
|             "cfgs": [ | ||||
| @ -297,6 +268,7 @@ | ||||
|         "identifier": "floor_ribbon_platform", | ||||
|         "showcase": { | ||||
|             "title": "Ribbon Platform", | ||||
|             "category": "Platforms", | ||||
|             "icon": "RibbonPlatform", | ||||
|             "type": "floor", | ||||
|             "cfgs": [ | ||||
| @ -122,7 +122,142 @@ | ||||
|         "instances": [] | ||||
|     }, | ||||
|     { | ||||
|         "identifier": "floor_bottom", | ||||
|         "identifier": "floor_4edges_bottom", | ||||
|         "showcase": null, | ||||
|         "params": [ | ||||
|             { | ||||
|                 "field": "top_left_pos", | ||||
|                 "data": "(0.0, 0.0)" | ||||
|             }, | ||||
|             { | ||||
|                 "field": "top_right_pos", | ||||
|                 "data": "(0.0, 5.0)" | ||||
|             }, | ||||
|             { | ||||
|                 "field": "bottom_left_pos", | ||||
|                 "data": "(5.0, 0.0)" | ||||
|             }, | ||||
|             { | ||||
|                 "field": "bottom_right_pos", | ||||
|                 "data": "(5.0, 5.0)" | ||||
|             } | ||||
|         ], | ||||
|         "skip": "False", | ||||
|         "vars": [ | ||||
|             { | ||||
|                 "field": "top_left_uv", | ||||
|                 "data": "tuple(map(lambda x: x / 5.0, top_left_pos))" | ||||
|             }, | ||||
|             { | ||||
|                 "field": "top_right_uv", | ||||
|                 "data": "tuple(map(lambda x: x / 5.0, top_right_pos))" | ||||
|             }, | ||||
|             { | ||||
|                 "field": "bottom_left_uv", | ||||
|                 "data": "tuple(map(lambda x: x / 5.0, bottom_left_pos))" | ||||
|             }, | ||||
|             { | ||||
|                 "field": "bottom_right_uv", | ||||
|                 "data": "tuple(map(lambda x: x / 5.0, bottom_right_pos))" | ||||
|             } | ||||
|         ], | ||||
|         "vertices": [ | ||||
|             { | ||||
|                 "skip": "False", | ||||
|                 "data": "top_left_pos + (0, )" | ||||
|             }, | ||||
|             { | ||||
|                 "skip": "False", | ||||
|                 "data": "top_right_pos + (0, )" | ||||
|             }, | ||||
|             { | ||||
|                 "skip": "False", | ||||
|                 "data": "bottom_left_pos + (0, )" | ||||
|             }, | ||||
|             { | ||||
|                 "skip": "False", | ||||
|                 "data": "bottom_right_pos + (0, )" | ||||
|             } | ||||
|         ], | ||||
|         "faces": [ | ||||
|             { | ||||
|                 "skip": "False", | ||||
|                 "texture": "\"FloorTopBorderless\"", | ||||
|                 "indices": [0, 1, 3, 2], | ||||
|                 "uvs": [ | ||||
|                     "top_left_uv", | ||||
|                     "top_right_uv", | ||||
|                     "bottom_right_uv", | ||||
|                     "bottom_left_uv" | ||||
|                 ], | ||||
|                 "normals": null | ||||
|             } | ||||
|         ], | ||||
|         "instances": [] | ||||
|     }, | ||||
|     { | ||||
|         "identifier": "floor_3edges_bottom", | ||||
|         "showcase": null, | ||||
|         "params": [ | ||||
|             { | ||||
|                 "field": "top_pos", | ||||
|                 "data": "(0.0, 0.0)" | ||||
|             }, | ||||
|             { | ||||
|                 "field": "bottom_pos", | ||||
|                 "data": "(5.0, 0.0)" | ||||
|             }, | ||||
|             { | ||||
|                 "field": "tip_pos", | ||||
|                 "data": "(2.5, 2.5)" | ||||
|             } | ||||
|         ], | ||||
|         "skip": "False", | ||||
|         "vars": [ | ||||
|             { | ||||
|                 "field": "top_uv", | ||||
|                 "data": "tuple(map(lambda x: x / 5.0, top_pos))" | ||||
|             }, | ||||
|             { | ||||
|                 "field": "bottom_uv", | ||||
|                 "data": "tuple(map(lambda x: x / 5.0, bottom_pos))" | ||||
|             }, | ||||
|             { | ||||
|                 "field": "tip_uv", | ||||
|                 "data": "tuple(map(lambda x: x / 5.0, tip_pos))" | ||||
|             } | ||||
|         ], | ||||
|         "vertices": [ | ||||
|             { | ||||
|                 "skip": "False", | ||||
|                 "data": "top_pos + (0, )" | ||||
|             }, | ||||
|             { | ||||
|                 "skip": "False", | ||||
|                 "data": "bottom_pos + (0, )" | ||||
|             }, | ||||
|             { | ||||
|                 "skip": "False", | ||||
|                 "data": "tip_pos + (0, )" | ||||
|             } | ||||
|         ], | ||||
|         "faces": [ | ||||
|             { | ||||
|                 "skip": "False", | ||||
|                 "texture": "\"FloorTopBorderless\"", | ||||
|                 "indices": [0, 2, 1], | ||||
|                 "uvs": [ | ||||
|                     "top_uv", | ||||
|                     "tip_uv", | ||||
|                     "bottom_uv" | ||||
|                 ], | ||||
|                 "normals": null | ||||
|             } | ||||
|         ], | ||||
|         "instances": [] | ||||
|     }, | ||||
|     { | ||||
|         "identifier": "floor_rectangle_bottom", | ||||
|         "showcase": null, | ||||
|         "params": [ | ||||
|             { | ||||
| @ -135,48 +270,55 @@ | ||||
|             } | ||||
|         ], | ||||
|         "skip": "length == 0.0 or width == 0.0", | ||||
|         "vars": [ | ||||
|         "vars": [], | ||||
|         "vertices": [], | ||||
|         "faces": [], | ||||
|         "instances": [ | ||||
|             { | ||||
|                 "field": "uv_length", | ||||
|                 "data": "length / 5.0" | ||||
|                 "identifier": "floor_4edges_bottom", | ||||
|                 "skip": "False", | ||||
|                 "params": { | ||||
|                     "top_left_pos": "(0, 0)", | ||||
|                     "top_right_pos": "(0, width)", | ||||
|                     "bottom_left_pos": "(length, 0)", | ||||
|                     "bottom_right_pos": "(length, width)" | ||||
|                 }, | ||||
|                 "transform": "ident()" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "identifier": "floor_triangle_bottom", | ||||
|         "showcase": null, | ||||
|         "params": [ | ||||
|             { | ||||
|                 "field": "length", | ||||
|                 "data": "5.0" | ||||
|             }, | ||||
|             { | ||||
|                 "field": "uv_width", | ||||
|                 "data": "width / 5.0" | ||||
|                 "field": "width", | ||||
|                 "data": "2.5" | ||||
|             }, | ||||
|             { | ||||
|                 "field": "tip_offset", | ||||
|                 "data": "2.5" | ||||
|             } | ||||
|         ], | ||||
|         "vertices": [ | ||||
|         "skip": "length == 0.0", | ||||
|         "vars": [], | ||||
|         "vertices": [], | ||||
|         "faces": [], | ||||
|         "instances": [ | ||||
|             { | ||||
|                 "identifier": "floor_3edges_bottom", | ||||
|                 "skip": "False", | ||||
|                 "data": "(0, 0, 0)" | ||||
|             }, | ||||
|             { | ||||
|                 "skip": "False", | ||||
|                 "data": "(0, width, 0)" | ||||
|             }, | ||||
|             { | ||||
|                 "skip": "False", | ||||
|                 "data": "(length, 0, 0)" | ||||
|             }, | ||||
|             { | ||||
|                 "skip": "False", | ||||
|                 "data": "(length, width, 0)" | ||||
|                 "params": { | ||||
|                     "top_pos": "(0, 0)", | ||||
|                     "bottom_pos": "(length, 0)", | ||||
|                     "tip_pos": "(tip_offset, width)" | ||||
|                 }, | ||||
|                 "transform": "ident()" | ||||
|             } | ||||
|         ], | ||||
|         "faces": [ | ||||
|             { | ||||
|                 "skip": "False", | ||||
|                 "texture": "\"FloorTopBorderless\"", | ||||
|                 "indices": [0, 1, 3, 2], | ||||
|                 "uvs": [ | ||||
|                     "(0, 0)", | ||||
|                     "(uv_width, 0)", | ||||
|                     "(uv_width, uv_length)", | ||||
|                     "(0, uv_length)" | ||||
|                 ], | ||||
|                 "normals": null | ||||
|             } | ||||
|         ], | ||||
|         "instances": [] | ||||
|         ] | ||||
|     } | ||||
| ] | ||||
							
								
								
									
										324
									
								
								assets/jsons/streets.json5
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,324 @@ | ||||
| [ | ||||
|     { | ||||
|         "identifier": "floor_normal_straight", | ||||
|         "showcase": { | ||||
|             "title": "Normal Floor", | ||||
|             "category": "Floors", | ||||
|             "icon": "NormalFloor", | ||||
|             "type": "floor", | ||||
|             "cfgs": [ | ||||
|                 { | ||||
|                     "field": "height_", | ||||
|                     "type": "float", | ||||
|                     "title": "Height", | ||||
|                     "desc": "The height of block.", | ||||
|                     "default": "5.0" | ||||
|                 }, | ||||
|                 { | ||||
|                     "field": "length_", | ||||
|                     "type": "float", | ||||
|                     "title": "Length", | ||||
|                     "desc": "The length of block.", | ||||
|                     "default": "2.5" | ||||
|                 }, | ||||
|                 { | ||||
|                     "field": "face_", | ||||
|                     "type": "face", | ||||
|                     "title": "Face", | ||||
|                     "desc": "Whether has some faces.", | ||||
|                     "default": "(True, False, False, False, True, True)" | ||||
|                 } | ||||
|             ] | ||||
|         }, | ||||
|         "params": [ | ||||
|             { | ||||
|                 "field": "height", | ||||
|                 "data": "height_" | ||||
|             }, | ||||
|             { | ||||
|                 "field": "length", | ||||
|                 "data": "length_" | ||||
|             }, | ||||
|             { | ||||
|                 "field": "face", | ||||
|                 "data": "face_" | ||||
|             } | ||||
|         ], | ||||
|         "skip": "length == 0", | ||||
|         "vars": [ | ||||
|             { | ||||
|                 "field": "length_uv", | ||||
|                 "data": "length / 5.0" | ||||
|             } | ||||
|         ], | ||||
|         "vertices": [ | ||||
|             { | ||||
|                 "skip": "not face[0]", | ||||
|                 "data": "(0, 0, 0)" | ||||
|             }, | ||||
|             { | ||||
|                 "skip": "not face[0]", | ||||
|                 "data": "(length, 0, 0)" | ||||
|             }, | ||||
|             { | ||||
|                 "skip": "not face[0]", | ||||
|                 "data": "(length, 5, 0)" | ||||
|             }, | ||||
|             { | ||||
|                 "skip": "not face[0]", | ||||
|                 "data": "(0, 5, 0)" | ||||
|             } | ||||
|         ], | ||||
|         "faces": [ | ||||
|             { | ||||
|                 "skip": "not face[0]", | ||||
|                 "texture": "\"FloorTopFlat\"", | ||||
|                 "indices": [0, 1, 2, 3], | ||||
|                 "uvs": [ | ||||
|                     "(0, 0)", | ||||
|                     "(0, length_uv)", | ||||
|                     "(1, length_uv)", | ||||
|                     "(1, 0)" | ||||
|                 ], | ||||
|                 "normals": null | ||||
|             } | ||||
|         ], | ||||
|         "instances": [ | ||||
|             { | ||||
|                 "identifier": "raw_floor_side", | ||||
|                 "skip": "not face[2]", | ||||
|                 "params": { | ||||
|                     "height": "height", | ||||
|                     "length": "5", | ||||
|                     "is_left_sink": "False", | ||||
|                     "is_right_sink": "False" | ||||
|                 }, | ||||
|                 "transform": "rot(0, 0, 90) @ scale(1, -1, 1)" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "raw_floor_side", | ||||
|                 "skip": "not face[3]", | ||||
|                 "params": { | ||||
|                     "height": "height", | ||||
|                     "length": "5", | ||||
|                     "is_left_sink": "False", | ||||
|                     "is_right_sink": "False" | ||||
|                 }, | ||||
|                 "transform": "move(length, 0, 0) @ rot(0, 0, 90)" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "raw_floor_side", | ||||
|                 "skip": "not face[4]", | ||||
|                 "params": { | ||||
|                     "height": "height", | ||||
|                     "length": "length", | ||||
|                     "is_left_sink": "False", | ||||
|                     "is_right_sink": "False" | ||||
|                 }, | ||||
|                 "transform": "ident()" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "raw_floor_side", | ||||
|                 "skip": "not face[5]", | ||||
|                 "params": { | ||||
|                     "height": "height", | ||||
|                     "length": "length", | ||||
|                     "is_left_sink": "False", | ||||
|                     "is_right_sink": "False" | ||||
|                 }, | ||||
|                 "transform": "move(0, 5, 0) @ scale(1, -1, 1)" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "floor_rectangle_bottom", | ||||
|                 "skip": "not face[1]", | ||||
|                 "params": { | ||||
|                     "length": "length", | ||||
|                     "width": "5" | ||||
|                 }, | ||||
|                 "transform": "move(0, 0, -height)" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "identifier": "floor_sink_straight", | ||||
|         "showcase": { | ||||
|             "title": "Sink Floor", | ||||
|             "category": "Floors", | ||||
|             "icon": "SinkFloor", | ||||
|             "type": "floor", | ||||
|             "cfgs": [ | ||||
|                 { | ||||
|                     "field": "height_", | ||||
|                     "type": "float", | ||||
|                     "title": "Height", | ||||
|                     "desc": "The height of block.", | ||||
|                     "default": "5.0" | ||||
|                 }, | ||||
|                 { | ||||
|                     "field": "length_", | ||||
|                     "type": "float", | ||||
|                     "title": "Length", | ||||
|                     "desc": "The length of block.", | ||||
|                     "default": "2.5" | ||||
|                 }, | ||||
|                 { | ||||
|                     "field": "face_", | ||||
|                     "type": "face", | ||||
|                     "title": "Face", | ||||
|                     "desc": "Whether has some faces.", | ||||
|                     "default": "(True, False, False, False, True, True)" | ||||
|                 } | ||||
|             ] | ||||
|         }, | ||||
|         "params": [ | ||||
|             { | ||||
|                 "field": "height", | ||||
|                 "data": "height_" | ||||
|             }, | ||||
|             { | ||||
|                 "field": "length", | ||||
|                 "data": "length_" | ||||
|             }, | ||||
|             { | ||||
|                 "field": "face", | ||||
|                 "data": "face_" | ||||
|             } | ||||
|         ], | ||||
|         "skip": "length == 0", | ||||
|         "vars": [ | ||||
|             { | ||||
|                 "field": "length_uv", | ||||
|                 "data": "length / 5.0" | ||||
|             } | ||||
|         ], | ||||
|         "vertices": [ | ||||
|             { | ||||
|                 "skip": "not face[0]", | ||||
|                 "data": "(0, 0, 0)" | ||||
|             }, | ||||
|             { | ||||
|                 "skip": "not face[0]", | ||||
|                 "data": "(length, 0, 0)" | ||||
|             }, | ||||
|             { | ||||
|                 "skip": "not face[0]", | ||||
|                 "data": "(length, 2.5, -0.7)" | ||||
|             }, | ||||
|             { | ||||
|                 "skip": "not face[0]", | ||||
|                 "data": "(0, 2.5, -0.7)" | ||||
|             }, | ||||
|             { | ||||
|                 "skip": "not face[0]", | ||||
|                 "data": "(length, 5, 0)" | ||||
|             }, | ||||
|             { | ||||
|                 "skip": "not face[0]", | ||||
|                 "data": "(0, 5, 0)" | ||||
|             } | ||||
|         ], | ||||
|         "faces": [ | ||||
|             { | ||||
|                 "skip": "not face[0]", | ||||
|                 "texture": "\"FloorTopProfil\"", | ||||
|                 "indices": [0, 1, 2, 3], | ||||
|                 "uvs": [ | ||||
|                     "(0, 0)", | ||||
|                     "(0, length_uv)", | ||||
|                     "(0.5, length_uv)", | ||||
|                     "(0.5, 0)" | ||||
|                 ], | ||||
|                 "normals": null | ||||
|             }, | ||||
|             { | ||||
|                 "skip": "not face[0]", | ||||
|                 "texture": "\"FloorTopProfil\"", | ||||
|                 "indices": [3, 2, 4, 5], | ||||
|                 "uvs": [ | ||||
|                     "(0.5, 0)", | ||||
|                     "(0.5, length_uv)", | ||||
|                     "(1, length_uv)", | ||||
|                     "(1, 0)" | ||||
|                 ], | ||||
|                 "normals": null | ||||
|             } | ||||
|         ], | ||||
|         "instances": [ | ||||
|             { | ||||
|                 "identifier": "raw_floor_side", | ||||
|                 "skip": "not face[2]", | ||||
|                 "params": { | ||||
|                     "height": "height", | ||||
|                     "length": "2.5", | ||||
|                     "is_left_sink": "False", | ||||
|                     "is_right_sink": "True" | ||||
|                 }, | ||||
|                 "transform": "rot(0, 0, 90) @ scale(1, -1, 1)" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "raw_floor_side", | ||||
|                 "skip": "not face[2]", | ||||
|                 "params": { | ||||
|                     "height": "height", | ||||
|                     "length": "2.5", | ||||
|                     "is_left_sink": "True", | ||||
|                     "is_right_sink": "False" | ||||
|                 }, | ||||
|                 "transform": "move(0, 2.5, 0) @ rot(0, 0, 90) @ scale(1, -1, 1)" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "raw_floor_side", | ||||
|                 "skip": "not face[3]", | ||||
|                 "params": { | ||||
|                     "height": "height", | ||||
|                     "length": "2.5", | ||||
|                     "is_left_sink": "False", | ||||
|                     "is_right_sink": "True" | ||||
|                 }, | ||||
|                 "transform": "move(length, 0, 0) @ rot(0, 0, 90)" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "raw_floor_side", | ||||
|                 "skip": "not face[3]", | ||||
|                 "params": { | ||||
|                     "height": "height", | ||||
|                     "length": "2.5", | ||||
|                     "is_left_sink": "True", | ||||
|                     "is_right_sink": "False" | ||||
|                 }, | ||||
|                 "transform": "move(length, 2.5, 0) @ rot(0, 0, 90)" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "raw_floor_side", | ||||
|                 "skip": "not face[4]", | ||||
|                 "params": { | ||||
|                     "height": "height", | ||||
|                     "length": "length", | ||||
|                     "is_left_sink": "False", | ||||
|                     "is_right_sink": "False" | ||||
|                 }, | ||||
|                 "transform": "ident()" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "raw_floor_side", | ||||
|                 "skip": "not face[5]", | ||||
|                 "params": { | ||||
|                     "height": "height", | ||||
|                     "length": "length", | ||||
|                     "is_left_sink": "False", | ||||
|                     "is_right_sink": "False" | ||||
|                 }, | ||||
|                 "transform": "move(0, 5, 0) @ scale(1, -1, 1)" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "floor_rectangle_bottom", | ||||
|                 "skip": "not face[1]", | ||||
|                 "params": { | ||||
|                     "length": "length", | ||||
|                     "width": "5" | ||||
|                 }, | ||||
|                 "transform": "move(0, 0, -height)" | ||||
|             } | ||||
|         ] | ||||
|     } | ||||
| ] | ||||
| @ -1,4 +1,5 @@ | ||||
| [ | ||||
|     // The shared template prototype used by all floor terminals. | ||||
|     { | ||||
|         "identifier": "raw_floor_terminal", | ||||
|         "showcase": null, | ||||
| @ -22,28 +23,53 @@ | ||||
|         "faces": [], | ||||
|         "instances": [ | ||||
|             { | ||||
|                 "identifier": "raw_floor_corner", | ||||
|                 "identifier": "cv_trapezoid_side", | ||||
|                 "skip": "False", | ||||
|                 "params": { | ||||
|                     "long_edge_length": "5.0", | ||||
|                     "short_edge_offset": "2.5", | ||||
|                     "short_edge_length": "2.5", | ||||
|                     "height": "height", | ||||
|                     "face": "(face[0], face[1], face[2], face[3], face[4], False)", | ||||
|                     "face": "(face[0], False, False, face[3], face[4], False)", | ||||
|                     "is_sink": "is_sink", | ||||
|                     "is_inner": "False", | ||||
|                     "is_ribbon": "False" | ||||
|                 }, | ||||
|                 "transform": "ident()" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "raw_floor_corner", | ||||
|                 "identifier": "cv_trapezoid_side", | ||||
|                 "skip": "False", | ||||
|                 "params": { | ||||
|                     "long_edge_length": "5.0", | ||||
|                     "short_edge_offset": "2.5", | ||||
|                     "short_edge_length": "2.5", | ||||
|                     "height": "height", | ||||
|                     "face": "(face[0], face[1], face[5], False, face[2], face[3])", | ||||
|                     "face": "(face[0], False, False, face[3], face[5], False)", | ||||
|                     "is_sink": "is_sink", | ||||
|                     "is_inner": "False", | ||||
|                     "is_ribbon": "False" | ||||
|                 }, | ||||
|                 "transform": "move(0, 5, 0) @ scale(1, -1, 1)" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "cv_triangle_side", | ||||
|                 "skip": "False", | ||||
|                 "params": { | ||||
|                     "edge_length": "5", | ||||
|                     "tip_offset": "2.5", | ||||
|                     "height": "height", | ||||
|                     "face": "(face[0], False, False, False, face[2], None)", | ||||
|                     "is_sink": "is_sink" | ||||
|                 }, | ||||
|                 "transform": "move(0, 5, 0) @ rot(0, 0, -90)" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "floor_rectangle_bottom", | ||||
|                 "skip": "not face[1]", | ||||
|                 "params": { | ||||
|                     "length": "5", | ||||
|                     "width": "5" | ||||
|                 }, | ||||
|                 "transform": "move(0, 0, -height)" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
| @ -51,6 +77,7 @@ | ||||
|         "identifier": "floor_normal_terminal", | ||||
|         "showcase": { | ||||
|             "title": "Normal Floor Terminal", | ||||
|             "category": "Floors", | ||||
|             "icon": "NormalFloorTerminal", | ||||
|             "type": "floor", | ||||
|             "cfgs": [ | ||||
| @ -101,6 +128,7 @@ | ||||
|         "identifier": "floor_sink_terminal", | ||||
|         "showcase": { | ||||
|             "title": "Sink Floor Terminal", | ||||
|             "category": "Floors", | ||||
|             "icon": "SinkFloorTerminal", | ||||
|             "type": "floor", | ||||
|             "cfgs": [ | ||||
| @ -137,6 +137,7 @@ | ||||
|         "identifier": "wood_trafo", | ||||
|         "showcase": { | ||||
|             "title": "Wood Trafo", | ||||
|             "category": "Trafo", | ||||
|             "icon": "WoodTrafo", | ||||
|             "type": "floor", | ||||
|             "cfgs": [ | ||||
| @ -187,6 +188,7 @@ | ||||
|         "identifier": "stone_trafo", | ||||
|         "showcase": { | ||||
|             "title": "Stone Trafo", | ||||
|             "category": "Trafo", | ||||
|             "icon": "StoneTrafo", | ||||
|             "type": "floor", | ||||
|             "cfgs": [ | ||||
| @ -237,6 +239,7 @@ | ||||
|         "identifier": "paper_trafo", | ||||
|         "showcase": { | ||||
|             "title": "Paper Trafo", | ||||
|             "category": "Trafo", | ||||
|             "icon": "PaperTrafo", | ||||
|             "type": "floor", | ||||
|             "cfgs": [ | ||||
| @ -111,6 +111,7 @@ | ||||
|         "identifier": "floor_transition", | ||||
|         "showcase": { | ||||
|             "title": "Transition", | ||||
|             "category": "Miscellaneous", | ||||
|             "icon": "Transition", | ||||
|             "type": "floor", | ||||
|             "cfgs": [ | ||||
| @ -177,7 +178,7 @@ | ||||
|                 "transform": "move(5, 5, 0) @ rot(0, 0, 180)" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "floor_bottom", | ||||
|                 "identifier": "floor_rectangle_bottom", | ||||
|                 "skip": "not face[1]", | ||||
|                 "params": { | ||||
|                     "length": "5", | ||||
| @ -191,6 +192,7 @@ | ||||
|         "identifier": "floor_narrow_transition", | ||||
|         "showcase": { | ||||
|             "title": "Narrow Transition", | ||||
|             "category": "Miscellaneous", | ||||
|             "icon": "NarrowTransition", | ||||
|             "type": "floor", | ||||
|             "cfgs": [ | ||||
| @ -257,7 +259,7 @@ | ||||
|                 "transform": "move(2.5, 5, 0) @ rot(0, 0, 180)" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "floor_bottom", | ||||
|                 "identifier": "floor_rectangle_bottom", | ||||
|                 "skip": "not face[1]", | ||||
|                 "params": { | ||||
|                     "length": "2.5", | ||||
| @ -3,6 +3,7 @@ | ||||
|         "identifier": "floor_wide_straight", | ||||
|         "showcase": { | ||||
|             "title": "Wide Floor", | ||||
|             "category": "Wide Floors", | ||||
|             "icon": "WideFloor", | ||||
|             "type": "floor", | ||||
|             "cfgs": [ | ||||
| @ -54,7 +55,7 @@ | ||||
|                 "data": "face_" | ||||
|             } | ||||
|         ], | ||||
|         "skip": "False", | ||||
|         "skip": "length == 0.0 or width == 0.0", | ||||
|         "vars": [], | ||||
|         "vertices": [], | ||||
|         "faces": [], | ||||
| @ -65,7 +66,7 @@ | ||||
|                 "params": { | ||||
|                     "length": "length", | ||||
|                     "height": "height", | ||||
|                     "face": "(face[0], face[1], face[2], face[3], face[4], False)" | ||||
|                     "face": "(face[0], False, face[2], face[3], face[4], False)" | ||||
|                 }, | ||||
|                 "transform": "ident()" | ||||
|             }, | ||||
| @ -75,9 +76,9 @@ | ||||
|                 "params": { | ||||
|                     "length": "length", | ||||
|                     "height": "height", | ||||
|                     "face": "(face[0], face[1], face[3], face[2], face[5], False)" | ||||
|                     "face": "(face[0], False, face[2], face[3], face[5], False)" | ||||
|                 }, | ||||
|                 "transform": "move(length, 5 + width, 0) @ rot(0, 0, 180)" | ||||
|                 "transform": "move(0, 5 + width, 0) @ scale(1, -1, 1)" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "floor_flat", | ||||
| @ -86,10 +87,19 @@ | ||||
|                     "height": "height", | ||||
|                     "length": "length", | ||||
|                     "width": "width", | ||||
|                     "face": "(face[0], face[1], face[2], face[3], False, False)", | ||||
|                     "face": "(face[0], False, face[2], face[3], False, False)", | ||||
|                     "is_sink": "True" | ||||
|                 }, | ||||
|                 "transform": "move(0, 2.5, 0)" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "floor_rectangle_bottom", | ||||
|                 "skip": "not face[1]", | ||||
|                 "params": { | ||||
|                     "length": "length", | ||||
|                     "width": "5 + width" | ||||
|                 }, | ||||
|                 "transform": "move(0, 0, -height)" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
| @ -97,6 +107,7 @@ | ||||
|         "identifier": "floor_wide_terminal", | ||||
|         "showcase": { | ||||
|             "title": "Wide Floor Terminal", | ||||
|             "category": "Wide Floors", | ||||
|             "icon": "WideFloorTerminal", | ||||
|             "type": "floor", | ||||
|             "cfgs": [ | ||||
| @ -137,38 +148,73 @@ | ||||
|                 "data": "face_" | ||||
|             } | ||||
|         ], | ||||
|         "skip": "False", | ||||
|         "skip": "width == 0.0", | ||||
|         "vars": [], | ||||
|         "vertices": [], | ||||
|         "faces": [], | ||||
|         "instances": [ | ||||
|             { | ||||
|                 "identifier": "floor_sink_outter_corner", | ||||
|                 "identifier": "cv_trapezoid_side", | ||||
|                 "skip": "False", | ||||
|                 "params": { | ||||
|                     "long_edge_length": "width + 5", | ||||
|                     "short_edge_offset": "2.5", | ||||
|                     "short_edge_length": "width", | ||||
|                     "height": "height", | ||||
|                     "face": "(face[0], face[1], face[5], False, face[2], face[5])" | ||||
|                     "face": "(face[0], False, False, False, face[2], face[3])", | ||||
|                     "is_sink": "True", | ||||
|                     "is_ribbon": "False" | ||||
|                 }, | ||||
|                 "transform": "move(0, 5 + width, 0) @ rot(0, 0, -90)" | ||||
|                 "transform": "rot(0, 0, 90) @ scale(1, -1, 1)" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "floor_sink_outter_corner", | ||||
|                 "identifier": "cv_trapezoid_side", | ||||
|                 "skip": "False", | ||||
|                 "params": { | ||||
|                     "long_edge_length": "5.0", | ||||
|                     "short_edge_offset": "2.5", | ||||
|                     "short_edge_length": "2.5", | ||||
|                     "height": "height", | ||||
|                     "face": "(face[0], face[1], face[2], face[5], face[4], False)" | ||||
|                     "face": "(face[0], False, False, face[3], face[4], False)", | ||||
|                     "is_sink": "True", | ||||
|                     "is_ribbon": "False" | ||||
|                 }, | ||||
|                 "transform": "ident()" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "floor_sink_border", | ||||
|                 "identifier": "cv_trapezoid_side", | ||||
|                 "skip": "False", | ||||
|                 "params": { | ||||
|                     "long_edge_length": "5.0", | ||||
|                     "short_edge_offset": "2.5", | ||||
|                     "short_edge_length": "2.5", | ||||
|                     "height": "height", | ||||
|                     "face": "(face[0], False, False, face[3], face[5], False)", | ||||
|                     "is_sink": "True", | ||||
|                     "is_ribbon": "False" | ||||
|                 }, | ||||
|                 "transform": "move(0, width + 5, 0) @ scale(1, -1, 1)" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "floor_flat", | ||||
|                 "skip": "False", | ||||
|                 "params": { | ||||
|                     "height": "height", | ||||
|                     "length": "width", | ||||
|                     "face": "(face[0], face[1], False, False, face[2], face[5])" | ||||
|                     "length": "2.5", | ||||
|                     "width": "width", | ||||
|                     "face": "(face[0], False, False, face[3], False, False)", | ||||
|                     "is_sink": "True" | ||||
|                 }, | ||||
|                 "transform": "move(0, 2.5 + width, 0) @ rot(0, 0, -90)" | ||||
|                 "transform": "move(2.5, 2.5, 0)" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "floor_rectangle_bottom", | ||||
|                 "skip": "not face[1]", | ||||
|                 "params": { | ||||
|                     "length": "5", | ||||
|                     "width": "5 + width" | ||||
|                 }, | ||||
|                 "transform": "move(0, 0, -height)" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
| @ -176,6 +222,7 @@ | ||||
|         "identifier": "floor_wide_l_crossing", | ||||
|         "showcase": { | ||||
|             "title": "Wide Floor L Crossing", | ||||
|             "category": "Wide Floors", | ||||
|             "icon": "WideLCrossing", | ||||
|             "type": "floor", | ||||
|             "cfgs": [ | ||||
| @ -227,46 +274,45 @@ | ||||
|                 "data": "face_" | ||||
|             } | ||||
|         ], | ||||
|         "skip": "False", | ||||
|         "skip": "width_h == 0.0 or width_v == 0.0", | ||||
|         "vars": [], | ||||
|         "vertices": [], | ||||
|         "faces": [], | ||||
|         "instances": [ | ||||
|             { | ||||
|                 "identifier": "floor_sink_outter_corner", | ||||
|                 "identifier": "cv_trapezoid_side", | ||||
|                 "skip": "False", | ||||
|                 "params": { | ||||
|                     "long_edge_length": "width_h + 5", | ||||
|                     "short_edge_offset": "2.5", | ||||
|                     "short_edge_length": "width_h + 2.5", | ||||
|                     "height": "height", | ||||
|                     "face": "(face[0], face[1], face[2], False, face[4], False)" | ||||
|                     "face": "(face[0], False, False, face[3], face[4], False)", | ||||
|                     "is_sink": "True", | ||||
|                     "is_ribbon": "False" | ||||
|                 }, | ||||
|                 "transform": "ident()" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "floor_sink_border", | ||||
|                 "identifier": "cv_trapezoid_side", | ||||
|                 "skip": "False", | ||||
|                 "params": { | ||||
|                     "length": "2.5 + width_h", | ||||
|                     "long_edge_length": "width_v + 5", | ||||
|                     "short_edge_offset": "2.5", | ||||
|                     "short_edge_length": "width_v + 2.5", | ||||
|                     "height": "height", | ||||
|                     "face": "(face[0], face[1], False, face[3], face[4], False)" | ||||
|                     "face": "(face[0], False, False, face[5], face[2], False)", | ||||
|                     "is_sink": "True", | ||||
|                     "is_ribbon": "False" | ||||
|                 }, | ||||
|                 "transform": "move(2.5, 0, 0)" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "floor_sink_border", | ||||
|                 "skip": "False", | ||||
|                 "params": { | ||||
|                     "length": "2.5 + width_v", | ||||
|                     "height": "height", | ||||
|                     "face": "(face[0], face[1], face[5], False, face[2], False)" | ||||
|                 }, | ||||
|                 "transform": "move(0, 5 + width_v, 0) @ rot(0, 0, -90)" | ||||
|                 "transform": "rot(0, 0, 90) @ scale(1, -1, 1)" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "floor_sink_inner_corner", | ||||
|                 "skip": "False", | ||||
|                 "params": { | ||||
|                     "height": "height", | ||||
|                     "face": "(face[0], face[1], False, face[3], False, face[5])" | ||||
|                     "face": "(face[0], False, False, face[3], False, face[5])" | ||||
|                 }, | ||||
|                 "transform": "move(2.5 + width_h, 2.5 + width_v, 0)" | ||||
|             }, | ||||
| @ -277,7 +323,7 @@ | ||||
|                     "height": "height", | ||||
|                     "length": "width_h + 2.5", | ||||
|                     "width": "width_v", | ||||
|                     "face": "(face[0], face[1], False, face[3], False, False)", | ||||
|                     "face": "(face[0], False, False, face[3], False, False)", | ||||
|                     "is_sink": "True" | ||||
|                 }, | ||||
|                 "transform": "move(2.5, 2.5, 0)" | ||||
| @ -289,10 +335,19 @@ | ||||
|                     "height": "height", | ||||
|                     "length": "width_h", | ||||
|                     "width": "2.5", | ||||
|                     "face": "(face[0], face[1], False, False, False, face[5])", | ||||
|                     "face": "(face[0], False, False, False, False, face[5])", | ||||
|                     "is_sink": "True" | ||||
|                 }, | ||||
|                 "transform": "move(2.5, 2.5 + width_v, 0)" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "floor_rectangle_bottom", | ||||
|                 "skip": "not face[1]", | ||||
|                 "params": { | ||||
|                     "length": "width_h + 5", | ||||
|                     "width": "width_v + 5" | ||||
|                 }, | ||||
|                 "transform": "move(0, 0, -height)" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
| @ -300,6 +355,7 @@ | ||||
|         "identifier": "floor_wide_t_crossing", | ||||
|         "showcase": { | ||||
|             "title": "Wide Floor T Crossing", | ||||
|             "category": "Wide Floors", | ||||
|             "icon": "WideTCrossing", | ||||
|             "type": "floor", | ||||
|             "cfgs": [ | ||||
| @ -351,7 +407,7 @@ | ||||
|                 "data": "face_" | ||||
|             } | ||||
|         ], | ||||
|         "skip": "False", | ||||
|         "skip": "width_h == 0.0 or width_v == 0.0", | ||||
|         "vars": [], | ||||
|         "vertices": [], | ||||
|         "faces": [], | ||||
| @ -362,7 +418,7 @@ | ||||
|                 "params": { | ||||
|                     "length": "5 + width_v", | ||||
|                     "height": "height", | ||||
|                     "face": "(face[0], face[1], face[5], face[4], face[2], False)" | ||||
|                     "face": "(face[0], False, face[5], face[4], face[2], False)" | ||||
|                 }, | ||||
|                 "transform": "move(0, 5 + width_v, 0) @ rot(0, 0, -90)" | ||||
|             }, | ||||
| @ -371,7 +427,7 @@ | ||||
|                 "skip": "False", | ||||
|                 "params": { | ||||
|                     "height": "height", | ||||
|                     "face": "(face[0], face[1], False, face[4], False, face[3])" | ||||
|                     "face": "(face[0], False, False, face[4], False, face[3])" | ||||
|                 }, | ||||
|                 "transform": "move(2.5 + width_h, 2.5, 0) @ rot(0, 0, -90)" | ||||
|             }, | ||||
| @ -380,7 +436,7 @@ | ||||
|                 "skip": "False", | ||||
|                 "params": { | ||||
|                     "height": "height", | ||||
|                     "face": "(face[0], face[1], False, face[3], False, face[5])" | ||||
|                     "face": "(face[0], False, False, face[3], False, face[5])" | ||||
|                 }, | ||||
|                 "transform": "move(2.5 + width_h, 2.5 + width_v, 0)" | ||||
|             }, | ||||
| @ -391,7 +447,7 @@ | ||||
|                     "height": "height", | ||||
|                     "length": "width_h", | ||||
|                     "width": "5 + width_v", | ||||
|                     "face": "(face[0], face[1], False, False, face[4], face[5])", | ||||
|                     "face": "(face[0], False, False, False, face[4], face[5])", | ||||
|                     "is_sink": "True" | ||||
|                 }, | ||||
|                 "transform": "move(2.5, 0, 0)" | ||||
| @ -403,10 +459,19 @@ | ||||
|                     "height": "height", | ||||
|                     "length": "2.5", | ||||
|                     "width": "width_v", | ||||
|                     "face": "(face[0], face[1], False, face[3], False, False)", | ||||
|                     "face": "(face[0], False, False, face[3], False, False)", | ||||
|                     "is_sink": "True" | ||||
|                 }, | ||||
|                 "transform": "move(2.5 + width_h, 2.5, 0)" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "floor_rectangle_bottom", | ||||
|                 "skip": "not face[1]", | ||||
|                 "params": { | ||||
|                     "length": "width_h + 5", | ||||
|                     "width": "width_v + 5" | ||||
|                 }, | ||||
|                 "transform": "move(0, 0, -height)" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
| @ -414,6 +479,7 @@ | ||||
|         "identifier": "floor_wide_x_crossing", | ||||
|         "showcase": { | ||||
|             "title": "Wide Floor X Crossing", | ||||
|             "category": "Wide Floors", | ||||
|             "icon": "WideXCrossing", | ||||
|             "type": "floor", | ||||
|             "cfgs": [ | ||||
| @ -465,7 +531,7 @@ | ||||
|                 "data": "face_" | ||||
|             } | ||||
|         ], | ||||
|         "skip": "False", | ||||
|         "skip": "width_h == 0.0 or width_v == 0.0", | ||||
|         "vars": [], | ||||
|         "vertices": [], | ||||
|         "faces": [], | ||||
| @ -475,7 +541,7 @@ | ||||
|                 "skip": "False", | ||||
|                 "params": { | ||||
|                     "height": "height", | ||||
|                     "face": "(face[0], face[1], False, face[5], False, face[2])" | ||||
|                     "face": "(face[0], False, False, face[5], False, face[2])" | ||||
|                 }, | ||||
|                 "transform": "move(2.5, 2.5 + width_v, 0) @ rot(0, 0, -270)" | ||||
|             }, | ||||
| @ -484,7 +550,7 @@ | ||||
|                 "skip": "False", | ||||
|                 "params": { | ||||
|                     "height": "height", | ||||
|                     "face": "(face[0], face[1], False, face[2], False, face[4])" | ||||
|                     "face": "(face[0], False, False, face[2], False, face[4])" | ||||
|                 }, | ||||
|                 "transform": "move(2.5, 2.5, 0) @ rot(0, 0, -180)" | ||||
|             }, | ||||
| @ -493,7 +559,7 @@ | ||||
|                 "skip": "False", | ||||
|                 "params": { | ||||
|                     "height": "height", | ||||
|                     "face": "(face[0], face[1], False, face[4], False, face[3])" | ||||
|                     "face": "(face[0], False, False, face[4], False, face[3])" | ||||
|                 }, | ||||
|                 "transform": "move(2.5 + width_h, 2.5, 0) @ rot(0, 0, -90)" | ||||
|             }, | ||||
| @ -502,7 +568,7 @@ | ||||
|                 "skip": "False", | ||||
|                 "params": { | ||||
|                     "height": "height", | ||||
|                     "face": "(face[0], face[1], False, face[3], False, face[5])" | ||||
|                     "face": "(face[0], False, False, face[3], False, face[5])" | ||||
|                 }, | ||||
|                 "transform": "move(2.5 + width_h, 2.5 + width_v, 0)" | ||||
|             }, | ||||
| @ -513,7 +579,7 @@ | ||||
|                     "height": "height", | ||||
|                     "length": "width_h", | ||||
|                     "width": "5 + width_v", | ||||
|                     "face": "(face[0], face[1], False, False, face[4], face[5])", | ||||
|                     "face": "(face[0], False, False, False, face[4], face[5])", | ||||
|                     "is_sink": "True" | ||||
|                 }, | ||||
|                 "transform": "move(2.5, 0, 0)" | ||||
| @ -525,7 +591,7 @@ | ||||
|                     "height": "height", | ||||
|                     "length": "2.5", | ||||
|                     "width": "width_v", | ||||
|                     "face": "(face[0], face[1], False, face[3], False, False)", | ||||
|                     "face": "(face[0], False, False, face[3], False, False)", | ||||
|                     "is_sink": "True" | ||||
|                 }, | ||||
|                 "transform": "move(2.5 + width_h, 2.5, 0)" | ||||
| @ -537,10 +603,19 @@ | ||||
|                     "height": "height", | ||||
|                     "length": "2.5", | ||||
|                     "width": "width_v", | ||||
|                     "face": "(face[0], face[1], face[2], False, False, False)", | ||||
|                     "face": "(face[0], False, face[2], False, False, False)", | ||||
|                     "is_sink": "True" | ||||
|                 }, | ||||
|                 "transform": "move(0, 2.5, 0)" | ||||
|             }, | ||||
|             { | ||||
|                 "identifier": "floor_rectangle_bottom", | ||||
|                 "skip": "not face[1]", | ||||
|                 "params": { | ||||
|                     "length": "width_h + 5", | ||||
|                     "width": "width_v + 5" | ||||
|                 }, | ||||
|                 "transform": "move(0, 0, -height)" | ||||
|             } | ||||
|         ] | ||||
|     } | ||||