VEX Snippets - duartevictorino/Houdini GitHub Wiki

QUICK VEX SNIPPETS
// OUT OF OBJECT

int type;

// CREATE A INT PARAMETER WITH A MENU
// 0 GEOMETRY
// 1 SDF
type = chi("type");

if (type == 0){

    int nr_prim;
    vector pos_geo,dir_geo,n_geo,nr_uvw;
    
    pos_geo = minpos(1,@P);
    dir_geo = pos_geo - @P;
    xyzdist(1,@P,nr_prim,nr_uvw);
    n_geo = primuv(1,"N",nr_prim,nr_uvw);
    n_geo = normalize(n_geo);
    if (dot(normalize(dir_geo),n_geo) > 0){
        @P = pos_geo;
    }
}


if (type == 1){

    float vSam;
    vector vGrad,offset;
    
    vSam = volumesample(1,0,@P);
    vGrad = volumegradient(1,0,@P);
    offset = normalize(vGrad) * -vSam;
    if (vSam < 0){
        @P += offset;
    }
}
// FOR LOOP TRAIL

vector dir = normalize(v@v);
vector pos = @P;
int count = chi("count");

for (int i=0;i<count;i++){
    pos += dir * chf("gap");
    int npt = addpoint(0,@ptnum);
    setpointattrib(0,"P",npt,pos,"set");
}
// PC DENSITY

int nrpts[],maxpts,use_vis;
float rad;

rad = chf("search_radius");
maxpts = chi("max_points");
use_vis = chi("visualize"); //toggle

nrpts = pcfind(0,"P",@P,rad,maxpts);

@pc_density = len(nrpts)/float(maxpts);

if (use_vis == 1){
    @Cd = chramp("density",@pc_density);
}
// PSCALE SETUP

float r1 = fit01(pow(rand(@id+369),10),0.2,2);

float u = @curveu;
float ramp = chramp("uRamp", u);

f@age_mask = 1 - abs(@nage);
float age_ramp = chramp("age_ramp", @age_mask);


float fields_age_ramp = chramp("fields_age_ramp", @age_mask);

@pscale = ramp + 0.2;
@pscale *= age_ramp * r1;
@pscale *= chf("pscaleMult");

@fuel = 1 - fields_age_ramp;
@temperature = 1 - fields_age_ramp;


@Cd = set(@pscale,0,0);

addvariablename(0,"pscale", "PSCALE");
// TRANSFORM STATIC GEOMETRY TO ITS ANIMATED LOCATION

// Input0 - Static geometry, packed as single point
// Input1 - Animated geometry, select one piece to use its transforms

matrix tm;
tm = primintrinsic(1,'packedfulltransform',0);

// Set the rotation
// To get the rotation you need matrix3
setprimintrinsic(0,'transform',0,matrix3(tm),'set');

// Set the transform
setpointattrib(0,'P',0,vector(cracktransform(0,0,0,0,tm)),'set');

// cracktransform gets us the transform 

// CUSTOM SPIKE VELOCITY

vector cen = getbbox_center(0);

f@distance = fit(distance(@P, cen), chf("max_distance"), chf("min_distance"), 0.25, 1);
@distance = chramp("distance_ramp", @distance);

@Cd = @distance;


vector dir = normalize(chv("direction"));
float speed = chf("speed");

v@v = dir * speed;
v@v *= @distance;

float ang;
vector axis;
matrix3 rtm;

ang = radians(-25);
axis = normalize({0,0,1});
rtm = ident();
rotate(rtm,ang,axis);

@P -= cen; 
@P *= rtm;
@P += cen;
v@v *= rtm;
// RANDOM N
@N = set(0,0,1);
@N += sample_sphere_cone(chv("direction"),ch("angle"),rand(@ptnum));
// INSTANCE PATH

i@selectionPiece = int(rand(@id + 123) * chi("number_of_pieces"));

string path = split(chs("file_path"),".")[0];

s@instancepath = sprintf("%d.000%d.bgeo.sc",path,i@selectionPiece);
//VELOCITIES WRAP AROUND OBJECT
//N and v necessary

vector cross1 = normalize(cross(@v,@N));
vector cross2 = normalize(cross(cross1,@N));

float dt = dot(normalize(@v),@N);

float speed = length(@v);
@v = cross2 * (speed * 0.1) * fit(dt,-0.1,0.75,0,1);
//CRACK TRANSFORM
vector t,r,s;
cracktransform(0,0,0,primintrinsic(0,'packedfulltransform',@elemnum),t,r,s);

v@tm_trans = t;
v@tm_rot = r;
v@tm_sca = s;
//
float speed = length(@v);
vector downv = set(0,-1,0);
downv *= speed;
@v *= 0.125;
@v += downv;

vector cp = point(1,"P",0);
vector cv = @P - cp;
float cvlen = length(cv);
vector ncv = cv / cvlen;
ncv *= ch("bias2center");
@v += ncv;
@v *= fit(cvlen, 0, 10, 0.1,1);