default WorldCoord getSubassemblySize(Entity excluding, Entity part) {
		WorldCoord s = part.getSize();
		double x = s.x, y = s.y, z = s.z;
		
		if (getJoints().has(part)) {
			EnumMap<JointType, Double> extents = new EnumMap<>(JointType.class);
			
			for (Joint j : getJoints().get(part)) {
				if (j.to != excluding) {
					switch (j.type) {
						case LEFT:
						case RIGHT: {
							extents.put(j.type, Math.max(extents.getOrDefault(j.type, 0.0), getSubassemblySize(part, j.to).x));
							break;
						}
						case TOP:
						case BOTTOM: {
							extents.put(j.type, Math.max(extents.getOrDefault(j.type, 0.0), getSubassemblySize(part, j.to).y));
							break;
						}
						case FRONT:
						case BACK: {
							extents.put(j.type, Math.max(extents.getOrDefault(j.type, 0.0), getSubassemblySize(part, j.to).z));
							break;
						}
						default: {}
					}
				}
			}
			
			x = extents.getOrDefault(JointType.LEFT, 0.0) + x + extents.getOrDefault(JointType.RIGHT, 0.0);
			y = extents.getOrDefault(JointType.TOP, 0.0) + y + extents.getOrDefault(JointType.BOTTOM, 0.0);
			z = extents.getOrDefault(JointType.FRONT, 0.0) + z + extents.getOrDefault(JointType.BACK, 0.0);
		}
		
		return new WorldCoord(x, y, z);
	}