diff options
Diffstat (limited to 'uv_magic_uv/op/uvw.py')
-rw-r--r-- | uv_magic_uv/op/uvw.py | 196 |
1 files changed, 70 insertions, 126 deletions
diff --git a/uv_magic_uv/op/uvw.py b/uv_magic_uv/op/uvw.py index 10202677..c97e0e04 100644 --- a/uv_magic_uv/op/uvw.py +++ b/uv_magic_uv/op/uvw.py @@ -20,10 +20,8 @@ __author__ = "Alexander Milovsky, Nutti <nutti.metro@gmail.com>" __status__ = "production" -__version__ = "5.1" -__date__ = "24 Feb 2018" - -from math import sin, cos, pi +__version__ = "5.2" +__date__ = "17 Nov 2018" import bpy import bmesh @@ -32,37 +30,70 @@ from bpy.props import ( FloatVectorProperty, BoolProperty ) -from mathutils import Vector from .. import common +from ..impl import uvw_impl as impl +from ..utils.bl_class_registry import BlClassRegistry +from ..utils.property_class_registry import PropertyClassRegistry + + +__all__ = [ + 'Properties', + 'MUV_OT_UVW_BoxMap', + 'MUV_OT_UVW_BestPlanerMap', +] + + +@PropertyClassRegistry() +class Properties: + idname = "uvw" + + @classmethod + def init_props(cls, scene): + scene.muv_uvw_enabled = BoolProperty( + name="UVW Enabled", + description="UVW is enabled", + default=False + ) + scene.muv_uvw_assign_uvmap = BoolProperty( + name="Assign UVMap", + description="Assign UVMap when no UVmaps are available", + default=True + ) + + @classmethod + def del_props(cls, scene): + del scene.muv_uvw_enabled + del scene.muv_uvw_assign_uvmap -class MUV_UVWBoxMap(bpy.types.Operator): - bl_idname = "uv.muv_uvw_box_map" +@BlClassRegistry() +class MUV_OT_UVW_BoxMap(bpy.types.Operator): + bl_idname = "uv.muv_uvw_operator_box_map" bl_label = "Box Map" bl_options = {'REGISTER', 'UNDO'} - size = FloatProperty( + size: FloatProperty( name="Size", default=1.0, precision=4 ) - rotation = FloatVectorProperty( + rotation: FloatVectorProperty( name="XYZ Rotation", size=3, default=(0.0, 0.0, 0.0) ) - offset = FloatVectorProperty( + offset: FloatVectorProperty( name="XYZ Offset", size=3, default=(0.0, 0.0, 0.0) ) - tex_aspect = FloatProperty( + tex_aspect: FloatProperty( name="Texture Aspect", default=1.0, precision=4 ) - assign_uvmap = BoolProperty( + assign_uvmap: BoolProperty( name="Assign UVMap", description="Assign UVMap when no UVmaps are available", default=True @@ -70,8 +101,10 @@ class MUV_UVWBoxMap(bpy.types.Operator): @classmethod def poll(cls, context): - obj = context.active_object - return obj and obj.type == 'MESH' + # we can not get area/space/region from console + if common.is_console_mode(): + return True + return impl.is_valid_context(context) def execute(self, context): obj = context.active_object @@ -80,102 +113,43 @@ class MUV_UVWBoxMap(bpy.types.Operator): bm.faces.ensure_lookup_table() # get UV layer - if not bm.loops.layers.uv: - if self.assign_uvmap: - bm.loops.layers.uv.new() - else: - self.report( - {'WARNING'}, "Object must have more than one UV map") - return {'CANCELLED'} - uv_layer = bm.loops.layers.uv.verify() - - scale = 1.0 / self.size - - sx = 1.0 * scale - sy = 1.0 * scale - sz = 1.0 * scale - ofx = self.offset[0] - ofy = self.offset[1] - ofz = self.offset[2] - rx = self.rotation[0] * pi / 180.0 - ry = self.rotation[1] * pi / 180.0 - rz = self.rotation[2] * pi / 180.0 - aspect = self.tex_aspect - - sel_faces = [f for f in bm.faces if f.select] - - # update UV coordinate - for f in sel_faces: - n = f.normal - for l in f.loops: - co = l.vert.co - x = co.x * sx - y = co.y * sy - z = co.z * sz - - # X-plane - if abs(n[0]) >= abs(n[1]) and abs(n[0]) >= abs(n[2]): - if n[0] >= 0.0: - u = (y - ofy) * cos(rx) + (z - ofz) * sin(rx) - v = -(y * aspect - ofy) * sin(rx) +\ - (z * aspect - ofz) * cos(rx) - else: - u = -(y - ofy) * cos(rx) + (z - ofz) * sin(rx) - v = (y * aspect - ofy) * sin(rx) +\ - (z * aspect - ofz) * cos(rx) - # Y-plane - elif abs(n[1]) >= abs(n[0]) and abs(n[1]) >= abs(n[2]): - if n[1] >= 0.0: - u = -(x - ofx) * cos(ry) + (z - ofz) * sin(ry) - v = (x * aspect - ofx) * sin(ry) +\ - (z * aspect - ofz) * cos(ry) - else: - u = (x - ofx) * cos(ry) + (z - ofz) * sin(ry) - v = -(x * aspect - ofx) * sin(ry) +\ - (z * aspect - ofz) * cos(ry) - # Z-plane - else: - if n[2] >= 0.0: - u = (x - ofx) * cos(rz) + (y - ofy) * sin(rz) - v = -(x * aspect - ofx) * sin(rz) +\ - (y * aspect - ofy) * cos(rz) - else: - u = -(x - ofx) * cos(rz) - (y + ofy) * sin(rz) - v = -(x * aspect + ofx) * sin(rz) +\ - (y * aspect - ofy) * cos(rz) - - l[uv_layer].uv = Vector((u, v)) + uv_layer = impl.get_uv_layer(self, bm, self.assign_uvmap) + if not uv_layer: + return {'CANCELLED'} + impl.apply_box_map(bm, uv_layer, self.size, self.offset, + self.rotation, self.tex_aspect) bmesh.update_edit_mesh(obj.data) return {'FINISHED'} -class MUV_UVWBestPlanerMap(bpy.types.Operator): - bl_idname = "uv.muv_uvw_best_planer_map" +@BlClassRegistry() +class MUV_OT_UVW_BestPlanerMap(bpy.types.Operator): + bl_idname = "uv.muv_uvw_operator_best_planer_map" bl_label = "Best Planer Map" bl_options = {'REGISTER', 'UNDO'} - size = FloatProperty( + size: FloatProperty( name="Size", default=1.0, precision=4 ) - rotation = FloatProperty( + rotation: FloatProperty( name="XY Rotation", default=0.0 ) - offset = FloatVectorProperty( + offset: FloatVectorProperty( name="XY Offset", size=2, default=(0.0, 0.0) ) - tex_aspect = FloatProperty( + tex_aspect: FloatProperty( name="Texture Aspect", default=1.0, precision=4 ) - assign_uvmap = BoolProperty( + assign_uvmap: BoolProperty( name="Assign UVMap", description="Assign UVMap when no UVmaps are available", default=True @@ -183,8 +157,10 @@ class MUV_UVWBestPlanerMap(bpy.types.Operator): @classmethod def poll(cls, context): - obj = context.active_object - return obj and obj.type == 'MESH' + # we can not get area/space/region from console + if common.is_console_mode(): + return True + return impl.is_valid_context(context) def execute(self, context): obj = context.active_object @@ -193,44 +169,12 @@ class MUV_UVWBestPlanerMap(bpy.types.Operator): bm.faces.ensure_lookup_table() # get UV layer - if not bm.loops.layers.uv: - if self.assign_uvmap: - bm.loops.layers.uv.new() - else: - self.report( - {'WARNING'}, "Object must have more than one UV map") - return {'CANCELLED'} - - uv_layer = bm.loops.layers.uv.verify() - - scale = 1.0 / self.size - - sx = 1.0 * scale - sy = 1.0 * scale - ofx = self.offset[0] - ofy = self.offset[1] - rz = self.rotation * pi / 180.0 - aspect = self.tex_aspect - - sel_faces = [f for f in bm.faces if f.select] - - # calculate average of normal - n_ave = Vector((0.0, 0.0, 0.0)) - for f in sel_faces: - n_ave = n_ave + f.normal - q = n_ave.rotation_difference(Vector((0.0, 0.0, 1.0))) - - # update UV coordinate - for f in sel_faces: - for l in f.loops: - co = q * l.vert.co - x = co.x * sx - y = co.y * sy - - u = x * cos(rz) - y * sin(rz) + ofx - v = -x * aspect * sin(rz) - y * aspect * cos(rz) + ofy - - l[uv_layer].uv = Vector((u, v)) + uv_layer = impl.get_uv_layer(self, bm, self.assign_uvmap) + if not uv_layer: + return {'CANCELLED'} + + impl.apply_planer_map(bm, uv_layer, self.size, self.offset, + self.rotation, self.tex_aspect) bmesh.update_edit_mesh(obj.data) |