LOPs - AW - filtering

// Read attributes without time samples, using default USD values
int nums = usd_attriblen(0, @primpath, "positions"); // Default, no time samples
int primvar_nums = usd_attriblen(0, @primpath, "primvars:"+ch("primvarName"));
int primvar_ids[] = usd_attrib(0, @primpath, "primvars:"+ch("primvarName"));
string primvar_values = ch("primvarValues");

float seed = ch("seed");
float prune_amt = ch("prune_amt");

// Parse primvar_values into an array and convert to a set for faster lookup
string primvar_values_arr[] = split(primvar_values, ",");
int primvar_values_set[];
foreach (string value; primvar_values_arr) {
int primval = atoi(value);
primvar_values_set[primval] = 1; // Use a dictionary (set) for fast lookups
}

int invisible[];

// Mark invisible indices based on conditions
for (int i = 0; i < nums; ++i) {
int is_in_values = primvar_values_set[primvar_ids[i]]; // Faster lookup in the set
if (rand(i + seed) < prune_amt || is_in_values) {
append(invisible, i);
}
}

// Store result as a constant, non-time-dependent attribute
//setpointattrib(0, "invisibleIds", @elemnum, invisible, "set");
i[]@invisibleIds = invisible;