#!/usr/bin/env python3 """Discriminate the two competing punch-chunk role models from the authored eye: Model A (mask/hull): visible = g1 (coarse hull) MINUS g0 silhouette (g0 = dmg_set mask) Model B (lattice): visible = g0 alone (g1/g2 hidden as 'damage plates') For each mech render, per punch patch set: cov0 = screen coverage of g0 (if ~solid over the view, drawing it opaque blinds -> kills B) cov1 = coverage of g1 covA = coverage of (g1 AND NOT g0) -> Model A visible frame openA = fraction of g1 footprint punched open by g0 Also save a visual 3-panel per mech: g0 | g1 | A-composite. """ import os, re, math, sys, struct import numpy as np from PIL import Image import importlib.util spec = importlib.util.spec_from_file_location("pg", os.path.join(os.path.dirname(__file__), "punch_geom.py")) # punch_geom.py runs a loop on import; import its parse via exec of the functions only src = open(os.path.join(os.path.dirname(__file__), "punch_geom.py")).read() src = src.split("for path in sys.argv")[0] ns = {} exec(src, ns) parse = ns["parse"] ROOT = r"C:\git\bt411" MECHS = {"madcat":("MAD","MAX"), "bhk1":("BLH","BLX"), "thor":("THR","THX"), "owens":("OWN","OWX"), "sunder":("SND","SNX"), "loki":("LOK","LOX"), "vulture":("VUL","VUX"), "avatar":("AVA","AVX")} W, H = 320, 240 def jointeye(skl_path): t = open(skl_path, encoding="latin1").read() m = re.search(r"\[jointeye\]", t) blk = t[m.start():m.start()+400] g = lambda k: float((re.search(rf"{k}=([-\d.e]+)", blk) or [None,"0"])[1]) return np.array((g("tranx"), g("trany"), g("tranz"))) def raster_mask(tris, eye, fwd): """double-sided coverage rasterization -> bool mask""" up = np.array([0.,1.,0.]) r = np.cross(up, fwd); r /= np.linalg.norm(r); u2 = np.cross(fwd, r) tanf = math.tan(math.radians(75)/2); aspect = W/H m = np.zeros((H,W), bool) for tri in tris: s = [] ok = True for p in tri: d = p - eye cx, cy, cz = np.dot(d,r), np.dot(d,u2), np.dot(d,fwd) if cz <= 0.02: ok = False; break s.append((cx/(cz*tanf*aspect)*0.5*W + 0.5*W, -cy/(cz*tanf)*0.5*H + 0.5*H)) if not ok: continue (ax,ay),(bx,by),(cx,cy) = s x0=max(0,int(min(ax,bx,cx))); x1=min(W-1,int(math.ceil(max(ax,bx,cx)))) y0=max(0,int(min(ay,by,cy))); y1=min(H-1,int(math.ceil(max(ay,by,cy)))) den=(by-cy)*(ax-cx)+(cx-bx)*(ay-cy) if abs(den)<1e-9 or x1=-1e-6 and w1>=-1e-6 and w2>=-1e-6: m[py,px]=True return m def tris_of(g): V = g["verts"] return [np.array([V[a][:3],V[b][:3],V[c][:3]]) for (a,b,c) in g["faces"] if max(a,b,c)