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

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'release/scripts/startup/bl_operators/add_mesh_torus.py')
-rw-r--r--release/scripts/startup/bl_operators/add_mesh_torus.py78
1 files changed, 51 insertions, 27 deletions
diff --git a/release/scripts/startup/bl_operators/add_mesh_torus.py b/release/scripts/startup/bl_operators/add_mesh_torus.py
index f12e7484e64..0e5acea94f9 100644
--- a/release/scripts/startup/bl_operators/add_mesh_torus.py
+++ b/release/scripts/startup/bl_operators/add_mesh_torus.py
@@ -32,25 +32,24 @@ from bpy_extras import object_utils
def add_torus(major_rad, minor_rad, major_seg, minor_seg):
from math import cos, sin, pi
- from mathutils import Vector, Quaternion
+ from mathutils import Vector, Matrix
- PI_2 = pi * 2.0
- z_axis = 0.0, 0.0, 1.0
+ pi_2 = pi * 2.0
verts = []
faces = []
i1 = 0
tot_verts = major_seg * minor_seg
for major_index in range(major_seg):
- quat = Quaternion(z_axis, (major_index / major_seg) * PI_2)
+ matrix = Matrix.Rotation((major_index / major_seg) * pi_2, 3, 'Z')
for minor_index in range(minor_seg):
- angle = 2 * pi * minor_index / minor_seg
+ angle = pi_2 * minor_index / minor_seg
- vec = quat * Vector((major_rad + (cos(angle) * minor_rad),
- 0.0,
- (sin(angle) * minor_rad),
- ))
+ vec = matrix * Vector((major_rad + (cos(angle) * minor_rad),
+ 0.0,
+ sin(angle) * minor_rad,
+ ))
verts.extend(vec[:])
@@ -58,7 +57,6 @@ def add_torus(major_rad, minor_rad, major_seg, minor_seg):
i2 = (major_index) * minor_seg
i3 = i1 + minor_seg
i4 = i2 + minor_seg
-
else:
i2 = i1 + 1
i3 = i1 + minor_seg
@@ -71,11 +69,7 @@ def add_torus(major_rad, minor_rad, major_seg, minor_seg):
if i4 >= tot_verts:
i4 = i4 - tot_verts
- # stupid eekadoodle
- if i2:
- faces.extend([i1, i3, i4, i2])
- else:
- faces.extend([i2, i1, i3, i4])
+ faces.extend([i1, i3, i4, i2])
i1 += 1
@@ -83,31 +77,56 @@ def add_torus(major_rad, minor_rad, major_seg, minor_seg):
def add_uvs(mesh, minor_seg, major_seg):
+ from math import fmod
+
mesh.uv_textures.new()
uv_data = mesh.uv_layers.active.data
polygons = mesh.polygons
u_step = 1.0 / major_seg
v_step = 1.0 / minor_seg
+
+ # Round UV's, needed when segments aren't divisible by 4.
+ u_init = 0.5 + fmod(0.5, u_step)
+ v_init = 0.5 + fmod(0.5, v_step)
+
+ # Calculate wrapping value under 1.0 to prevent
+ # float precision errors wrapping at the wrong step.
+ u_wrap = 1.0 - (u_step / 2.0)
+ v_wrap = 1.0 - (v_step / 2.0)
+
vertex_index = 0
- u = 0.5
+ u_prev = u_init
+ u_next = u_prev + u_step
for major_index in range(major_seg):
- v = 0.5
+ v_prev = v_init
+ v_next = v_prev + v_step
for minor_index in range(minor_seg):
loops = polygons[vertex_index].loop_indices
if minor_index == minor_seg - 1 and major_index == 0:
- uv_data[loops[1]].uv = (u, v)
- uv_data[loops[2]].uv = (u + u_step, v)
- uv_data[loops[0]].uv = (u, v + v_step)
- uv_data[loops[3]].uv = (u + u_step, v + v_step)
+ uv_data[loops[1]].uv = u_prev, v_prev
+ uv_data[loops[2]].uv = u_next, v_prev
+ uv_data[loops[0]].uv = u_prev, v_next
+ uv_data[loops[3]].uv = u_next, v_next
else:
- uv_data[loops[0]].uv = (u, v)
- uv_data[loops[1]].uv = (u + u_step, v)
- uv_data[loops[3]].uv = (u, v + v_step)
- uv_data[loops[2]].uv = (u + u_step, v + v_step)
- v = (v + v_step) % 1.0
+ uv_data[loops[0]].uv = u_prev, v_prev
+ uv_data[loops[1]].uv = u_next, v_prev
+ uv_data[loops[3]].uv = u_prev, v_next
+ uv_data[loops[2]].uv = u_next, v_next
+
+ if v_next > v_wrap:
+ v_prev = v_next - 1.0
+ else:
+ v_prev = v_next
+ v_next = v_prev + v_step
+
vertex_index += 1
- u = (u + u_step) % 1.0
+
+ if u_next > u_wrap:
+ u_prev = u_next - 1.0
+ else:
+ u_prev = u_next
+ u_next = u_prev + u_step
class AddTorus(Operator, object_utils.AddObjectHelper):
@@ -263,3 +282,8 @@ class AddTorus(Operator, object_utils.AddObjectHelper):
object_utils.object_data_add(context, mesh, operator=self)
return {'FINISHED'}
+
+
+classes = (
+ AddTorus,
+) \ No newline at end of file