@@ -198,23 +198,24 @@ def draw_depth_map(width, height, context, matrix, projection_matrix):
198198 offscreen .free ()
199199 return depth
200200
201- def bake (context , mesh , width , height , src , src_uv , dest_uv ):
201+ def bake (context , mesh , width , height , src , projection_uvs , uvs ):
202202 def bake_shader ():
203203 vert_out = gpu .types .GPUStageInterfaceInfo ("my_interface" )
204204 vert_out .smooth ('VEC2' , "uvInterp" )
205205
206206 shader_info = gpu .types .GPUShaderCreateInfo ()
207+ shader_info .push_constant ('MAT4' , 'ModelViewProjectionMatrix' )
207208 shader_info .sampler (0 , 'FLOAT_2D' , "image" )
208- shader_info .vertex_in (0 , 'VEC2' , "src_uv " )
209- shader_info .vertex_in (1 , 'VEC2' , "dest_uv " )
209+ shader_info .vertex_in (0 , 'VEC2' , "pos " )
210+ shader_info .vertex_in (1 , 'VEC2' , "uv " )
210211 shader_info .vertex_out (vert_out )
211212 shader_info .fragment_out (0 , 'VEC4' , "fragColor" )
212213
213214 shader_info .vertex_source ("""
214215void main()
215216{
216- gl_Position = vec4(dest_uv * 2 - 1, 0.0, 1.0);
217- uvInterp = src_uv ;
217+ gl_Position = ModelViewProjectionMatrix * vec4(pos * 2 - 1, 0.0, 1.0);
218+ uvInterp = uv ;
218219}
219220""" )
220221
@@ -244,7 +245,7 @@ def bake_shader():
244245 shader = bake_shader ()
245246 batch = batch_for_shader (
246247 shader , 'TRIS' ,
247- {"src_uv " : src_uv , "dest_uv " : dest_uv },
248+ {"pos " : uvs , "uv " : projection_uvs },
248249 indices = vertices ,
249250 )
250251 shader .uniform_sampler ("image" , texture )
@@ -325,7 +326,7 @@ def draw_mask_map(width, height, context, mesh, matrix, projection_matrix, thres
325326
326327 def mask_shader ():
327328 vert_out = gpu .types .GPUStageInterfaceInfo ("my_interface" )
328- vert_out .smooth ('VEC4 ' , "color " )
329+ vert_out .smooth ('VEC3 ' , "normal " )
329330
330331 shader_info = gpu .types .GPUShaderCreateInfo ()
331332 shader_info .push_constant ('MAT4' , 'ModelViewProjectionMatrix' )
@@ -341,23 +342,23 @@ def mask_shader():
341342void main()
342343{
343344 gl_Position = ModelViewProjectionMatrix * vec4(pos, 1.0);
344- color = dot(NormalMatrix * nor, CameraNormal) > Threshold ? vec4(1, 1, 1, 1) : vec4(0, 0, 0, 1) ;
345+ normal = nor;
345346}
346347""" )
347348
348349
349350 shader_info .fragment_source ("""
350351void main()
351352{
352- fragColor = color ;
353+ fragColor = dot(NormalMatrix * normal, CameraNormal) > Threshold ? vec4(1, 1, 1, 1) : vec4(0, 0, 0, 1) ;
353354}
354355""" )
355356
356357 return gpu .shader .create_from_info (shader_info )
357358
358359 with offscreen .bind ():
359360 fb = gpu .state .active_framebuffer_get ()
360- fb .clear (color = (0.0 , 0.0 , 0.0 , 1 .0 ))
361+ fb .clear (color = (0.0 , 0.0 , 0.0 , 0 .0 ))
361362 gpu .state .depth_test_set ('LESS_EQUAL' )
362363 gpu .state .depth_mask_set (True )
363364 with gpu .matrix .push_pop ():
@@ -444,6 +445,13 @@ def masked_init_image(self, context, camera, texture, mesh, split_mesh, uvs, thr
444445 bake_uvs = [(uv [0 ] * 2 - 1 , uv [1 ] * 2 - 1 , 0 ) for uv in uvs ]
445446 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 )
446447
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+
447455 return color , mask , baked_mask
448456
449457 def execute (self , context ):
@@ -457,22 +465,31 @@ def execute(self, context):
457465 mesh .verts .index_update ()
458466
459467 split_mesh = mesh .copy ()
468+ split_mesh .transform (context .object .matrix_world )
460469 split_mesh .select_mode = {'FACE' }
461470 bmesh .ops .split_edges (split_mesh , edges = split_mesh .edges )
462471
463- mesh .faces .ensure_lookup_table ()
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 )
464481
465482 uv_layer = split_mesh .loops .layers .uv .active
466- projection_uv_layer , _ = ProjectDreamTexture .get_uv_layer (split_mesh )
467483 uvs = np .empty ((len (split_mesh .verts ), 2 ), dtype = np .float32 )
468484 projection_uvs = np .empty ((len (split_mesh .verts ), 2 ), dtype = np .float32 )
469485 for face in split_mesh .faces :
470486 for loop in face .loops :
471- projection_uvs [loop .vert .index ] = loop [ projection_uv_layer ]. uv
487+ projection_uvs [loop .vert .index ] = vert_to_uv ( split_mesh . verts [ loop . vert . index ])
472488 uvs [loop .vert .index ] = loop [uv_layer ].uv
473489
474490 gen = Generator .shared ()
475491
492+ step_i = 0
476493 def step (camera , inpaint ):
477494 depth = np .flipud (
478495 draw_depth_map (512 , 512 , context , camera .matrix_world .inverted (), context .space_data .region_3d .window_matrix )
@@ -495,9 +512,10 @@ def step(camera, inpaint):
495512 ).result ()
496513 inpaint_result .pixels [:] = res [- 1 ].images [0 ].ravel ()
497514 inpaint_result .update ()
498- mask_result .pixels [:] = color .ravel ()
515+ mask_result .pixels [:] = baked_mask .ravel ()
499516 mask_result .update ()
500- color = bake (context , split_mesh , 512 , 512 , res [- 1 ].images [0 ].ravel (), projection_uvs , uvs )
517+ color = bake (context , split_mesh , 512 , 512 , res [- 1 ].images [0 ].ravel (), projection_uvs , uvs ).ravel ()
518+ baked_mask = baked_mask .ravel ()
501519 color = (np .array (texture .pixels , dtype = np .float32 ) * (1 - baked_mask )) + (color * baked_mask )
502520 else :
503521 res = gen .control_net (
@@ -511,9 +529,13 @@ def step(camera, inpaint):
511529 generation_result .pixels [:] = res [- 1 ].images [0 ].ravel ()
512530 generation_result .update ()
513531 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)
514533
515534 texture .pixels [:] = color .ravel ()
516535 texture .update ()
536+ nonlocal step_i
537+ bpy .data .images .new (name = f"Step { step_i } " , width = 512 , height = 512 ).pixels [:] = color .ravel ()
538+ step_i += 1
517539
518540 started = False
519541 for camera in [ob for ob in bpy .context .scene .objects if ob .type == 'CAMERA' and not ob .hide_viewport ]:
0 commit comments