From b50d877f94cf1784876c33b01c85e45b236348a3 Mon Sep 17 00:00:00 2001 From: YimingWu Date: Sun, 30 Jul 2023 22:06:48 +0800 Subject: [PATCH] export_uv_png: Use grayscale FBO for drawing. Since you don't really need any color info when exporting UV layouts, changed the FBO to using grayscale to save system resource especially for exporting large images. --- io_mesh_uv_layout/export_uv_png.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/io_mesh_uv_layout/export_uv_png.py b/io_mesh_uv_layout/export_uv_png.py index 784337be4..6ed281025 100644 --- a/io_mesh_uv_layout/export_uv_png.py +++ b/io_mesh_uv_layout/export_uv_png.py @@ -16,7 +16,7 @@ except ImportError: def export(filepath, face_data, colors, width, height, opacity): - offscreen = gpu.types.GPUOffScreen(width, height) + offscreen = gpu.types.GPUOffScreen(width, height, format="R8") offscreen.bind() try: @@ -24,8 +24,8 @@ def export(filepath, face_data, colors, width, height, opacity): fb.clear(color=(0.0, 0.0, 0.0, 0.0)) draw_image(face_data, opacity) - pixel_data = fb.read_color(0, 0, width, height, 4, 0, 'UBYTE') - pixel_data.dimensions = width * height * 4 + pixel_data = fb.read_color(0, 0, width, height, 1, 0, 'UBYTE') + pixel_data.dimensions = width * height * 1 save_pixels(filepath, pixel_data, width, height) finally: offscreen.unbind() @@ -97,7 +97,7 @@ def draw_lines(face_data): shader = gpu.shader.from_builtin('POLYLINE_UNIFORM_COLOR') shader.uniform_float("viewportSize", gpu.state.viewport_get()[2:]) shader.uniform_float("lineWidth", 1.0) - shader.uniform_float("color", (0.0, 0.0, 0.0, 1.0)) + shader.uniform_float("color", (1.0, 1.0, 1.0, 1.0)) batch = batch_for_shader(shader, 'LINES', {"pos": coords}) batch.draw(shader) @@ -105,15 +105,18 @@ def draw_lines(face_data): def save_pixels(filepath, pixel_data, width, height): if oiio: - spec = oiio.ImageSpec(width, height, 4, "uint8") + spec = oiio.ImageSpec(width, height, 1, "uint8") image = oiio.ImageOutput.create(filepath) image.open(filepath, spec) image.write_image(pixel_data) image.close() return - image = bpy.data.images.new("temp", width, height, alpha=True) + image = bpy.data.images.new("temp", width, height, alpha=False) image.filepath = filepath - image.pixels = [v / 255 for v in pixel_data] + for i in range(0,width*height): + image.pixels[i * 3 + 0] = pixel_data[i] + image.pixels[i * 3 + 1] = pixel_data[i] + image.pixels[i * 3 + 2] = pixel_data[i] image.save() bpy.data.images.remove(image) -- 2.30.2