flip normals, simplyfy mesh table
This commit is contained in:
parent
3987cc9ed5
commit
b0c4bf65a1
44
__init__.py
44
__init__.py
@ -3,42 +3,24 @@ import bmesh
|
||||
import math
|
||||
from mathutils import Vector, Matrix
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Lookup tables
|
||||
# Canonical primitive builders (Z-up, origin at centre)
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
def _build_unit_circle(segments: int) -> list:
|
||||
"""(cos, sin) sampled once per segment. Reused by all primitives."""
|
||||
return [
|
||||
(math.cos(2 * math.pi * i / segments),
|
||||
math.sin(2 * math.pi * i / segments))
|
||||
for i in range(segments)
|
||||
]
|
||||
|
||||
|
||||
def _build_latitude_stack(segments: int) -> list:
|
||||
"""(sin_phi, cos_phi) for each latitude ring, poles included."""
|
||||
rings = max(segments // 2, 2)
|
||||
return [
|
||||
(math.sin(math.pi * r / rings),
|
||||
math.cos(math.pi * r / rings))
|
||||
for r in range(rings + 1)
|
||||
]
|
||||
|
||||
|
||||
class _Tables:
|
||||
"""Precomputed trig tables for a given segment count."""
|
||||
def __init__(self, segments: int):
|
||||
|
||||
self.segments = segments
|
||||
segScalar = 2 * math.pi / segments
|
||||
self.circle = [
|
||||
(math.cos(segScalar * i), math.sin(segScalar * i)) for i in range(segments)
|
||||
]
|
||||
self.rings = max(segments // 2, 2)
|
||||
self.circle = _build_unit_circle(segments)
|
||||
self.latitudes = _build_latitude_stack(segments)
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Canonical primitive builders (Z-up, origin at centre)
|
||||
# ---------------------------------------------------------------------------
|
||||
ringScalar = math.pi / self.rings
|
||||
self.latitudes = [
|
||||
(math.sin(ringScalar * r), math.cos(ringScalar * r)) for r in range(self.rings + 1)
|
||||
]
|
||||
|
||||
def _sphere_positions(radius: float, tables: _Tables) -> list:
|
||||
out = []
|
||||
@ -104,21 +86,21 @@ def add_capped_frustum(bm: bmesh.types.BMesh,
|
||||
for i in range(segs):
|
||||
nxt = (i + 1) % segs
|
||||
try:
|
||||
bm.faces.new((hr[i], hr[nxt], tr[nxt], tr[i]))
|
||||
bm.faces.new((tr[i], tr[nxt], hr[nxt], hr[i]))
|
||||
except ValueError:
|
||||
pass
|
||||
|
||||
hcv = bm.verts.new(head_pos)
|
||||
for i in range(segs):
|
||||
try:
|
||||
bm.faces.new((hcv, hr[(i + 1) % segs], hr[i]))
|
||||
bm.faces.new((hcv, hr[i], hr[(i + 1) % segs]))
|
||||
except ValueError:
|
||||
pass
|
||||
|
||||
tcv = bm.verts.new(tail_pos)
|
||||
for i in range(segs):
|
||||
try:
|
||||
bm.faces.new((tcv, tr[i], tr[(i + 1) % segs]))
|
||||
bm.faces.new((tcv, tr[(i + 1) % segs], tr[i]))
|
||||
except ValueError:
|
||||
pass
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user