[Bf-extensions-cvs] SVN commit: /data/svn/bf-extensions [3729] contrib/py/scripts/addons/ uv_bake_texture_to_vcols.py: UV Texture to VCols addon: renamed file and class names, minor code cleanup

Sebastian Nell codemanx at gmx.de
Tue Sep 11 22:54:03 CEST 2012


Revision: 3729
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-extensions&revision=3729
Author:   codemanx
Date:     2012-09-11 20:54:03 +0000 (Tue, 11 Sep 2012)
Log Message:
-----------
UV Texture to VCols addon: renamed file and class names, minor code cleanup

Added Paths:
-----------
    contrib/py/scripts/addons/uv_bake_texture_to_vcols.py

Copied: contrib/py/scripts/addons/uv_bake_texture_to_vcols.py (from rev 3725, contrib/py/scripts/addons/bake_uv_texture_to_vertex_colors.py)
===================================================================
--- contrib/py/scripts/addons/uv_bake_texture_to_vcols.py	                        (rev 0)
+++ contrib/py/scripts/addons/uv_bake_texture_to_vcols.py	2012-09-11 20:54:03 UTC (rev 3729)
@@ -0,0 +1,312 @@
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
+#  This program is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU General Public License
+#  as published by the Free Software Foundation; either version 2
+#  of the License, or (at your option) any later version.
+#
+#  This program is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#  GNU General Public License for more details.
+#
+#  You should have received a copy of the GNU General Public License
+#  along with this program; if not, write to the Free Software Foundation,
+#  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+"""
+Bake UV-Texture to Vertex Colors Addon
+
+Contact:        p_boelens at msn.com
+Information:    http://projects.blender.org/tracker/index.php?func=detail&aid=28211
+
+Contributor(s): CoDEmanX.
+    
+All rights reserved.
+"""
+
+bl_info = {
+    "name": "Bake UV-Texture to Vertex Colors",
+    "description": "Bakes the colors of the active UV Texture to Vertex Colors. "
+                   "Uses the active object and creates new VCol layer.",
+    "author": "Patrick Boelens, CoDEmanX",
+    "version": (0, 4),
+    "blender": (2, 6, 3),
+    "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",
+    "category": "UV"}
+
+import bpy
+from bpy.props import BoolProperty, EnumProperty
+from math import fabs
+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_options = {'REGISTER', 'UNDO'}
+       
+    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", ""),
+                     ("MULTIPLY", "Multiply", ""),
+                     ("SCREEN", "Screen", ""),
+                     ("OVERLAY", "Overlay", ""),
+                     ("DIFFERENCE", "Difference", ""),
+                     ("DIVIDE", "Divide", ""),
+                     ("DARKEN", "Darken", ""),
+                     ("LIGHTEN", "Lighten", ""),
+                     ("HUE", "Hue", ""),
+                     ("SATURATION", "Saturation", ""),
+                     ("VALUE", "Value", ""),
+                     ("COLOR", "Color", ""),
+                     ("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")
+    
+    
+    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.mode != 'EDIT_MESH' and
+                context.object.data.uv_textures.active.data[0].image)
+
+    def execute(self, context):
+        obdata = context.object.data
+        loop_count = len(obdata.loops)
+        uv_tex = obdata.uv_textures.active.data[0]
+        image_size_x = uv_tex.image.size[0]
+        image_size_y = uv_tex.image.size[1]
+        
+        # Accessing this directly is far too slow. Copied to new array for massive performance-gain.
+        uv_pixels = uv_tex.image.pixels[:]
+            
+        if uv_tex.image.name not in obdata.vertex_colors:
+            obdata.vertex_colors.new(name=uv_tex.image.name)
+            
+        vertex_colors = obdata.vertex_colors[uv_tex.image.name]
+        obdata.vertex_colors.active = vertex_colors
+        
+        for i in range(loop_count):
+            co = obdata.uv_layers.active.data[i].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
+
+                elif self.mappingMode == 'REPEAT':
+                    while x_co > image_size_x - 1:
+                        x_co -= image_size_x
+                    while x_co < 0:
+                        x_co += image_size_x
+                    while y_co > image_size_y - 1:
+                        y_co -= image_size_y
+                    while y_co < 0:
+                        y_co += image_size_y
+                
+                elif self.mappingMode == 'EXTEND':
+                    if x_co > image_size_x - 1:
+                        x_co = image_size_x - 1
+                    if x_co < 0:
+                        x_co = 0
+                    if y_co > image_size_y - 1:
+                        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[i].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]
+            col_in = r, g, b
+            col_result = [r,g,b] #col_in = texture-color, col_out = 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])
+                else:
+                    col_result[0] = 1.0 - (2.0 * (1.0 - col_in[0])) * (1.0 - col_out[0])
+                if col_out[1] < 0.5:
+                    col_result[1] = col_out[1] * (2.0 * col_in[1])
+                else:
+                    col_result[1] = 1.0 - (2.0 * (1.0 - col_in[1])) * (1.0 - col_out[1])
+                if col_out[2] < 0.5:
+                    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]
+                if(col_in[1] != 0.0):
+                    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]
+                else:
+                    col_result[0] = col_out[0]
+                if col_in[1] < col_out[1]:
+                    col_result[1] = col_in[1]
+                else:
+                    col_result[1] = col_out[1]
+                if col_in[2] < col_out[2]:
+                    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]
+                else:
+                    col_result[0] = col_out[0]

@@ Diff output truncated at 10240 characters. @@


More information about the Bf-extensions-cvs mailing list