From 33dbd8394671cb5ded06e6cbdbc47b4f16d417d3 Mon Sep 17 00:00:00 2001 From: Michael Vigovsky Date: Mon, 1 Feb 2021 17:51:51 +0200 Subject: [PATCH 1/2] Optimize calculate_disp_pixels for faster displacement calculation --- materialengine.py | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/materialengine.py b/materialengine.py index 9c96b72b..c9c30867 100644 --- a/materialengine.py +++ b/materialengine.py @@ -155,24 +155,22 @@ def calculate_disp_pixels(blender_image, age_factor, tone_factor, mass_factor): logger.info('start: calculate_disp_pixels %s', blender_image.name) tone_f = tone_factor if tone_factor > 0.0 else 0.0 - ajustments = np.array([0.0, 0.5, 0.5, 0.5], dtype='float32') - factors = np.fmax(np.array([1, age_factor, tone_f, (1.0 - tone_f) * mass_factor], dtype='float32'), 0.0) - np_image = np.array(blender_image.pixels, dtype='float32').reshape(-1, 4) + adjustments = np.array([0.0, 0.5, 0.5, 0.5], dtype=np.float32) + factors = np.fmax(np.array([1, age_factor, tone_f, (1.0 - tone_f) * mass_factor], dtype=np.float32), 0.0) + np_image = np.empty(len(blender_image.pixels), dtype=np.float32) + blender_image.pixels.foreach_get(np_image) + np_image = np_image.reshape(-1, 4) # add_result = r + age_f * (g - 0.5) + tone_f * (b - 0.5) + mass_f * (a - 0.5) - add_result = np.sum((np_image - ajustments) * factors, axis=1) - result_image = np.insert(np.repeat(np.fmin(add_result, 1.0), 3).reshape(-1, 3), 3, 1.0, axis=1) + np_image -= adjustments + np_image *= factors + add_result = np.sum(np_image, axis=1) + np.fmin(add_result, 1.0, add_result) + np_image[:,0] = add_result + np_image[:,1] = add_result + np_image[:,2] = add_result + np_image[:,3] = 1 logger.info('finish: calculate_disp_pixels %s', blender_image.name) - return result_image.flatten() - - @staticmethod - def multiply_images(image1, image2, result_name, blending_factor=0.5): - logger.info('multiply_images %s', result_name) - if images_scale(image1, image2): - np_img1, np_img2 = np.array(image1.pixels, dtype='float32'), np.array(image2.pixels, dtype='float32') - - result_img = new_image(result_name, image2.size) - result_img.pixels = np_img1 * np_img2 * blending_factor + (np_img1 * (1.0 - blending_factor)) - logger.info('finish: multiply_images %s', result_name) + return np_image.reshape(-1) # Link Textures to Nodes From 7e592ceff776a722efe6de6f78cf2fbfd71154d7 Mon Sep 17 00:00:00 2001 From: Michael Vigovsky Date: Mon, 1 Feb 2021 18:19:48 +0200 Subject: [PATCH 2/2] Use also foreach_set for setting image pixels --- materialengine.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/materialengine.py b/materialengine.py index c9c30867..7512c614 100644 --- a/materialengine.py +++ b/materialengine.py @@ -307,7 +307,8 @@ def calculate_displacement_texture(self, age_factor, tone_factor, mass_factor): return if images_scale(disp_data_image, disp_img): - disp_img.pixels = self.calculate_disp_pixels(disp_data_image, age_factor, tone_factor, mass_factor) + new_pixels = self.calculate_disp_pixels(disp_data_image, age_factor, tone_factor, mass_factor) + disp_img.pixels.foreach_set(new_pixels) disp_tex.image = disp_img logger.info("Displacement calculated in %s seconds", time.time()-time1) else: