def test_duplicate_and_reconstruct(self): test_utils.new_scene() self._head_and_cameras() settings = get_main_settings() headnum = settings.get_last_headnum() test_utils.deselect_all() test_utils.select_camera(headnum, 0) test_utils.out_pinmode() headobj = test_utils.select_by_headnum(headnum) bpy.ops.object.duplicate_move( OBJECT_OT_duplicate={ "linked": False, "mode": 'TRANSLATION' }, TRANSFORM_OT_translate={"value": (-4.0, 0, 0)}) test_utils.save_scene(filename='before.blend') op = get_operator(Config.fb_reconstruct_head_idname) op('EXEC_DEFAULT') headnum2 = settings.get_last_headnum() head_new = settings.get_head(headnum2) # Two heads in scene self.assertEqual(1, settings.get_last_headnum()) # Three cameras created self.assertEqual(2, head_new.get_last_camnum())
def test_detect_faces(self): test_utils.new_scene() self._head_and_cameras() fb = FBLoader.get_builder() self.assertTrue(fb.is_face_detector_available()) settings = get_main_settings() headnum = settings.get_last_headnum() head = settings.get_head(headnum) camnum = head.get_last_camnum() test_utils.select_camera(headnum, camnum - 1) reset_detected_faces() test_utils.pickmode_start(headnum=headnum, camnum=camnum - 1) faces = get_detected_faces() self.assertEqual(1, len(faces)) test_utils.select_camera(headnum, camnum) reset_detected_faces() test_utils.pickmode_start(headnum=headnum, camnum=camnum) faces = get_detected_faces() self.assertEqual(TestConfig.faces_on_test_render, len(faces)) for i in range(len(faces)): test_utils.pickmode_select(headnum=headnum, camnum=camnum, selected=i) test_utils.out_pinmode()
def test_uv_switch(self): if TestConfig.skip_this_test('test_uv_switch'): return def _get_uv_names(): return [x[0] for x in uv_items_callback(None, None)] def _get_uvs_in_np_array(obj): uv_map = obj.data.uv_layers.active uv_count = len(uv_map.data) np_uvs = np.empty((uv_count, 2), dtype=np.float32) uv_map.data.foreach_get('uv', np.reshape(np_uvs, uv_count * 2)) return np_uvs test_utils.new_scene() self._head_cams_and_pins() settings = get_main_settings() headnum = settings.get_last_headnum() head = settings.get_head(headnum) headobj = head.headobj for level_of_detail in _get_models(): head.model_type = level_of_detail previous = [] for uv_name in _get_uv_names(): head.tex_uv_shape = uv_name np_uvs = _get_uvs_in_np_array(headobj) for member in previous: self.assertFalse(np.array_equal(np_uvs, member)) previous.append(np_uvs)
def test_load_images_and_bake_texture(self): test_utils.new_scene() self._head_cams_and_pins() settings = get_main_settings() dir = os.path.dirname(os.path.abspath(__file__)) filename = os.path.join(dir, 'images/ale_white_24x16.jpg') headnum = 0 camnum = 1 res = test_utils.create_camera_from_image(headnum=headnum, camnum=camnum, filename=filename) self.assertEqual(res, {'FINISHED'}) head = settings.get_head(headnum) camera = head.get_camera(camnum) # Test EXIF read self.assertEqual(camera.exif.focal, 50.0) self.assertEqual(camera.exif.focal35mm, 75.0) camnum = 2 filename = os.path.join(dir, 'images/ana_blue_24x16.tif') res = test_utils.create_camera_from_image(headnum=headnum, camnum=camnum, filename=filename) self.assertEqual(res, {'FINISHED'}) tex_name = materials.bake_tex(headnum=0, tex_name='bake_texture_name') self.assertTrue(tex_name is not None)
def create_head_images(): logger = logging.getLogger(__name__) new_scene() create_head() settings = get_main_settings() headnum = settings.get_last_headnum() head = settings.get_head(headnum) headobj = head.headobj create_empty_camera(headnum) camnum = head.get_last_camnum() select_camera(headnum, camnum) out_pinmode() headobj.rotation_euler = (math.pi * 0.1, 0, math.pi * 0.1) headobj.location = (0, 10, 0) scene = bpy.context.scene scene.render.engine = 'CYCLES' scene.cycles.samples = 32 # low quality scene.render.image_settings.file_format = 'JPEG' scene.world = bpy.data.worlds['World'] scene.world.color = (0.9, 0.9, 0.9) bpy.ops.object.light_add(type='SUN', align='WORLD', location=(0, 0, 0), rotation=(math.pi * 0.45, 0.0, math.pi * 0.3), scale=(1, 1, 1)) bpy.ops.object.select_all(action='DESELECT') filename1 = 'head_render1.jpg' filepath1 = os.path.join(test_dir(), filename1) scene.render.filepath = filepath1 bpy.ops.render.render(write_still=True) logger.info('Rendered by {}: {}'.format(scene.render.engine, filepath1)) headobj = select_by_headnum(headnum) bpy.ops.object.duplicate_move( OBJECT_OT_duplicate={ "linked": False, "mode": 'TRANSLATION' }, TRANSFORM_OT_translate={"value": (-4.0, 0, 0)}) bpy.ops.object.duplicate_move( OBJECT_OT_duplicate={ "linked": False, "mode": 'TRANSLATION' }, TRANSFORM_OT_translate={"value": (6.0, 0, 0)}) filename2 = 'head_render2.jpg' filepath2 = os.path.join(test_dir(), filename2) scene.render.filepath = filepath2 bpy.ops.render.render(write_still=True) logger.info('Rendered by {}: {}'.format(scene.render.engine, filepath2)) return [filepath1, filepath2]
def test_delete_cameras(self): test_utils.new_scene() self._head_and_cameras() settings = get_main_settings() headnum = settings.get_last_headnum() test_utils.create_empty_camera(headnum) self.assertEqual(4, len(settings.get_head(headnum).cameras)) test_utils.delete_camera(headnum, 2) self.assertEqual(3, len(settings.get_head(headnum).cameras)) test_utils.delete_camera(headnum, 2) self.assertEqual(2, len(settings.get_head(headnum).cameras))
def _head_and_cameras(self): settings = get_main_settings() self.assertEqual(0, len(settings.heads)) test_utils.create_head() self.assertEqual(1, len(settings.heads)) headnum = settings.get_last_headnum() # No cameras head = settings.get_head(headnum) self.assertTrue(head is not None) files = DataHolder.get_image_file_names() for filepath in files: test_utils.create_camera(headnum, filepath) # Cameras counter self.assertEqual(3, len(settings.get_head(headnum).cameras))
def test_delete_cameras(self): test_utils.new_scene() self._head_and_cameras() settings = get_main_settings() headnum = settings.get_last_headnum() filenames = DataHolder.get_image_file_names() self.assertEqual(len(filenames), len(settings.get_head(headnum).cameras)) test_utils.delete_camera(headnum, 2) self.assertEqual( len(filenames) - 1, len(settings.get_head(headnum).cameras)) test_utils.delete_camera(headnum, 2) self.assertEqual( len(filenames) - 2, len(settings.get_head(headnum).cameras))
def _head_cams_and_pins(self): self._head_and_cameras() settings = get_main_settings() headnum = settings.get_last_headnum() camnum = settings.get_last_camnum(headnum) test_utils.select_camera(headnum, camnum) brect = tuple(coords.get_camera_border(bpy.context)) arect = (396.5, -261.9, 1189.5, 1147.9) test_utils.move_pin(793, 421, 651, 425, arect, brect, headnum, camnum) test_utils.move_pin(732, 478, 826, 510, arect, brect, headnum, camnum) test_utils.move_pin(542, 549, 639, 527, arect, brect, headnum, camnum) test_utils.move_pin(912, 412, 911, 388, arect, brect, headnum, camnum) test_utils.update_pins(headnum, camnum) test_utils.out_pinmode() # Pins count self.assertEqual(4, settings.get_camera(headnum, camnum).pins_count)
def test_models_and_parts(self): if TestConfig.skip_this_test('test_models_and_parts'): return def _check_models(head): previous_polycount = 1.0e+6 for level_of_detail in _get_models(): head.model_type = level_of_detail poly_count = len(head.headobj.data.polygons) logger.debug('Model_count mask {}: {}'.format( level_of_detail, poly_count)) self.assertTrue(previous_polycount > poly_count) previous_polycount = poly_count def _check_masks(head, fb_masks_count): max_poly_count = len(head.headobj.data.polygons) logger.debug('Max_poly_count: {}'.format(max_poly_count)) for i in range(len(head.masks)): head.masks[i] = False poly_count = len(head.headobj.data.polygons) logger.debug('Poly_count mask {}: {}'.format(i, poly_count)) if i < TestConfig.fb_mask_count: self.assertTrue(max_poly_count > poly_count) else: self.assertTrue(max_poly_count == poly_count) head.masks[i] = True poly_count = len(head.headobj.data.polygons) self.assertTrue(max_poly_count == poly_count) logger = logging.getLogger(__name__) test_utils.new_scene() self._head_cams_and_pins() settings = get_main_settings() headnum = settings.get_last_headnum() head = settings.get_head(headnum) _check_models(head) for level_of_detail in _get_models(): head.model_type = level_of_detail _check_masks(head, TestConfig.fb_mask_count)
def test_create_blendshapes_and_animation(self): test_utils.new_scene() self._head_cams_and_pins() settings = get_main_settings() headnum = settings.get_last_headnum() head = settings.get_head(headnum) headobj = head.headobj test_utils.create_blendshapes() self.assertTrue(headobj.data.shape_keys is not None) blendshapes = headobj.data.shape_keys.key_blocks self.assertEqual(len(blendshapes), TestConfig.facs_blendshapes_count + 1) # FACS + Basic test_utils.create_example_animation() self.assertTrue(headobj.data.shape_keys and headobj.data.shape_keys.animation_data and \ headobj.data.shape_keys.animation_data.action) test_utils.delete_blendshapes() self.assertTrue(headobj.data.shape_keys is None)
def test_change_camera_params(self): test_utils.new_scene() self._head_cams_and_pins() settings = get_main_settings() headnum = settings.get_last_headnum() head = settings.get_head(headnum) camnum = head.get_last_camnum() camobj = head.get_camera(camnum).camobj new_focal = 35.0 head.focal = new_focal self.assertEqual(new_focal, camobj.data.lens) new_focal = 18.0 head.focal = new_focal self.assertEqual(new_focal, camobj.data.lens) new_sensor_width = 15 head.sensor_width = new_sensor_width # Config.default_sensor_width instead cutom new_sensor_width! self.assertEqual(Config.default_sensor_width, camobj.data.sensor_width) new_sensor_width = 20 head.sensor_width = new_sensor_width self.assertEqual(Config.default_sensor_width, camobj.data.sensor_width)
def test_addon_on(self): test_utils.new_scene() settings = get_main_settings() self.assertEqual(0, len(settings.heads))
def get_last_camnum(headnum): settings = get_main_settings() camnum = len(settings.get_head(headnum).cameras) - 1 return camnum
def select_by_headnum(headnum): settings = get_main_settings() headobj = settings.get_head(headnum).headobj headobj.select_set(state=True) bpy.context.view_layer.objects.active = headobj return headobj
def out_pinmode(): settings = get_main_settings() FBLoader.out_pinmode(settings.current_headnum)
def get_last_headnum(): settings = get_main_settings() headnum = len(settings.heads) - 1 return headnum