joshuazt

Public Snippets 36

orient to UP and N

matrix3 m = qconvert(p@orient);

v@up = set(m.yx, m.yy, m.yz);
v@N  = set(m.zx, m.zy, m.zz);
v@P += v@up * chf('push');

//vector4 turnx = quaternion({1,0,0} * chf('scale'));
//vector4 turny = quaternion({0,1,0} * chf('scale'));
//p@orient = qmultiply(p@orient, turnx);

curlnoise by gradient

// Gradient
vector vg = -volumegradient(0,"density",v@P);
vg = normalize(vg);
vector v = normalize(v@vel);

//curlnoise
float t = f@Time * ch('speed');
vector p = v@P * ch('frequency');
vector4 p4 = set(p.x,p.y,p.z,t);
vector n = curlxnoise(p4)*ch('mult');

//dotproduct
float dot = fit(dot(v, vg), -1, 1, 0, 1);
float blend = chramp('ramp', dot);

//apply curl X dotproduct
v@vel += n * blend;

rotate v to new vector

v@v = lerp(v@v, length(v@v)  * normalize(qrotate(q, v@v)), blend);

primuv

int posprim;
vector param_uv;
float maxdist = 10;
float dist = xyzdist(1,@P,posprim,param_uv,maxdist);
i@posprim = posprim;
v@param_uv = param_uv;

vector pos = primuv(1,"P",i@posprim,v@param_uv);
@P = pos;

last point on curves

if (vertexprimindex(0, @vtxnum) == primvertexcount(0, @primnum) - 1) i@group_root = 1;
if (vertexprimindex(0, @vtxnum) < 1) i@group_root = 1;

carve but keep polycount

int pts[] = primpoints(0, @primnum);
vector P_pts[] = {};
float t = chf("t");
string basis = chs("basis");
vector P, uv, basis_sample;
float uvx_t;
foreach(int pt; pts)
{
    P = point(0, "P", pt);
    append(P_pts, P);
}
foreach(int pt; pts)
{
    P = point(0, "P", pt);
    uv = point(0, "uv", pt);
    uvx_t = uv.x * t;
    basis_sample = spline(basis, uvx_t, P_pts);
    setpointattrib(0, "P", pt, basis_sample, "set");
}

mirror chramp

// Get mirrored value from @curveu
float u = (abs(@curveu * - 2 + 1) * -1 + 1) / 2;

// Feed that value in a ramp that defines half of the resulting curve
f@pscale = chramp("point_scale", u);

rotate packed primitives

float rot = chf('rot');
vector angle = chv('angle');
matrix3 xform = primintrinsic(0, 'transform', i@primnum);
rotate(xform, radians(rot), angle);
setprimintrinsic(0, 'transform', i@primnum, xform, 'set');

storing RBD as points with packed transforms

matrix m4 = primintrinsic(0,'packedfulltransform',@ptnum);
matrix3 m3 = matrix3(m4);
@orient = quaternion(m3);
@scale = cracktransform(0,0,2,0,m4);
v@pivot = primintrinsic(0,'pivot',@ptnum);

delete by percentage

float percentage = chf('percentage');
if(rand(@ptnum, 1) % 100 < percentage) removepoint(0, @ptnum);

scale packed prim

float scale = chf('scale');
matrix3 trn = primintrinsic(0, "transform", @primnum);
matrix scalem = maketransform(0, 0, {0,0,0}, {0,0,0}, scale, @P);
trn *= matrix3(scalem);
setprimintrinsic(0, "transform", @primnum, trn);

volume to points

float val = f@surface;
 
int pt = addpoint(0, @P);

aim normals along surface in a direction

vector dir = chv('dir');

float angle = dot(@N, dir);
float fitangle = fit(angle, -1, 1, 0, 1);
float blend = chramp('blend', fitangle);

@Cd = blend;
vector tmp = cross(@N, dir);
vector cross = cross(@N, tmp);

v@N = lerp(@N, cross, blend);

geo to uv space

@rest = v@P;

int vtx = pointvertex(0, @ptnum);
vector uv = vertex(0, 'uv', vtx);
v@P = lerp(@P, uv, chf('blend'));

volume to points with val

float val = f@surface;

int pt = addpoint(0, @P);
setpointattrib(0, 'val', pt, val);

sdf/grad import

float sdf = volumesample(1, 0, v@P);
vector grad = normalize(volumesamplev(2,0, v@P));