@@ -439,19 +439,12 @@ def draw_color(self, context):
439439 context .scene .render .filepath , context .scene .render .image_settings .file_format = render_filepath , file_format
440440 return init_img_path
441441
442- def masked_init_image (self , context , camera , texture , mesh , split_mesh , uvs , threshold = 0.75 ):
442+ def masked_init_image (self , context , camera , texture , mesh , split_mesh , uvs , threshold = 0.5 ):
443443 mask = draw_mask_map (512 , 512 , context , mesh , camera .matrix_world .inverted (), context .space_data .region_3d .window_matrix , threshold , bake = None )
444444 color = draw_color (512 , 512 , context , split_mesh , camera .matrix_world .inverted (), context .space_data .region_3d .window_matrix , texture , uvs )
445445 bake_uvs = [(uv [0 ] * 2 - 1 , uv [1 ] * 2 - 1 , 0 ) for uv in uvs ]
446446 baked_mask = draw_mask_map (512 , 512 , context , split_mesh , camera .matrix_world .inverted (), context .space_data .region_3d .window_matrix , threshold , bake = bake_uvs )
447447
448- kernel = np .array ([0 , 0.1 , 0.2 , 1.0 , 0.2 , 0.1 , 0 ])
449- mask = np .apply_along_axis (lambda x : np .convolve (x , kernel , mode = 'same' ), 0 , mask )
450- mask = np .apply_along_axis (lambda x : np .convolve (x , kernel , mode = 'same' ), 1 , mask )
451- kernel = np .array ([0.1 , 0.1 , 0.2 , 0.3 , 0.2 , 0.1 , 0.1 ])
452- baked_mask = np .apply_along_axis (lambda x : np .convolve (x , kernel , mode = 'same' ), 0 , baked_mask )
453- baked_mask = np .apply_along_axis (lambda x : np .convolve (x , kernel , mode = 'same' ), 1 , baked_mask )
454-
455448 return color , mask , baked_mask
456449
457450 def execute (self , context ):
@@ -460,37 +453,51 @@ def execute(self, context):
460453 inpaint_result = bpy .data .images ['inpaint_result' ]
461454 mask_result = bpy .data .images ['mask' ]
462455
463- mesh = bmesh .from_edit_mesh (context .object .data )
464- mesh .verts .ensure_lookup_table ()
465- mesh .verts .index_update ()
466-
467- split_mesh = mesh .copy ()
468- split_mesh .transform (context .object .matrix_world )
469- split_mesh .select_mode = {'FACE' }
470- bmesh .ops .split_edges (split_mesh , edges = split_mesh .edges )
471-
472- split_mesh .faces .ensure_lookup_table ()
473- split_mesh .verts .ensure_lookup_table ()
474- split_mesh .verts .index_update ()
475-
476- def vert_to_uv (v ):
477- screen_space = view3d_utils .location_3d_to_region_2d (context .region , context .space_data .region_3d , v .co )
478- if screen_space is None :
479- return None
480- return (screen_space [0 ] / context .region .width , screen_space [1 ] / context .region .height )
481-
482- uv_layer = split_mesh .loops .layers .uv .active
483- uvs = np .empty ((len (split_mesh .verts ), 2 ), dtype = np .float32 )
484- projection_uvs = np .empty ((len (split_mesh .verts ), 2 ), dtype = np .float32 )
485- for face in split_mesh .faces :
486- for loop in face .loops :
487- projection_uvs [loop .vert .index ] = vert_to_uv (split_mesh .verts [loop .vert .index ])
488- uvs [loop .vert .index ] = loop [uv_layer ].uv
489-
490456 gen = Generator .shared ()
491457
492458 step_i = 0
493459 def step (camera , inpaint ):
460+ def location_3d_to_region_2d (coord ):
461+ perspective_matrix = context .space_data .region_3d .window_matrix @ camera .matrix_world .inverted ()
462+ prj = perspective_matrix @ mathutils .Vector ((coord [0 ], coord [1 ], coord [2 ], 1.0 ))
463+ if prj .w > 0.0 :
464+ width_half = context .region .width / 2.0
465+ height_half = context .region .height / 2.0
466+
467+ return mathutils .Vector ((
468+ width_half + width_half * (prj .x / prj .w ),
469+ height_half + height_half * (prj .y / prj .w ),
470+ ))
471+ else :
472+ return None
473+
474+ mesh = bmesh .from_edit_mesh (context .object .data )
475+ mesh .verts .ensure_lookup_table ()
476+ mesh .verts .index_update ()
477+
478+ split_mesh = mesh .copy ()
479+ split_mesh .transform (context .object .matrix_world )
480+ split_mesh .select_mode = {'FACE' }
481+ bmesh .ops .split_edges (split_mesh , edges = split_mesh .edges )
482+
483+ split_mesh .faces .ensure_lookup_table ()
484+ split_mesh .verts .ensure_lookup_table ()
485+ split_mesh .verts .index_update ()
486+
487+ def vert_to_uv (v ):
488+ screen_space = location_3d_to_region_2d (v .co )
489+ if screen_space is None :
490+ return None
491+ return (screen_space [0 ] / context .region .width , screen_space [1 ] / context .region .height )
492+
493+ uv_layer = split_mesh .loops .layers .uv .active
494+ uvs = np .empty ((len (split_mesh .verts ), 2 ), dtype = np .float32 )
495+ projection_uvs = np .empty ((len (split_mesh .verts ), 2 ), dtype = np .float32 )
496+ for face in split_mesh .faces :
497+ for loop in face .loops :
498+ projection_uvs [loop .vert .index ] = vert_to_uv (split_mesh .verts [loop .vert .index ])
499+ uvs [loop .vert .index ] = loop [uv_layer ].uv
500+
494501 depth = np .flipud (
495502 draw_depth_map (512 , 512 , context , camera .matrix_world .inverted (), context .space_data .region_3d .window_matrix )
496503 )
@@ -512,7 +519,7 @@ def step(camera, inpaint):
512519 ).result ()
513520 inpaint_result .pixels [:] = res [- 1 ].images [0 ].ravel ()
514521 inpaint_result .update ()
515- mask_result .pixels [:] = baked_mask .ravel ()
522+ mask_result .pixels [:] = mask .ravel ()
516523 mask_result .update ()
517524 color = bake (context , split_mesh , 512 , 512 , res [- 1 ].images [0 ].ravel (), projection_uvs , uvs ).ravel ()
518525 baked_mask = baked_mask .ravel ()
@@ -529,7 +536,6 @@ def step(camera, inpaint):
529536 generation_result .pixels [:] = res [- 1 ].images [0 ].ravel ()
530537 generation_result .update ()
531538 color = bake (context , split_mesh , 512 , 512 , res [- 1 ].images [0 ].ravel (), projection_uvs , uvs )
532- # color = bake(context, split_mesh, 512, 512, np.array(generation_result.pixels, dtype=np.float32), projection_uvs, uvs)
533539
534540 texture .pixels [:] = color .ravel ()
535541 texture .update ()
0 commit comments