float preview (int preview_toggle; float value_preview, value_final) { if (preview_toggle) { return value_preview; }else{ return value_final; } } int preview (int preview_toggle; int value_preview, value_final) { if (preview_toggle) { return value_preview; }else{ return value_final; } } void clamp01(float value) { value = clamp(value,0,1); } string ftoa(float value) { return sprintf("%g", value); } string padzero(int size, value) { string format = '%0' + itoa(size) + 'd'; string eval = sprintf(format, value) ; return eval; } float blend( float array[]; float index ) { float value_0 , value_1; float index_01; float eval; value_0 = array [floor( index )]; value_1 = array [floor( ceil(index) )]; index_01 = index % 1; eval = fit01(index_01, value_0, value_1); return eval; } float dim_falloff_linear(vector pos, from, to) { vector u = normalize(to - from); vector v = pos - from; float eval = dot(u,v) / length(to - from); return eval; } float dim_falloff_radial(vector pos, center, extent) { float max = length(extent - center); float eval = length(pos - center) / max; return eval; } void dim_segment(int geometry; string class, name) { int count; float eval; if (class == "point") count = npoints(0); if (class == "prim") count = nprimitives(0); eval = 0; for (int elem = 0; elem < count; elem++) { setdetailattrib(0,name,eval); } } void distort_bias(float dimension, bias) { if (dimension <= 0) dimension = 0; else if (dimension >= 1) dimension = 1; else dimension = (1-bias) / (((1.0 / dimension) - 2) * (bias) + 1); } float distort_bias(float dimension, bias) { float eval; if (dimension <= 0) eval = 0; else if (dimension >= 1) eval = 1; else eval = (1-bias) / (((1.0 / dimension) - 2) * (bias) + 1); return eval; } void distort_ease(float dimension, ease) { if(dimension<0.5) dimension = distort_bias(dimension*2,ease)/2; else dimension = 1 - distort_bias((1-dimension)*2,ease)/2; } void distort_noise(float dimension, noise, limit_impact; string channel) { float impact = chramp(channel, dimension); if (limit_impact) { // triangle float limit_from_top = 1 - dimension; float limit_from_bot = dimension; impact *= min(limit_from_top, limit_from_bot); } dimension = dimension + impact * noise; } void distort_lut(float dimension; string channel) { dimension = chramp(channel, dimension); } void distort_shrink(float dimension, from_zero, from_one) { dimension = fit(dimension, from_zero, from_one, 0, 1); } void distort_segment(float dimension; int segment, segment_max; float offset_0, offset_1; int enable_gaps) { float segment_rel = float (segment) / float(segment_max); float off_0, off_1; if (enable_gaps) { off_0 = min(offset_0,0.99999); off_1 = max(offset_1,0.00001); } else { // correct offset to not overlap off_0 = fit01( offset_0, 0 , 1-1/float(segment_max+1) ); off_1 = fit01( offset_1, 1/float(segment_max+1) , 1 ); } float wide_min = segment_rel * off_0; float wide_max = 1-(1-segment_rel) * (1-off_1); dimension = fit(dimension, wide_min, wide_max, 0, 1); } float coord_midi(string name; float pitch, time) { string geo = "op:/obj/midi/mixer/" + name; float i[] = detail(geo, name); int midi_total_frames = detail(geo, "midi_total_frames"); int index = floor(time) + midi_total_frames * floor(pitch); float result = i[index]; return result; } float fill_to_coord(float dimension, coord, feather_spread) //clamped { float eval, trywide; trywide = fit01(coord, -feather_spread/2 , 1+feather_spread/2); if ( feather_spread>0 ) { float omin = dimension - feather_spread/2; float omax = dimension + feather_spread/2; eval = fit(trywide, omin, omax, 0, 1); } else { if ( trywide > dimension ) { eval = 1; } else { eval = 0; } } if (coord == 1) eval = 1; if (coord == 0) eval = 0; return eval; } float geo_line_u (int geometry, ptnum) { int linvert = pointvertex (geometry, ptnum); int vertex = vertexprimindex (geometry, linvert); int primnum[] = pointprims (geometry, ptnum); int count = primvertexcount (geometry, primnum[0]); float eval = vertex / float (count-1); return eval; } void geo_carve_point (int geometry, primnum; float u) { int oldprim = primnum; int newprim = addprim(geometry, "polyline"); vector pos = primuv(0, "P", primnum, set(u,0,0)); vector N = primuv(0, "N", primnum, set(u,0,0)); vector up = primuv(0, "up", primnum, set(u,0,0)); int ptnum = addpoint(newprim, pos); int vertex = addvertex(0, newprim, ptnum); setpointattrib(0, "N", ptnum, N, "set"); setpointattrib(0, "up", ptnum, up, "set"); removeprim (geometry, oldprim, 1); } void geo_carve_line (int geometry, primnum; float start, end) { vector getlinepos(int primnum; float u) { vector pos = primuv(0, "P", primnum, set(u,0,0)); return pos; } int createpoint(int primnum; vector pos) { int ptnum = addpoint(primnum, pos); int vertex = addvertex(0, primnum, ptnum); return vertex; } int oldprim = primnum; int closed = primintrinsic(geometry, "closed", oldprim); int segments = primvertexcount(geometry, oldprim) - 1 + closed; //--------------------------- //--------------------------- if (start==end){ //nothing } //--------------------------- //--------------------------- if (start<end){ int newprim = addprim(geometry, "polyline"); //new point at start createpoint(newprim, getlinepos(oldprim, start)); //points from prim int startvert, endvert; startvert = 1 + floor(start * segments); endvert = 1 + floor(end * segments); endvert = min(endvert, segments); for (int i = startvert; i < endvert; i++) { vector vertpos = vertex(geometry, "P", oldprim, i); createpoint(newprim, vertpos); } //new point at end createpoint(newprim, getlinepos(oldprim, end)); } //--------------------------- //--------------------------- if (start>end){ int newprim; newprim = addprim(geometry, "polyline"); //from prim int startvert, endvert; startvert = 1 + floor(start * segments); endvert = 1 + floor(end * segments); endvert = min(endvert, segments); for (int i = 0; i < endvert; i++) { vector vertpos = vertex(geometry, "P", oldprim, i); createpoint(newprim, vertpos); } //new point at end createpoint(newprim, getlinepos(oldprim, end)); //new point at start newprim = addprim(geometry, "polyline"); createpoint(newprim, getlinepos(oldprim, start)); //from prim for (int i = startvert; i <= segments; i++) { vector vertpos; if (i==segments && closed) { // this is special, on closed: last = firt vertpos = vertex(geometry, "P", oldprim, 0); } else { // usual point vertpos = vertex(geometry, "P", oldprim, i); } createpoint(newprim, vertpos); } } //--------------------------- //--------------------------- removeprim(geometry, oldprim, 1); } vector geo_farthest_point_position (int geometry; vector farthest_point_from) //run over detail of input 0 { int count = npoints(geometry); float maxdist = 0; vector eval; for (int pt = 0; pt < count; pt++) { vector sample_pos = point(0,"P",pt); float distance = length(sample_pos - farthest_point_from); if (distance > maxdist) { maxdist = distance; eval = sample_pos; } } return eval; } vector geo_farthest_point_distance (int geometry; vector from) //pointcloud of input 0 { int maxpts = npoints( geometry); int handle = pcopen( geometry, "P", from, radius, maxpts); float eval = pcfarthest(handle); pcclose(handle); return eval; } vector geo_closest_point_position(string surface_geo; vector from) { vector uv_found ; int prim_found ; float distance = xyzdist("op:" + surface_geo, from, prim_found, uv_found); vector pos_closest = primuv("op:" + surface_geo, "P", prim_found, uv_found); return pos_closest; } vector geo_closest_point_position(int surface_geo; vector from) { vector uv_found ; int prim_found ; float distance = xyzdist(surface_geo, from, prim_found, uv_found); vector pos_closest = primuv(surface_geo, "P", prim_found, uv_found); return pos_closest; } void geo_bounding_vector (int geometry; vector direction_from, direction_to, result_from, result_to) { vector u, v, pos, center; float distance, mindist, maxdist; int count = npoints(geometry); u = normalize(direction_to - direction_from); mindist = 1e10; maxdist = -1e10; for (int pt = 0; pt < count; pt++) { pos = point(geometry,"P",pt); v = pos - direction_from; distance = dot(u,v); maxdist = max(distance, maxdist); mindist = min(distance, mindist); } v = getbbox_center(geometry) - direction_from; center = dot(u,v); result_to = (maxdist - center) * u + getbbox_center(geometry) ; result_from = (mindist - center) * u + getbbox_center(geometry) ; } vector vec_len_fit01(vector noise; float xmin, xmax, ymin, ymax, zmin, zmax) { vector eval = noise; eval[0] = fit01(eval[0], xmin, xmax); eval[1] = fit01(eval[1], ymin, ymax); eval[2] = fit01(eval[2], zmin, zmax); return eval; } vector vec_dir_randomize(vector vec; float amount, seed) { vector vec_rand; float length_orig = length(vec); // getting different random value for each axis, scaling to [-1..1] range // thanks to Juraj Tomori for this script vec_rand.x = rand(seed * 684.49848) * 2 - 1; vec_rand.y = rand(seed * 178.46548) * 2 - 1; vec_rand.z = rand(seed * 489.49856) * 2 - 1; vec_rand = lerp(vec, vec_rand, amount); vec_rand = normalize(vec_rand) * length_orig; return vec_rand; } vector vec_dir_quantize(vector orig ) { int reference_geo = 1; // vec_prim = 0; // vec_total = primvertexcount(reference_geo, vec_prim); vector quant = {0,0,0}; int count = 3; for (int i = 0; i < count; i++) { vector quant_dir = normalize( point(reference_geo,"P",i) ) ; float quant_add; quant_add = dot ( normalize(orig) , quant_dir ); quant_add = rint (quant_add) ; quant += quant_add * quant_dir; } quant = length(orig) * normalize( quant ); return quant; } vector euler_from_quat(vector4 orient) { vector eval; vector4 quaternion = orient; matrix m = matrix( qconvert( quaternion ) ); eval = cracktransform(0, 0, 1, {0,0,0}, m); return eval; } vector4 quat_from_zy(vector z,y) { vector4 eval; matrix3 m = maketransform(z, y); eval = quaternion(m); return eval; } matrix xmat(vector amount, pivot; vector4 orient; string trs) { matrix eval; vector t = {0,0,0}; vector r = {0,0,0}; vector s = {1,1,1}; vector pr = euler_from_quat(orient); if (trs == "translate") t = amount; if (trs == "rotate") r = amount; if (trs == "scale") s = amount; eval = maketransform(0, 0, t, r, s, pivot, pr); return eval; } void intri_xmat(int primnum; matrix xmat) { matrix3 transform = primintrinsic(0, "transform", primnum); transform *= matrix3 (xmat); setprimintrinsic(0,"transform", primnum, transform); } float time_sequence(float current, zero_at, seq_length, speed; string type) { float eval, seq_length_retimed, relative_range; seq_length_retimed = seq_length / speed; relative_range = (current - zero_at) / seq_length_retimed; if (type == "once") { relative_range = clamp(relative_range, 0, 1); eval = relative_range * seq_length; } if (type == "loop") { relative_range = relative_range % 1; eval = relative_range * seq_length; } if (type == "ping") { relative_range = 1 - abs (relative_range % 2 - 1); eval = relative_range * seq_length; } return eval; } float time_snap(int frame_current, frame_snap, smooth_frames; float value_at_snap, speed_before, speed_after) { int frame_0 = min(frame_snap,frame_snap + smooth_frames); int frame_1 = max(frame_snap,frame_snap + smooth_frames); // distance linear after int frames_lin_after = max(0, frame_current-frame_1 ); float distance_lin_after = frames_lin_after * speed_after; // distance linear before int frames_lin_before = min(0, frame_current-frame_0 ); float distance_lin_before = frames_lin_before * speed_before; // distance smooth int range_start = 0; int range_end = 0; float sign = 0; if (frame_current > frame_snap && smooth_frames > 0) { range_start = frame_snap; range_end = min(frame_current, frame_1); sign = 1; } if (frame_current < frame_snap && smooth_frames < 0) { range_start = max(frame_current, frame_0); range_end = frame_snap; sign = -1; } float distance_smooth = 0; for (int f_in = range_start; f_in < range_end ; f_in++) { float speed = smooth(frame_0, frame_1, f_in); speed = fit01(speed,speed_before,speed_after); distance_smooth += sign * speed; } float distance; distance = value_at_snap; distance += distance_lin_before; distance += distance_lin_after; distance += distance_smooth; return distance; } float time_twosnap(int frame_current, snapframe_0, snapframe_1, frames_smooth_0, frames_smooth_1; float value_0, value_1) { int cur = frame_current; // check for overlaps int snap_0 = min(snapframe_0,snapframe_1); int snap_1 = max(snapframe_0,snapframe_1); int range_total = snap_1 - snap_0; int range_lin = max (0, range_total - frames_smooth_0 + frames_smooth_1); int range_0 = max (0, range_total - range_lin + frames_smooth_1); int range_1 = max (0, range_total - range_lin - range_0); // keyframes (range breaks) int key_0 = snap_0; int key_1 = snap_0 + range_0; int key_2 = snap_1 - range_1; int key_3 = snap_1; // speed float speed_normalized = float(range_0)/2 + float(range_1)/2 + float(range_lin); float speed_mult = (value_1 - value_0) / speed_normalized; float speed; float value = value_0; // distance in range 0 if(range_0 > 1) { for (int f_in = key_0; f_in < min(key_1,cur) ; f_in++) { speed = speed_mult * smooth(key_0, key_1 - 1, f_in); value += speed; } } // distance in range linear if(range_lin) { for (int f_in = key_1; f_in < min(key_2,cur) ; f_in++) { speed = speed_mult; value += speed; } } // distance in range 1 if(range_1 > 1) { for (int f_in = key_2; f_in < min(key_3,cur) ; f_in++) { speed = speed_mult * ( 1 - smooth(key_2, key_3 - 1, f_in) ); value += speed; } } return value; //return float(range_lin); } string file_mov_index(string firstfile; int mov, index) { string split[] = split(firstfile,"/_."); int split_len = len(split); //[ D:, bond, "5 houdini", img, dir, name, 000, name, 000, 00000, png ] int file_name_len = len( split[ split_len -4 ] ); int file_mov_len = len( split[ split_len -3 ] ); int file_index_len = len( split[ split_len -2 ] ); int file_ext_len = len( split[ split_len -1 ] ); int afterpath_len = file_ext_len + 1 + file_index_len + 1 + 2*file_mov_len + 2 + 1 + 2*file_name_len; string file_path = slice(firstfile,0,-afterpath_len); string file_name = split[split_len - 4]; string file_type = split[split_len - 1]; string file_mov = padzero(file_mov_len, mov); string file_index = padzero(file_index_len, index); string path; path = file_path; path += file_name + "_"; path += file_mov + "/"; path += file_name + "_"; path += file_mov + "_"; path += file_index+ "."; path += file_type; return path; } string file_index(string firstfile; int index) { string split[] = split(firstfile,"/_."); int split_len = len(split); //[ D:, bond, "5 houdini", img, "seq timecode", timecode, 00001, jpg ] int file_name_len = len( split[ split_len -3 ] ); int file_index_len = len( split[ split_len -2 ] ); int file_ext_len = len( split[ split_len -1 ] ); int afterpath_len = file_ext_len + 1 + file_index_len + 1 + file_name_len; string file_path = slice(firstfile,0,-afterpath_len); string file_name = split[split_len - 3]; string file_type = split[split_len - 1]; string file_index = padzero(file_index_len, index); string path; path = file_path; path += file_name + "_"; path += file_index+ "."; path += file_type; return path; } void mat_over(string actual, override_name, override_value; int override_is_string) { string contents, add, value; value = override_value; contents = slice(actual,1,-1); // remove { } if (override_is_string) value = "'" + value + "'"; add = "'" + override_name + "':" + value; actual = "{" + contents + add + ",}"; } void col_hue(vector color; int seed; float spread) { } vector noise_vref (vector p; string operator) { float px = p[0]; float py = p[1]; float pz = p[2]; float amp = detail("op:" + operator , "amp" ); float f = detail("op:" + operator , "f" ); float fx = detail("op:" + operator , "fx" ); float fy = detail("op:" + operator , "fy" ); float fz = detail("op:" + operator , "fz" ); float s = detail("op:" + operator , "s" ); float sx = detail("op:" + operator , "sx" ); float sy = detail("op:" + operator , "sy" ); float sz = detail("op:" + operator , "sz" ); int turb = detail("op:" + operator , "turb" ); float rough = detail("op:" + operator , "rough" ); float atten = detail("op:" + operator , "atten" ); float ox = detail("op:" + operator , "ox" ); float oy = detail("op:" + operator , "oy" ); float oz = detail("op:" + operator , "oz" ); float time = detail("op:" + operator , "time" ); float x = px * f * fx - ox + s * sx * time; float y = py * f * fy - oy + s * sy * time; float z = pz * f * fz - oz + s * sz * time; vector pos = set(x,y,z); vector noise; noise = onoise(pos, turb, rough, atten); noise = noise * amp; noise[0] = smooth(-1,1,noise[0]); noise[1] = smooth(-1,1,noise[1]); noise[2] = smooth(-1,1,noise[2]); return noise; } vector noise_vstat (float px, py, pz , f, fx, fy, fz, ox, oy, oz; int turb; float rough, atten, amp ) { float x = px * f * fx - ox; float y = py * f * fy - oy; float z = pz * f * fz - oz; vector pos = set(x,y,z); vector noise; noise = onoise(pos, turb, rough, atten); noise = noise * amp; noise[0] = smooth(-1,1,noise[0]); noise[1] = smooth(-1,1,noise[1]); noise[2] = smooth(-1,1,noise[2]); return noise; } vector noise_vanim (float px, py, pz , f, fx, fy, fz, s, sx, sy, sz, ox, oy, oz, time; int turb; float rough, atten, amp ) { float x = px * f * fx - ox + s * sx * time; float y = py * f * fy - oy + s * sy * time; float z = pz * f * fz - oz + s * sz * time; vector pos = set(x,y,z); vector noise; noise = onoise(pos, turb, rough, atten); noise = noise * amp; noise[0] = smooth(-1,1,noise[0]); noise[1] = smooth(-1,1,noise[1]); noise[2] = smooth(-1,1,noise[2]); return noise; } float noise_fstat ( float pos, f, offset, turb, rough, atten, amp ) { float sample = pos * f - offset; float noise; noise = onoise(sample, turb, rough, atten); noise = noise * amp; noise = smooth(-1,1,noise); return noise; } float noise_fanim ( float px, py, f, sx, sy, ox, oy, time; int turb; float rough, atten, amp ) { float x = px * f - ox + sx * time; float y = py * f - oy + sy * time; float z = 12.3456789; vector pos = set(x,y,z); vector noise; noise = onoise(pos, turb, rough, atten); noise = noise * amp; float noise_x = getcomp(noise, 0); noise_x = smooth(-1,1,noise_x); return noise_x; }