|  |  | @@ -6,8 +6,26 @@ import os | 
		
	
		
			
			|  |  |  | import pathlib | 
		
	
		
			
			|  |  |  | import bmesh | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | GROUP_NAME = "Bricks" | 
		
	
		
			
			|  |  |  | GROUP_KIND = "objects" | 
		
	
		
			
			|  |  |  | def get_bounds(objects): | 
		
	
		
			
			|  |  |  | xl = [] | 
		
	
		
			
			|  |  |  | yl = [] | 
		
	
		
			
			|  |  |  | zl = [] | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | for obj in objects: | 
		
	
		
			
			|  |  |  | for bounds in obj.bound_box: | 
		
	
		
			
			|  |  |  | v = obj.matrix_world @ Vector(bounds) | 
		
	
		
			
			|  |  |  | xl += [v[0] for c in obj.bound_box] | 
		
	
		
			
			|  |  |  | yl += [v[1] for c in obj.bound_box] | 
		
	
		
			
			|  |  |  | zl += [v[2] for c in obj.bound_box] | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | return ( | 
		
	
		
			
			|  |  |  | Vector([min(xl), min(yl), min(zl)]), | 
		
	
		
			
			|  |  |  | Vector([max(xl), max(yl), max(zl)]) | 
		
	
		
			
			|  |  |  | ) | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | GROUP_NAME = "Billboards" | 
		
	
		
			
			|  |  |  | GROUP_KIND = "buildings" | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | path_info = pathlib.Path(bpy.data.filepath).parent.joinpath("macrovision-directory.txt") | 
		
	
		
			
			|  |  |  | config_path = pathlib.Path(open(path_info).read()) | 
		
	
	
		
			
				|  |  | @@ -28,10 +46,7 @@ bpy.data.scenes["Scene"].view_settings.view_transform = "Raw" | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | bpy.data.worlds["World"].node_tree.nodes["Background"].inputs[1].default_value = 0 | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | objects = [] | 
		
	
		
			
			|  |  |  | for object in bpy.data.collections["Macrovision"].objects: | 
		
	
		
			
			|  |  |  | if object.type == "MESH" or object.type == "CURVE": | 
		
	
		
			
			|  |  |  | objects.append(object) | 
		
	
		
			
			|  |  |  | collections = bpy.data.collections["Macrovision"].children | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | all_data = {} | 
		
	
		
			
			|  |  |  | 
 | 
		
	
	
		
			
				|  |  | @@ -39,33 +54,51 @@ all_data["name"] = GROUP_NAME | 
		
	
		
			
			|  |  |  | all_data["kind"] = GROUP_KIND | 
		
	
		
			
			|  |  |  | all_data["forms"] = [] | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | VOLUME = True | 
		
	
		
			
			|  |  |  | VOLUME = False | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | os.makedirs(workdir, exist_ok=True) | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | for selected in objects: | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | for object in bpy.data.collections["Macrovision"].objects: | 
		
	
		
			
			|  |  |  | object.hide_render = True | 
		
	
		
			
			|  |  |  | VIEW_DATA = { | 
		
	
		
			
			|  |  |  | "Front": [0, 1, 2, "Front"], | 
		
	
		
			
			|  |  |  | "Angled": [0.5, 1, 2, "Angled"], | 
		
	
		
			
			|  |  |  | "Side": [1, 1, 2, "Side"], | 
		
	
		
			
			|  |  |  | "Back": [2, 1, 2, "Back"], | 
		
	
		
			
			|  |  |  | "Top": [0, 0, 1, "Top"] | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | for coll in collections: | 
		
	
		
			
			|  |  |  | coll.hide_render = True | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | for coll in collections: | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | selected.hide_render = False | 
		
	
		
			
			|  |  |  | coll.hide_render = False | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | bpy.ops.object.select_all(action='DESELECT') | 
		
	
		
			
			|  |  |  | selected.select_set(True) | 
		
	
		
			
			|  |  |  | bpy.ops.object.transform_apply( location = False, rotation = True, scale = True ) | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | for obj in coll.objects: | 
		
	
		
			
			|  |  |  | obj.select_set(True) | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | data = {} | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | data["name"] = selected.name | 
		
	
		
			
			|  |  |  | data["name"] = coll.name | 
		
	
		
			
			|  |  |  | data["views"] = [] | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | b = selected | 
		
	
		
			
			|  |  |  | bound_min, bound_max = get_bounds(coll.objects) | 
		
	
		
			
			|  |  |  | dimensions = bound_max - bound_min | 
		
	
		
			
			|  |  |  | size = max(dimensions) | 
		
	
		
			
			|  |  |  | global_bbox_center = 0.5 * (bound_min + bound_max) | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | view_list = [] | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | if "Views" in coll: | 
		
	
		
			
			|  |  |  | for view in coll["Views"].split(","): | 
		
	
		
			
			|  |  |  | view_list.append(VIEW_DATA[view]) | 
		
	
		
			
			|  |  |  | else: | 
		
	
		
			
			|  |  |  | view_list = [VIEW_DATA["Front"]] | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | for angles in [[0, 1, 2, "Front"], [0.5, 1, 2, "Angled"], [1, 1, 2, "Side"], [0, 0, 1, "Top"]]: | 
		
	
		
			
			|  |  |  | local_bbox_center = 0.125 * sum((Vector(box) for box in b.bound_box), Vector()) | 
		
	
		
			
			|  |  |  | global_bbox_center = b.matrix_world @ local_bbox_center | 
		
	
		
			
			|  |  |  | for angles in view_list: | 
		
	
		
			
			|  |  |  | c.location = global_bbox_center | 
		
	
		
			
			|  |  |  | largest = max(b.dimensions) | 
		
	
		
			
			|  |  |  | largest = size | 
		
	
		
			
			|  |  |  | c.data.ortho_scale = largest * 1.2 | 
		
	
		
			
			|  |  |  | if angles[0] % 1 != 0: | 
		
	
		
			
			|  |  |  | c.data.ortho_scale *= sqrt(2) | 
		
	
	
		
			
				|  |  | @@ -77,18 +110,15 @@ for selected in objects: | 
		
	
		
			
			|  |  |  | c.data.clip_end = largest * 4 | 
		
	
		
			
			|  |  |  | data["views"].append({ | 
		
	
		
			
			|  |  |  | "name": angles[3], | 
		
	
		
			
			|  |  |  | "height": b.dimensions[angles[2]] | 
		
	
		
			
			|  |  |  | "height": dimensions[angles[2]] | 
		
	
		
			
			|  |  |  | }) | 
		
	
		
			
			|  |  |  | if VOLUME and selected.type == "MESH": | 
		
	
		
			
			|  |  |  | bm = bmesh.new() | 
		
	
		
			
			|  |  |  | bm.from_mesh(selected.data) | 
		
	
		
			
			|  |  |  | data["views"][-1]["volume"] = bm.calc_volume() | 
		
	
		
			
			|  |  |  | #s.rotation_euler = c.rotation_euler | 
		
	
		
			
			|  |  |  | filename = f"{b.name}-{angles[3]}.png" | 
		
	
		
			
			|  |  |  | filename = f"{coll.name}-{angles[3]}.png" | 
		
	
		
			
			|  |  |  | bpy.context.scene.render.filepath = workdir.joinpath(filename).resolve().__str__() | 
		
	
		
			
			|  |  |  | bpy.ops.render.render(write_still = True) | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | all_data["forms"].append(data) | 
		
	
		
			
			|  |  |  | coll.hide_render = True | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | with open(workdir.joinpath("data.json"), "w") as file: | 
		
	
		
			
			|  |  |  | json.dump(all_data, file) |