Wrangle-Template
Gas Field Wrangle
Camera Cull
vector ndc = toNDC(chs("cam"),@P);
if(ndc[0]<-chf("horizonL") || ndc[0]>1+chf("horizonR") || ndc[1]<-chf("verticalB") || ndc[1]>1+chf("verticalT") || ndc[2]>0){
removepoint(0,@ptnum);
}
Bend Function
////function f_rot////
matrix3 f_rot(float r_val; vector axis){
matrix3 identMat3 = ident();
rotate(identMat3, r_val ,normalize(set(axis)));
return identMat3;
}
////function f_trans////
matrix f_trans(vector position){
matrix tMat = ident();
translate(tMat, position);
return tMat;
}
/////function f_bend//////
matrix f_bend(vector P, pivot, dir, axis; float dist, angle){
matrix bendM = ident();
float bPi = 3.1415926535;
bendM *= invert( f_trans( pivot ));
float dot = dot(normalize(dir),P*bendM);
matrix horizonDir = bendM * invert( f_trans( normalize(dir) * dot));
float bendArea = fit(dot,0,dist,0,1);
if(bendArea < 1){
bendM = horizonDir;
}else{
bendM *= invert( f_trans(normalize(dir) * dist));
}
float angAmount = angle * min(dot,dist)/dist;
float axisOffset = (dist/bPi)/(angle/180);
vector axisPos = normalize(cross(axis,dir)) * axisOffset;
matrix3 rot = f_rot(angAmount/180 * bPi,normalize(axis) );
if(bendArea > 0 && angle != 0){
bendM = bendM * invert(f_trans(axisPos)) * matrix(rot) * f_trans(axisPos) * f_trans(pivot);
}else{
bendM = ident();
}
return bendM;
}