Fit Attribute max && min by Array

1

Fit attribute value to 0 and 1 is one of my favorite thing to do in Houdini and i always look for new way to do it and i wish if SideFX make node for this, it’s really important thing to get the the best result for example drive the color by attribute.
I write a blog here about this topic and this is another way to fit the attribute value to 0 and 1 “only try it with float attribute”  and this method is store all the attribute values in an array and then pop the last and first value from a sorted array.

1- store all the attribute values in an array use point wrangle.

float attrib[] = array(@attrib);
setdetailattrib(0, "attrib", attrib, "append");

2- sort the array “Returns the array sorted in increasing order” to get the attribute min value and it’s important here to use detail wrangle.

f[]@myattrib = sort(f[]@attrib);
f@attrib_min = pop(@myattrib, 0);

3- in the same detail wrangle reverse the sort array to get the attribute max value.

f[]@myattrib = reverse(sort(f[]@attrib));
f@attrib_max = pop(@myattrib, 0);

4- promote min and max attribute from detail to point use point wrangle.

setpointattrib(0, "attrib_min", @ptnum, f@attrib_min);
setpointattrib(0, "attrib_max", @ptnum, f@attrib_max);

5- fit the attribute to 0 and 1 use point wrangle.

f@attrib = fit(@attrib, @attrib_min, @attrib_max, 0, 1);

in the end this is really interesting way to get value from attribute but it’s really slow compared to other method i talk about them here.

Max && Min of Attribute

I used to be think like just use the max and min function and you will be ready to go, however i find it more difficult to get the max and max and min of attribute or maybe it’s just the stupid me. anyway recently i find how to get the min and max and here is how:

1 – loop over all point to get the max and min but this some time is really heavy in calculation.

int all = i@numpt;
string attrib = chs("attrib");

float min = point(0, attrib, @ptnum);
float max = point(0, attrib, @ptnum);

for(int pt=0; pt < all; pt++){
    float comper = point(0, attrib, pt);
    
    if(comper < min){
        min = comper;
        }
        else{
            if(comper > max){
                max = comper;
                }
            }
    } 

2 – promote the attribute to detail then import it back to point i find this way more faster in calculation.

setdetailattrib(0, "attrib_min", @attrib, "min");
setdetailattrib(0, "attrib_max", @attrib, "max");
float min = detail(0, "attrib_min", 0);
float max = detail(0, "attrib_max", 0);

3- and if you like VOP there is a way to fit max and min of Attribute inside VOP

  • use attribute promote node to se the max and the min of your attribute
  •  merge the max and min with merge node.
  • copy the max and min with copy attribute node to your geometry.
  • inside VOP import detail attribute min and max and set them as source max and min in fit node and dest min and max as is it 0, 1.
  • export your Attribute or use it inside VOP.

 

that’s all for now please share with me in the comment below if you know better way.

 

 

 

11