Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender-addons.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'uv_magic_uv/op/uvw.py')
-rw-r--r--uv_magic_uv/op/uvw.py196
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)