// SPDX-License-Identifier: MIT // Copyright (c) 2026 Incoprea // Check parallelism of two sampled edges // Not compiled or tested in-world // Setup: Put in the root of a spare owned object/linkset. Child touch handlers may consume events. Touch endpoints of edgeA, then endpoints of edgeB. Collect 4 owner touches; the next touch starts another measurement. // Stop / restore: Reset clears collected points; disable/remove to stop. No geometry is changed. // Notes: The angle is direction-independent; reversing an edge does not turn parallel into180 degrees. Results use actual touch positions in region coordinates, not hidden mesh dimensions. // License: see LICENSE in this distribution. // Original Incoprea. MIT. Live touch measurements only. list points; default { touch_start(integer detectedCount) { if(llDetectedKey(0)!=llGetOwner())return; if(llDetectedTouchFace(0)<0) { llOwnerSay("Touch position unavailable."); return; } if(llGetListLength(points)>=4)points=[]; points+=[llDetectedTouchPos(0)]; integer collected=llGetListLength(points); if(collected<4) { llOwnerSay("Recorded point "+(string)collected+" of 4."); return; } vector a=llList2Vector(points,0); vector b=llList2Vector(points,1); vector c=llList2Vector(points,2); vector d=llList2Vector(points,3); vector u=b-a; vector v=d-c; if(llVecMag(u)<0.000001||llVecMag(v)<0.000001) { llOwnerSay("Zero-length edge."); return; } float dot=llFabs(llVecNorm(u)*llVecNorm(v)); if(dot>1.0)dot=1.0; float angle=llAcos(dot)*RAD_TO_DEG; float offset=llVecMag((c-a)%u)/llVecMag(u); llOwnerSay("Parallelism angle="+(string)angle+" first-start offset="+(string)offset); } changed(integer flags) { if(flags&CHANGED_OWNER)llResetScript(); } }