Skip to content

Commit 40df72a

Browse files
committed
Use cameras for projection
1 parent 1544714 commit 40df72a

File tree

1 file changed

+37
-15
lines changed

1 file changed

+37
-15
lines changed

operators/project.py

Lines changed: 37 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -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("""
214215
void 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():
341342
void 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("""
350351
void 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

Comments
 (0)