#Snapping issues

1 messages · Page 1 of 1 (latest)

unique python
#

public static bool TryPortAxisSnap(
Vector3 basePos, // pass in hit.point (or grid-snapped hit.point)
Quaternion baseRot, // current hologram rotation
float snapRange,
float softTolerance,
float hardTolerance,
bool ctrlHeld,
LayerMask snapTargetsMask, // machines and port layer mby
Transform ignore,
Port[] hologramPorts,
out Vector3 snappedPos,
out Quaternion snappedRot)
{
snappedPos = basePos;
snappedRot = baseRot;
bool didSnap = false;

    float tol = ctrlHeld ? hardTolerance : softTolerance;
    float bestScore = float.MaxValue;

    for (int i = 0; i < hologramPorts.Length; i++) {
        var port =  hologramPorts[i];
        Vector3 origin = port.transform.position + port.transform.forward * 0.01f;
        Ray ray = new Ray(origin, port.transform.forward);
        
        Debug.DrawRay(ray.origin, ray.direction.normalized * snapRange, Color.grey);
        if (Physics.Raycast(ray, out RaycastHit hit, snapRange, snapTargetsMask)) {
#

if (hit.collider.TryGetComponent(out Port otherPort)) {
Debug.DrawRay(hit.point, hit.normal * snapRange, Color.purple);
if (Vector3.Dot(hit.normal, otherPort.transform.forward) > 0.97f) {
Debug.DrawRay(ray.origin, ray.direction.normalized * snapRange, Color.yellow);
Vector3 targetPos = otherPort.transform.position;
Vector3[] localAxes = { Vector3.right, Vector3.up, Vector3.forward };
foreach (var localAxis in localAxes) {
Vector3 worldAxis = otherPort.transform.TransformDirection(localAxis);
float diff = Mathf.Abs(Vector3.Dot(worldAxis, basePos - targetPos));
if (diff <= tol) {
snappedPos = basePos + (targetPos - basePos).ProjectOnto(worldAxis);
didSnap = true;
break;
}
}
}else
Debug.DrawRay(ray.origin, ray.direction.normalized * snapRange, Color.red);
}

#

else {
Port[] ports = hit.collider.GetComponentsInChildren<Port>();
Port bestPort = null;
float bestDist = float.MaxValue;

                for (int j = 0; j < ports.Length; j++)
                { if (Vector3.Dot(ray.direction.normalized, -ports[j].transform.forward) > 0.99f) {
                        float dist = Vector3.Distance(hit.point, ports[j].transform.position);
                        if (dist < bestDist) {
                            bestDist = dist;
                            bestPort = ports[j];
                        }
                    }
                } if (bestPort != null) {
                    Debug.DrawRay(bestPort.transform.position, bestPort.transform.forward * 2f, Color.cyan);
                    Vector3 toHit = basePos - bestPort.transform.position;
                    float distance = Vector3.Dot(toHit, bestPort.transform.forward.normalized);
                    Vector3 alignedPos = bestPort.transform.position + bestPort.transform.forward * distance;
                    alignedPos.y = hit.collider.transform.position.y;
                    snappedPos = alignedPos;
                    didSnap = true;
                }
            }
        }
    }
    return didSnap;
}
#

"
private static Vector3 ProjectOnto(this Vector3 v, Vector3 onto) => Vector3.Dot(v, onto.normalized) * onto.normalized;

}
"

echo pollen
#

!code