78 lines
3.1 KiB
Python
78 lines
3.1 KiB
Python
import bpy
|
|
from .constants import image_name
|
|
import numpy as np
|
|
from .libs.PIL import Image
|
|
import mathutils
|
|
|
|
def apply_color():
|
|
context = bpy.context
|
|
|
|
paint_buffer = bpy.data.images.get(image_name)
|
|
normal_buffer = context.scene.normal_texture_settings.texture
|
|
custom_collection = context.scene.texture_collection_settings
|
|
|
|
normal_color = context.scene.normal_color_global
|
|
|
|
returnValue = -1
|
|
|
|
if paint_buffer:
|
|
|
|
# apply normal color
|
|
if normal_buffer and normal_color != mathutils.Vector((1.0, 1.0, 1.0)):
|
|
if paint_buffer.size[0] == normal_buffer.size[0] and paint_buffer.size[1] == normal_buffer.size[1]:
|
|
# create arrays
|
|
paint_mask_pixels = np.array(paint_buffer.pixels[:], dtype=np.float32).reshape(-1, 4)[:, 0]
|
|
target_pixels = np.array(normal_buffer.pixels[:], dtype=np.float32).reshape(-1, 4)
|
|
new_pixels = np.tile(np.array([*normal_color, 1.0], dtype=np.float32), (paint_buffer.size[0] * paint_buffer.size[1], 1))
|
|
|
|
print("image lengths: ", len(paint_mask_pixels), len(target_pixels), len(new_pixels))
|
|
print("image shapes: ", paint_mask_pixels.shape, target_pixels.shape, new_pixels.shape)
|
|
print("image arrays: ", paint_mask_pixels, "next", target_pixels, "next", new_pixels)
|
|
|
|
# Convert arrays to PIL Images
|
|
# paint_mask_image = Image.fromarray(paint_mask_pixels[:, 3], mode='F') # Use alpha channel for mask
|
|
paint_mask_image = Image.fromarray(paint_mask_pixels, mode='F') # Use alpha channel for mask
|
|
target_image = Image.fromarray(target_pixels, mode='RGBA')
|
|
new_image = Image.fromarray(new_pixels, mode='RGBA')
|
|
|
|
paint_mask_image.show()
|
|
target_image.show()
|
|
new_image.show()
|
|
|
|
# Blend buffers
|
|
blended_image = Image.composite(target_image, new_image, paint_mask_image)
|
|
|
|
# Convert blended image back to numpy array and normalize
|
|
blended_pixels = np.asarray(blended_image).astype(np.float32)
|
|
|
|
# Save texture
|
|
normal_buffer.pixels[:] = blended_pixels.flatten()
|
|
normal_buffer.update()
|
|
|
|
print("Color applied")
|
|
returnValue = 0
|
|
|
|
else:
|
|
print("Texture sizes don't match")
|
|
returnValue = -1
|
|
else:
|
|
print("no normal buffer selected")
|
|
returnValue = -1
|
|
|
|
# reset paint buffer
|
|
reset_pixels = np.array(paint_buffer.pixels[:], dtype=np.float32).reshape(-1, 4)
|
|
reset_pixels[:] = np.array((0, 0, 0, 1), dtype=np.float32)
|
|
paint_buffer.pixels[:] = reset_pixels.flatten()
|
|
paint_buffer.update()
|
|
|
|
else:
|
|
print("Texture 'vPainter_buffer' not found")
|
|
returnValue = -1
|
|
|
|
return returnValue
|
|
|
|
def register():
|
|
bpy.utils.register_class(VPAINTER_OT_apply_color)
|
|
|
|
def unregister():
|
|
bpy.utils.unregister_class(VPAINTER_OT_apply_color) |