Houdini Code Snippets

Vex

Snapping Vectors to World axis

vector snapToAxis(vector input){
    float lx = abs(input.x);
    float ly = abs(input.y);
    float lz = abs(input.z);
    
    if (lx > ly && lx > lz){
    
        return set(sign(input.x), 0, 0);
        
    }else if(ly > lx && ly > lz){
    
        return set(0, sign(input.y), 0);
        
    }else{
    
        return set(0, 0, sign(input.z));
    }
}

color_correction vex

// create spare parameters
float gamma = ch('gamma'); //default is 1 
float hue = ch('hue');
float sat = ch('sat');
float val = ch('val');
@Cd = pow(hsvtorgb(rgbtohsv(@Cd) + set(hue, sat, val)), gamma);

Meassure angle between neighbour points

// works best on unshared points

int isBorderEdge(int pt0, pt1)
{
    int hedge = pointhedge(0, pt0, pt1); // try finding hedge
    if (hedge == -1 )
    {
        hedge = pointhedge(0, pt1, pt0);  // try reversed hedge
        if (hedge == -1 ) return -1;  // invalid hedge
    }
    return hedge_equivcount(0, hedge) == 1; // 1 if border edge
}
// https://forums.odforce.net/topic/25589-border-edge-query-in-vex/

int pointNeighbours[] = neighbours(0,@ptnum);
i[]@edgeNeighbours;

vector sum = {0,0,0};
foreach(int point;pointNeighbours){
  sum += @P - point(0, 'P', point);
  if(isBorderEdge(@ptnum,point)){
      append(i[]@edgeNeighbours,point);
  }
}

v@sum = sum/len(pointNeighbours );

v@prev_point_vec = normalize(@P - point(0, 'P', @edgeNeighbours[0]));
v@next_point_vec = normalize(@P - point(0, 'P', @edgeNeighbours[1]));

float difference = dot(v@sum,v@out);

if( difference > 0.5){
  f@angle =degrees(acos(dot( v@prev_point_vec, v@next_point_vec)));
  }else{
  f@angle =360 -  degrees(acos(dot( v@next_point_vec,v@prev_point_vec)));
}

OpenCl

converting textureCoords to bufferCoords

#bind layer src? val=0
#bind layer !&dst

int2 textureToBufferCoords(float2 texCoords, int2 bufferDimensions)
{
    float2 scaled = texCoords * convert_float2(bufferDimensions - (int2)(1, 1));
    int2 result = convert_int2(round(scaled));
    
    return result;
}

@KERNEL
{   
    int2 bufferDimensions = (int2)(@xres, @yres);
    float2 texCoords = (float2)(1.0f,1.0f);
    
    int2 bufferCoords = textureToBufferCoords(texCoords, bufferDimensions);
    
    float4 out = @src.bufferIndex(bufferCoords);
    @dst.set(out);
}