#pragma once

// Reset to 0 in _prep() and increased for each Node instance in progress_prepare()
extern int progress_report_count;

extern void (*progress_report_f)(const class AbstractNode*, void*, int);
extern void *progress_report_userdata;

void progress_report_prep(AbstractNode *root, void (*f)(const class AbstractNode *node, void *userdata, int mark), void *userdata);
void progress_report_fin();
void progress_update(const AbstractNode *node, int mark);
// CGALUtils::applyUnion3D may process nodes out of order, so allow for an increment instead of tracking exact node
void progress_tick();

class ProgressCancelException { };
