From 0eb42ef03ad838e0ba39faae088d360108fcb15a Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Thu, 7 Apr 2022 10:36:58 -0400 Subject: [PATCH] speedup shadow clipping with progressive shadow generation --- src/kiri-mode/cam/ops.js | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/kiri-mode/cam/ops.js b/src/kiri-mode/cam/ops.js index a2a641ad..1c621ad3 100644 --- a/src/kiri-mode/cam/ops.js +++ b/src/kiri-mode/cam/ops.js @@ -946,13 +946,26 @@ class OpPocket extends CamOp { return slice; } let shadows = {}; + function genShadows(zs) { + let lastShadow, lastZ; + for (let z of zs) { + if (shadows[z]) continue; + let shadow = CAM.shadowAt(widget, z, lastZ); + lastZ = z; + if (lastShadow) { + shadow = POLY.union([...shadow, ...lastShadow], undefined, true); + } + lastShadow = shadow; + shadows[z] = shadow; + } + } function clearZ(polys, z, down) { let zs = down ? base.util.lerp(zTop, z, down) : [ z ]; let nested = POLY.nest(polys); for (let poly of nested) { + genShadows(zs); for (let z of zs) { - let shadow = shadows[z] || CAM.shadowAt(widget, z); - shadows[z] = shadow; + let shadow = shadows[z]; let clip = []; POLY.subtract([poly], shadow, clip); let slice = newSliceOut(z);