From b0c4bf65a1a8e2c75c84ef1b514675a2453a4ce7 Mon Sep 17 00:00:00 2001 From: Seth Trowbridge Date: Sat, 28 Feb 2026 21:25:54 -0500 Subject: [PATCH] flip normals, simplyfy mesh table --- __init__.py | 44 +++++++++++++------------------------------- 1 file changed, 13 insertions(+), 31 deletions(-) diff --git a/__init__.py b/__init__.py index 1f72d53..df322e9 100644 --- a/__init__.py +++ b/__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