INDX
INDEX_SECTION �f�� houdini.hdalibrary � f�� 2MysteryPancake::Sop/fast_straight_skeleton_3d::1.0 � �8f�� .MysteryPancake::fast_straight_skeleton_3d::1.0 Fast Straight Skeleton 3D loplib:/MysteryPancake::Sop/fast_straight_skeleton_3d::1.0?MysteryPancake::Sop/fast_straight_skeleton_3d::1.0 Aopdef:/MysteryPancake::Sop/fast_straight_skeleton_3d::1.0?IconSVG Sop �guide=VIZ inputcolors='2 "RGB 1 0.725 0" "RGB 0.6 0.6 0.6" ' outputcolors='2 "RGB 1 0.725 0" "RGB 0.6 0.6 0.6" ' visibleoutputs=2 f�� INDX DialogScript 7�f�� TypePropertiesOptions 7� .f�� Help 8� f�� Tools.shelf 8� f�� InternalFileOptions ;� 0f�� Contents.gz < u�f�� CreateScript �� �f�� IconSVG �r �f�h� ExtraFileOptions �# f��# Dialog script for MysteryPancake::fast_straight_skeleton_3d::1.0 automatically generated
{
name MysteryPancake::fast_straight_skeleton_3d::1.0
script MysteryPancake::fast_straight_skeleton_3d::1.0
label "Fast Straight Skeleton 3D"
help {
""
}
inputlabel 1 "Animated Geometry"
inputlabel 2 "(Optional) Rest Geometry"
inputlabel 3 "Sub-Network Input #3"
inputlabel 4 "Sub-Network Input #4"
outputlabel 1 "Animated Skeleton"
outputlabel 2 "Rest Skeleton"
outputlabel 3 "Animated Pose"
parm {
name "use_freeze"
label "use_freeze"
type toggle
nolabel
joinnext
default { "off" }
help "Whether to reuse eigenvectors from a specific frame. This is recommended for animated geometry with fixed topology."
parmtag { "script_callback_language" "python" }
}
parm {
name "freeze_frame"
label "Freeze Rest Frame"
type integer
default { "1" }
help "Frame to reuse eigenvectors from. This is recommended for animated geometry with fixed topology."
disablewhen "{ use_freeze == 0 }"
range { 1 240 }
parmtag { "autoscope" "0000000000000000" }
parmtag { "script_callback_language" "python" }
}
group {
name "shaping"
label "Shaping"
groupsimple {
name "slicing"
label "Slicing"
parm {
name "sampling_mode"
label "Slices Per Piece"
type ordinal
default { "0" }
help "For disconnected geometry, each piece is processed separately. Uniform divides each piece evenly, and adaptive divides based on the face area."
menu {
"0" "Uniform"
"1" "Adaptive"
}
parmtag { "script_callback_language" "python" }
}
parm {
name "slices"
label "Slices"
type integer
default { "100" }
help "Number of divisions per piece. In uniform mode, each piece gets the same number of divisions."
hidewhen "{ sampling_mode != 0 }"
range { 2! 500 }
parmtag { "autoscope" "0000000000000000" }
parmtag { "script_callback_language" "python" }
}
parm {
name "density"
label "Density"
type float
default { "50" }
help "Number of divisions multiplied by face area."
hidewhen "{ sampling_mode != 1 }"
range { 0! 1000 }
parmtag { "script_callback_language" "python" }
}
parm {
name "remove_pieces"
label "Remove Tiny Pieces"
type toggle
default { "on" }
help "Skip pieces with less than 2 segments."
hidewhen "{ sampling_mode != 1 }"
parmtag { "script_callback_language" "python" }
}
parm {
name "centroid_method"
label "Centroid Positions"
type ordinal
default { "bbox" }
help "Method of finding the center of chunks after slicing. Bounding Box Center works well for thick meshes, and Center of Mass for thin meshes."
menu {
"com" "Center of Mass"
"bbox" "Bounding Box Center"
"convexhull" "Convex Hull Center"
}
parmtag { "autoscope" "0000000000000000" }
parmtag { "script_callback_language" "python" }
}
}
groupsimple {
name "laplacian"
label "Laplacian"
parm {
name "use_minimal"
label "Construction"
type ordinal
default { "1" }
help "Triangulate the mesh and skip cleaning the matrices. This is faster but may produce different results."
menu {
"0" "Full"
"1" "Minimal"
}
parmtag { "script_callback_language" "python" }
}
parm {
name "diffusion"
label "Diffusion Matrix"
type toggle
nolabel
joinnext
default { "on" }
help "Whether to use diffusion when calculating the Laplacian. This can smooth out results for complex geometry."
parmtag { "autoscope" "0000000000000000" }
parmtag { "script_callback_language" "python" }
}
parm {
name "diffusioncoeff"
label "Diffusion Coefficient"
type float
default { "1" }
help "The diffusion coefficient to use when calculating the Laplacian. This can smooth out results for complex geometry."
disablewhen "{ diffusion != 1 }"
range { -5 5 }
parmtag { "autoscope" "0000000000000000" }
parmtag { "script_callback_language" "python" }
}
parm {
name "triangulate"
label "Triangulate Mesh"
type toggle
default { "off" }
help "Triangulate the input before processing. The Laplacian is faster to calculate on triangular meshes, but may produce different results."
hidewhen "{ use_minimal == 1 }"
parmtag { "script_callback_language" "python" }
}
}
groupsimple {
name "eigenvector3"
label "Eigenvector"
parm {
name "eigenvector"
label "Eigenvector"
type integer
default { "1" }
help "Which eigenvector controls the flow. The first is the Fiedler vector, the 2nd lowest vibration mode. It usually captures the structure well. If not, try increasing this by 1 until it looks better."
range { 1! 20 }
parmtag { "autoscope" "0000000000000000" }
parmtag { "script_callback_language" "python" }
}
parm {
name "solver_shift"
label "Eigensolver Shift"
type float
default { "-0.001" }
help "Real shift value of the iterative solver used to solve the eigenvectors of the Laplacian. In theory this shouldn't need to be changed, but in practice it can improve the result."
range { -0.01 0.01 }
parmtag { "autoscope" "0000000000000000" }
parmtag { "script_callback_language" "python" }
}
parm {
name "viz_flow"
label "Visualize Flow"
type toggle
default { "0" }
help "Visualize the flow of the eigenvector using colored slices."
parmtag { "script_callback_language" "python" }
}
parm {
name "flow_ramp"
label "Color Mapping"
type ramp_rgb
default { "2" }
help "The color scheme used to visualize the eigenvector."
hidewhen "{ viz_flow == 0 }"
range { 1! 10 }
parmtag { "autoscope" "0000000000000000" }
parmtag { "rampcolordefault" "1pos ( 0 ) 1c ( 1 0 0 ) 1interp ( linear ) 2pos ( 1 ) 2c ( 1 1 1 ) 2interp ( linear )" }
parmtag { "rampcolortype" "rgb" }
parmtag { "rampshowcontrolsdefault" "0" }
parmtag { "script_callback_language" "python" }
}
}
}
group {
name "shaping_1"
label "Rigging"
parm {
name "prevent_cycles"
label "prevent_cycles"
type toggle
nolabel
joinnext
default { "on" }
help "Although this node rebuilds the skeleton order to fix KineFX errors, this won't prevent actual cycles from forming. These cycles need to be removed first."
parmtag { "script_callback_language" "python" }
}
parm {
name "cycles_strategy"
label "Prevent Cycles"
type ordinal
default { "0" }
help "Cycles can be prevented either by splitting or removing the points. Splitting keeps the appearance of the skeleton intact."
disablewhen "{ prevent_cycles == 0 }"
menu {
"0" "Split"
"1" "Delete"
}
parmtag { "script_callback_language" "python" }
}
parm {
name "add_names"
label "Initialize Names"
type toggle
nolabel
joinnext
default { "on" }
help "Whether to add a name attribute based on the point index. KineFX skeletons require a name attribute."
parmtag { "script_callback_language" "python" }
}
parm {
name "prefix"
label "Initialize Names"
type string
default { "point_" }
help "The name prefix for each point to use, followed by its index."
disablewhen "{ add_names == 0 }"
parmtag { "script_callback_language" "python" }
}
parm {
name "add_transforms"
label "Initialize Transforms"
type toggle
default { "on" }
help "Whether to add transform and localtransform attributes set to identity."
parmtag { "script_callback_language" "python" }
}
parm {
name "orient_animated"
label "Re-Orient Animated Skeleton"
type toggle
default { "on" }
help "Whether to reorient the transforms of the animated skeleton based on the rest skeleton. This may produce cyclic errors."
hidewhen "{ add_transforms == 0 }"
parmtag { "script_callback_language" "python" }
}
parm {
name "orient_joints"
label "Re-Orient Rest Joints"
type toggle
default { "on" }
help "Whether to reorient the rest transforms to point to the next joint in the chain. This may produce cyclic errors."
hidewhen "{ add_transforms == 0 }"
parmtag { "script_callback_language" "python" }
}
parm {
name "child_vector"
label "Vector To Child"
type vector
size 3
default { "0" "0" "1" }
help "The local space vector of the point's transform that should point toward the point's child."
disablewhen "{ orient_joints == 0 }"
hidewhen "{ add_transforms == 0 } { orient_joints == 0 }"
range { -1 1 }
parmtag { "script_callback_language" "python" }
}
}
group {
name "shaping_2"
label "Resampling"
parm {
name "enable_resampling"
label "Enable Resampling"
type toggle
default { "0" }
parmtag { "script_callback_language" "python" }
}
parm {
name "resampling_mode"
label "Mode"
type ordinal
default { "0" }
hidewhen "{ enable_resampling == 0 }"
menu {
"0" "Length"
"1" "Segments"
}
parmtag { "script_callback_language" "python" }
}
parm {
name "length"
label "Max Length"
type float
default { "0.1" }
hidewhen "{ enable_resampling == 0 } { resampling_mode != 0 }"
range { 0! 1 }
parmtag { "autoscope" "0000000000000000" }
parmtag { "units" "m1" }
}
parm {
name "segs"
label "Max Segments"
type integer
default { "9" }
hidewhen "{ enable_resampling == 0 } { resampling_mode != 1 }"
range { 1! 50 }
parmtag { "autoscope" "0000000000000000" }
parmtag { "script_callback_language" "python" }
}
}
group {
name "shaping_3"
label "Advanced"
parm {
name "epsilon"
label "Laplacian Epsilon"
type float
default { "0.0001" }
help "A small positive number to avoid division by zero when computing the Laplacian. This usually doesn't need to be changed."
range { 0! 0.1 }
parmtag { "autoscope" "0000000000000000" }
parmtag { "script_callback_language" "python" }
}
parm {
name "solver_tolerance"
label "Eigensolver Tolerance"
type float
default { "0.0001" }
help "Relative error tolerance of the iterative solver used to solve the eigenvectors of the Laplacian. Increase this if the solver is taking too long to converge."
range { 0! 0.1 }
parmtag { "autoscope" "0000000000000000" }
parmtag { "script_callback_language" "python" }
}
parm {
name "even_slicing"
label "Even Slicing"
type toggle
default { "1" }
help "Bases the slicing on the order of the eigenvectors rather than their strength. This improves the result for steep eigenvectors."
parmtag { "script_callback_language" "python" }
}
}
}
CheckExternal := 1;
ContentsCompressionType := 1;
ForbidOutsideParms := 1;
GzipContents := 1;
LockContents := 1;
MakeDefault := 1;
ParmsFromVfl := 0;
PrefixDroppedParmLabel := 0;
PrefixDroppedParmName := 0;
SaveCachedCode := 0;
SaveIcon := 1;
SaveSpareParms := 0;
UnlockOnCreate := 0;
UseDSParms := 1;
SOP
$HDA_TABLE_AND_NAME
Digital Assets
nodeconntype nodeparmtype � ���r#I�(�y�ۄMkf�k�LZ\/̵)����x�͙����ə��Tevu�ͬA#@T"b��U���N��L���I}�L��6��~A�˻�Fv���x @2I�T'?�q���9�������Od��|��}t]�W?i+Vu��&�kY3QU�嫩���>:x���8�s��4����^}�����_��Ͽ|������寿|��_�D�ѣ��؎�<�c7z��뜿�in���`m ����m=�"Mc�����$��Ro{�xtz�� ����}Nj�L�9��#>F����x��߶�/�(�\�r���n>��=�ݫ����~P>P�Y���2����,W6�F�_|�ۃ���>���N^?{������?������������`�:�^A+����x�������������Q���_�_��OsB;8�����_��i��D?�w�p?������?��i㟗g��������m�����O����_��}Ob���~;��9������]������W��߲ϟ�������f��/��OW&��
�~���Y
��C ��fŏ���O���Y�\�4��*����3�Cxl���q��$�|���O1~��_ Y2d���C�)�x�.�t�Q���MFm~��~��}G���0J_��:���l���~���2-�meZH�;�t���:o���wp��җa�&r F�.?�))�pK��'9��+߽z��F���@�K���ޱ������T�cxŧ�ӂ4���/��g��� b�����O���ÿ�Xdqa��țo~��WϾ��O����=M�U.3���;��WhF=�1��!�zX��~��w�s�W��p�Z��
Џ���}��e�;���/���qx�b}C���|�MC1\�E���)
�gQ���P�.bs�~��N�)A}XC9�N�O_���ߣ�Ђ�Z�=K©�����l���a�0Ð�O4�
i@=]8�|�mQӫ�'�
�b6s�
�ǦS3qc�#���]��1�8�R�~��,1gt���U<���߇���̄孽җ��^�zM]j�ԾEh�~��-���t"���o��{��