diff options
author | CoDEmanX <codemanx@gmx.de> | 2014-02-04 06:05:05 +0400 |
---|---|---|
committer | CoDEmanX <codemanx@gmx.de> | 2014-02-04 06:05:05 +0400 |
commit | 049a5a86edcf78b070b73b141b657825145ae9a1 (patch) | |
tree | 6e5edf67d7974e0ad8beb209c57fd48c456ecfbe /uv_bake_texture_to_vcols.py | |
parent | d9fcbd06018165cc2cfca0673c7c2db44b04a833 (diff) |
Clean-up: Updated bl_info['tracker_url'] to developer.blender.org, some minor other edits
Diffstat (limited to 'uv_bake_texture_to_vcols.py')
-rw-r--r-- | uv_bake_texture_to_vcols.py | 170 |
1 files changed, 91 insertions, 79 deletions
diff --git a/uv_bake_texture_to_vcols.py b/uv_bake_texture_to_vcols.py index 8a9a5aea..3bb84af2 100644 --- a/uv_bake_texture_to_vcols.py +++ b/uv_bake_texture_to_vcols.py @@ -22,24 +22,25 @@ Bake UV-Texture to Vertex Colors Addon Contact: p_boelens@msn.com -Information: http://projects.blender.org/tracker/index.php?func=detail&aid=28211 +Information: https://developer.blender.org/T28211 Contributor(s): Patrick Boelens, CoDEmanX. - + All rights reserved. """ bl_info = { "name": "Bake UV-Texture to Vertex Colors", - "description": "Bakes the colors of the active UV Texture to a Vertex Color layer. ", + "description": "Bakes the colors of the active UV Texture " + "to a Vertex Color layer.", "author": "Patrick Boelens, CoDEmanX", "version": (0, 6), "blender": (2, 63, 0), "location": "3D View > Vertex Paint > Toolshelf > Bake", "warning": "Requires image texture, generated textures aren't supported.", - "wiki_url": "http://wiki.blender.org/index.php?title=Extensions:2.6/" - "Py/Scripts/UV/Bake_Texture_to_Vertex_Colors", - "tracker_url": "http://projects.blender.org/tracker/index.php?func=detail&aid=28211", + "wiki_url": "http://wiki.blender.org/index.php?title=Extensions:2.6/Py/" + "Scripts/UV/Bake_Texture_to_Vertex_Colors", + "tracker_url": "https://developer.blender.org/T28211", "category": "UV"} import bpy @@ -50,23 +51,26 @@ from colorsys import rgb_to_hsv, hsv_to_rgb class UV_OT_bake_texture_to_vcols(bpy.types.Operator): bl_idname = "uv.bake_texture_to_vcols" bl_label = "Bake UV-Texture to Vertex Colors" - bl_description = "Bake active UV-Texture to new Vertex Color layer (requires image texture)" + bl_description = "Bake active UV-Texture to new Vertex Color layer "\ + "(requires image texture)" bl_options = {'REGISTER', 'UNDO'} - - replace_active_layer = BoolProperty(name="Replace layer", - description="Overwrite active Vertex Color layer", - default=True) - - mappingModes = [("CLIP", "Clip", "Don't affect vertices who's UV-coordinates are out of bounds."), - ("REPEAT", "Repeat", "Tile the image so that each vertex is accounted for."), - ("EXTEND", "Extend", "Extends the edges of the image to the UV-coordinates.") - ] - - mappingMode = EnumProperty(items=mappingModes, - default="CLIP", - name="Mapping", - description="The mode to use for baking vertices who's UV-coordinates are out of bounds.") - + + replace_active_layer = BoolProperty( + name="Replace layer", + description="Overwrite active Vertex Color layer", + default=True) + + mappingModes = [ + ("CLIP", "Clip", "Don't affect vertices who's UV-coordinates are out of bounds."), + ("REPEAT", "Repeat", "Tile the image so that each vertex is accounted for."), + ("EXTEND", "Extend", "Extends the edges of the image to the UV-coordinates.")] + + mappingMode = EnumProperty( + items=mappingModes, + default="CLIP", + name="Mapping", + description="The mode to use for baking vertices who's UV-coordinates are out of bounds.") + blendingModes = [("MIX", "Mix", ""), ("ADD", "Add", ""), ("SUBTRACT", "Subtract", ""), @@ -84,19 +88,20 @@ class UV_OT_bake_texture_to_vcols(bpy.types.Operator): ("SOFT_LIGHT", "Soft Light", ""), ("LINEAR_LIGHT", "Linear Light", "") ] - - blendingMode = EnumProperty(items=blendingModes, - default="MULTIPLY", - name="Blend Type", - description="The blending mode to use when baking") - + + blendingMode = EnumProperty( + items=blendingModes, + default="MULTIPLY", + name="Blend Type", + description="The blending mode to use when baking") + mirror_x = BoolProperty(name="Mirror X", description="Mirror the image on the X-axis.") mirror_y = BoolProperty(name="Mirror Y", description="Mirror the image on the Y-axis.") - + @classmethod def poll(self, context): return (context.object and - context.object.type == 'MESH' and + context.object.type == 'MESH' and context.mode != 'EDIT_MESH' and context.object.data.uv_layers.active and context.object.data.uv_textures.active) @@ -108,39 +113,45 @@ class UV_OT_bake_texture_to_vcols(bpy.types.Operator): vertex_colors = obdata.vertex_colors.active else: vertex_colors = obdata.vertex_colors.new(name="Baked UV texture") - + if not vertex_colors: + # Can't add more than 17 VCol layers - self.report({'ERROR'}, "Couldn't add another Vertex Color layer,\n" - "Please remove an existing layer or replace active.") + self.report({'ERROR'}, + "Couldn't add another Vertex Color layer,\n" + "Please remove an existing layer or replace active.") + return {'CANCELLED'} - + obdata.vertex_colors.active = vertex_colors - + uv_images = {} for uv_tex in obdata.uv_textures.active.data: - if uv_tex.image and uv_tex.image.name not in uv_images and uv_tex.image.pixels: - - uv_images[uv_tex.image.name] = (uv_tex.image.size[0], - uv_tex.image.size[1], - uv_tex.image.pixels[:] - # Accessing pixels directly is far too slow. - # Copied to new array for massive performance-gain. - ) - + if (uv_tex.image and + uv_tex.image.name not in uv_images and + uv_tex.image.pixels): + + uv_images[uv_tex.image.name] = ( + uv_tex.image.size[0], + uv_tex.image.size[1], + uv_tex.image.pixels[:] + # Accessing pixels directly is far too slow. + # Copied to new array for massive performance-gain. + ) + for p in obdata.polygons: img = obdata.uv_textures.active.data[p.index].image if not img: continue - + image_size_x, image_size_y, uv_pixels = uv_images[img.name] - + for loop in p.loop_indices: - + co = obdata.uv_layers.active.data[loop].uv x_co = round(co[0] * (image_size_x - 1)) y_co = round(co[1] * (image_size_y - 1)) - + if x_co < 0 or x_co >= image_size_x or y_co < 0 or y_co >= image_size_y: if self.mappingMode == 'CLIP': continue @@ -158,47 +169,47 @@ class UV_OT_bake_texture_to_vcols(bpy.types.Operator): y_co = image_size_y - 1 if y_co < 0: y_co = 0 - + if self.mirror_x: x_co = image_size_x -1 - x_co - + if self.mirror_y: y_co = image_size_y -1 - y_co - + col_out = vertex_colors.data[loop].color - + pixelNumber = (image_size_x * y_co) + x_co r = uv_pixels[pixelNumber*4] g = uv_pixels[pixelNumber*4 + 1] b = uv_pixels[pixelNumber*4 + 2] a = uv_pixels[pixelNumber*4 + 3] - + col_in = r, g, b # texture-color col_result = [r,g,b] # existing / 'base' color - + if self.blendingMode == 'MIX': col_result = col_in - + elif self.blendingMode == 'ADD': col_result[0] = col_in[0] + col_out[0] col_result[1] = col_in[1] + col_out[1] col_result[2] = col_in[2] + col_out[2] - + elif self.blendingMode == 'SUBTRACT': col_result[0] = col_in[0] - col_out[0] col_result[1] = col_in[1] - col_out[1] col_result[2] = col_in[2] - col_out[2] - + elif self.blendingMode == 'MULTIPLY': col_result[0] = col_in[0] * col_out[0] col_result[1] = col_in[1] * col_out[1] col_result[2] = col_in[2] * col_out[2] - + elif self.blendingMode == 'SCREEN': col_result[0] = 1 - (1.0 - col_in[0]) * (1.0 - col_out[0]) col_result[1] = 1 - (1.0 - col_in[1]) * (1.0 - col_out[1]) col_result[2] = 1 - (1.0 - col_in[2]) * (1.0 - col_out[2]) - + elif self.blendingMode == 'OVERLAY': if col_out[0] < 0.5: col_result[0] = col_out[0] * (2.0 * col_in[0]) @@ -212,12 +223,12 @@ class UV_OT_bake_texture_to_vcols(bpy.types.Operator): col_result[2] = col_out[2] * (2.0 * col_in[2]) else: col_result[2] = 1.0 - (2.0 * (1.0 - col_in[2])) * (1.0 - col_out[2]) - + elif self.blendingMode == 'DIFFERENCE': col_result[0] = fabs(col_in[0] - col_out[0]) col_result[1] = fabs(col_in[1] - col_out[1]) col_result[2] = fabs(col_in[2] - col_out[2]) - + elif self.blendingMode == 'DIVIDE': if(col_in[0] != 0.0): col_result[0] = col_out[0] / col_in[0] @@ -225,7 +236,7 @@ class UV_OT_bake_texture_to_vcols(bpy.types.Operator): col_result[0] = col_out[1] / col_in[1] if(col_in[2] != 0.0): col_result[2] = col_out[2] / col_in[2] - + elif self.blendingMode == 'DARKEN': if col_in[0] < col_out[0]: col_result[0] = col_in[0] @@ -239,8 +250,8 @@ class UV_OT_bake_texture_to_vcols(bpy.types.Operator): col_result[2] = col_in[2] else: col_result[2] = col_out[2] - - + + elif self.blendingMode == 'LIGHTEN': if col_in[0] > col_out[0]: col_result[0] = col_in[0] @@ -254,42 +265,42 @@ class UV_OT_bake_texture_to_vcols(bpy.types.Operator): col_result[2] = col_in[2] else: col_result[2] = col_out[2] - + elif self.blendingMode == 'HUE': hsv_in = rgb_to_hsv(col_in[0], col_in[1], col_in[2]) hsv_out = rgb_to_hsv(col_out[0], col_out[1], col_out[2]) hue = hsv_in[0] col_result = hsv_to_rgb(hue, hsv_out[1], hsv_out[2]) - + elif self.blendingMode == 'SATURATION': hsv_in = rgb_to_hsv(col_in[0], col_in[1], col_in[2]) hsv_out = rgb_to_hsv(col_out[0], col_out[1], col_out[2]) sat = hsv_in[1] col_result = hsv_to_rgb(hsv_out[0], sat, hsv_out[2]) - + elif self.blendingMode == 'VALUE': hsv_in = rgb_to_hsv(col_in[0], col_in[1], col_in[2]) hsv_out = rgb_to_hsv(col_out[0], col_out[1], col_out[2]) val = hsv_in[2] col_result = hsv_to_rgb(hsv_out[0], hsv_out[1], val) - + elif self.blendingMode == 'COLOR': hsv_in = rgb_to_hsv(col_in[0], col_in[1], col_in[2]) hsv_out = rgb_to_hsv(col_out[0], col_out[1], col_out[2]) hue = hsv_in[0] sat = hsv_in[1] col_result = hsv_to_rgb(hue, sat, hsv_out[2]) - + elif self.blendingMode == 'SOFT_LIGHT': scr = 1 - (1.0 - col_in[0]) * (1.0 - col_out[0]) scg = 1 - (1.0 - col_in[1]) * (1.0 - col_out[1]) scb = 1 - (1.0 - col_in[2]) * (1.0 - col_out[2]) - + col_result[0] = (1.0 - col_out[0]) * (col_in[0] * col_out[0]) + (col_out[0] * scr) col_result[1] = (1.0 - col_out[1]) * (col_in[1] * col_out[1]) + (col_out[1] * scg) col_result[2] = (1.0 - col_out[2]) * (col_in[2] * col_out[2]) + (col_out[2] * scb) - - + + elif self.blendingMode == 'LINEAR_LIGHT': if col_in[0] > 0.5: col_result[0] = col_out[0] + 2.0 * (col_in[0] - 0.5) @@ -303,16 +314,16 @@ class UV_OT_bake_texture_to_vcols(bpy.types.Operator): col_result[2] = col_out[2] + 2.0 * (col_in[2] - 0.5) else: col_result[2] = col_out[2] + 2.0 * (col_in[2] - 1.0) - + # Add alpha color a_inverted = 1 - a alpha_color = context.scene.uv_bake_alpha_color col_result = (col_result[0] * a + alpha_color[0] * a_inverted, col_result[1] * a + alpha_color[1] * a_inverted, col_result[2] * a + alpha_color[2] * a_inverted) - + vertex_colors.data[loop].color = col_result - + return {'FINISHED'} class VIEW3D_PT_tools_uv_bake_texture_to_vcols(bpy.types.Panel): @@ -320,11 +331,11 @@ class VIEW3D_PT_tools_uv_bake_texture_to_vcols(bpy.types.Panel): bl_space_type = "VIEW_3D" bl_region_type = "TOOLS" bl_options = {'DEFAULT_CLOSED'} - + @classmethod def poll(self, context): return(context.mode == 'PAINT_VERTEX') - + def draw(self, context): layout = self.layout col = layout.column() @@ -334,7 +345,8 @@ class VIEW3D_PT_tools_uv_bake_texture_to_vcols(bpy.types.Panel): def register(): bpy.utils.register_module(__name__) - bpy.types.Scene.uv_bake_alpha_color = FloatVectorProperty(name="Alpha Color", + bpy.types.Scene.uv_bake_alpha_color = FloatVectorProperty( + name="Alpha Color", description="Color to be used for transparency", subtype='COLOR', min=0.0, @@ -345,4 +357,4 @@ def unregister(): del bpy.types.Scene.uv_bake_alpha_color if __name__ == "__main__": - register()
\ No newline at end of file + register() |