אירועים ובדיקת פגיעה
הפרדה בין האיסוף לבדיקת הפגיעה
התהליכון הראשי מאזין ל-pointer/wheel/touch עם { passive: true }. אירועים הקשורים לגלילה רק כותבים את הדלתא ואת חותמת הזמן לערוץ משותף: בלי בדיקת פגיעה ובלי setState.
בדיקת הפגיעה מתרחשת בליבה: עץ BVH מעל תיבות AABB בקואורדינטות עולם, המתוחזק באופן מצטבר יחד עם ה-Scene (נבנה מחדש כשהטופולוגיה משתנה, ומותאם מחדש בלבד כשרק הגיאומטריה משתנה). לאחר הפגיעה נבנה המסלול מהשורש אל היעד ומוחזר למעטפת דרך הזרם ההפוך.
בדיקות תכונה מבטיחות שה-BVH ומימוש לינארי נאיבי מחזירים אותה תוצאה — לנתיב הממוטב תמיד יש אורקל להשוואה.
התפשטות בשלושה שלבים
מודל האירועים מיושר ל-DOM: לכידה ← יעד ← בעבוע.
<container onClickCapture={(event) => log("outer capture", event.eventPhase)}>
<container
onPointerDown={(event) => {
event.preventDefault();
event.stopPropagation();
}}
/>
</container>המטפלים הזמינים: onPointerDown, onPointerUp, onPointerMove, onPointerCancel, onClick, onWheel, ולכל אחד גרסת *Capture.
DoperEvent מספק את target, currentTarget, eventPhase, את הקואורדינטות הלוגיות המקומיות ל-canvas x/y, את deltaX/deltaY, את buttons, את מקשי ההצמדה, וכן preventDefault(), stopPropagation() ו-stopImmediatePropagation().
בעיית התזמון של preventDefault
מאזין פסיבי אינו יכול לקרוא ל-preventDefault(). זו נקודת נכונות שיש לטפל בה במפורש, לא פרט שאפשר לעקוף.
הפתרון: אזורים שחייבים למנוע את התנהגות ברירת המחדל (למשל אזור נגלל פנימי) מחושבים מראש בליבה, שמסנכרנת אל התהליכון הראשי «מלבנים של אזורים לא פסיביים». התהליכון הראשי מעביר בדיוק את האזורים האלה למאזינים לא פסיביים וקורא ל-preventDefault() באופן סינכרוני כשהאירוע נופל בתוכם. לכן אין שום מצב מירוץ התלוי בתשובה אסינכרונית.
גבולות סמנטיקת הפגיעה
הסמנטיקה הנוכחית צומצמה בכוונה כדי להימנע מהתנהגות מובלעת:
- בפגיעות חופפות היעד הוא «האחרון שצויר». אין כרגע z-order, אין כיבוי פגיעה באמצעות
pointer-eventsואין דילוג על צמתים בלתי נראים. הכנסת כל אחד מהם מחייבת החלטת תכנון מפורשת. - פגיעה מול תצלום הפריים: כל האירועים באותה אצווה נפתרים מול הגיאומטריה של הפריים האחרון שעבר commit. גלילה בתוך האצווה שמשנה גיאומטריה תשפיע על הפגיעה רק בפריים הבא — כך מובטחת סמנטיקת החזרה האטומית של האצווה וההרצה החוזרת הדטרמיניסטית.
- קלט מקלדת עובר דרך פרוטוקול קלט העריכה ואינו מתחזה לאירוע פגיעה.
בהדגמת האירועים ב-Playground אפשר לראות בזמן אמת את יומן ההתפשטות בשלושת השלבים.