Skip to content

Commit 7884149

Browse files
committed
Fixed projection
1 parent 40df72a commit 7884149

File tree

1 file changed

+43
-37
lines changed

1 file changed

+43
-37
lines changed

operators/project.py

Lines changed: 43 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)