├── scripts ├── python │ ├── animManager │ │ ├── __init__.py │ │ └── animManager.ui │ ├── pathbrowser │ │ └── __init__.py │ ├── BasePythonPanel │ │ ├── __init__.py │ │ └── BasePanel.py │ ├── LVProjectManager │ │ ├── notes │ │ └── LVProjectManager.ui │ ├── deprecated │ │ ├── graph │ │ │ ├── __init__.py │ │ │ ├── __pycache__ │ │ │ │ ├── graph.cpython-39.pyc │ │ │ │ ├── __init__.cpython-39.pyc │ │ │ │ └── texManager.cpython-39.pyc │ │ │ ├── prefs.json │ │ │ ├── graph.ui │ │ │ └── graph.py │ │ ├── PBRBuilder │ │ │ ├── __init__.py │ │ │ ├── prefs.json │ │ │ └── __pycache__ │ │ │ │ ├── __init__.cpython-39.pyc │ │ │ │ ├── PBRBuilder.cpython-39.pyc │ │ │ │ └── texManager.cpython-39.pyc │ │ ├── texManager │ │ │ ├── __init__.py │ │ │ ├── __pycache__ │ │ │ │ ├── __init__.cpython-39.pyc │ │ │ │ └── texManager.cpython-39.pyc │ │ │ └── prefs.json │ │ ├── HDRIManager │ │ │ ├── __init__.py │ │ │ ├── favs.json │ │ │ ├── prefs.json │ │ │ ├── icon │ │ │ │ ├── error.png │ │ │ │ ├── fav1.png │ │ │ │ ├── fav2.png │ │ │ │ ├── good.png │ │ │ │ ├── error2.png │ │ │ │ ├── missing.png │ │ │ │ └── warning.png │ │ │ └── __pycache__ │ │ │ │ ├── __init__.cpython-39.pyc │ │ │ │ ├── HDRIManager.cpython-39.pyc │ │ │ │ └── texManager.cpython-39.pyc │ │ ├── RSLightLink │ │ │ ├── __init__.py │ │ │ ├── icon │ │ │ │ ├── on.png │ │ │ │ ├── off.png │ │ │ │ └── checkmark.svg │ │ │ ├── __pycache__ │ │ │ │ ├── __init__.cpython-39.pyc │ │ │ │ ├── RSLightLink.cpython-39.pyc │ │ │ │ └── texManager.cpython-39.pyc │ │ │ ├── item.ui │ │ │ └── RSLightLink.ui │ │ ├── RSLightMixer │ │ │ ├── __init__.py │ │ │ ├── __pycache__ │ │ │ │ ├── __init__.cpython-39.pyc │ │ │ │ ├── texManager.cpython-39.pyc │ │ │ │ └── RSLightMixer.cpython-39.pyc │ │ │ ├── RSLightMixer.ui │ │ │ ├── RSLightMixer.py │ │ │ └── item.ui │ │ ├── easeManager │ │ │ ├── __init__.py │ │ │ ├── __pycache__ │ │ │ │ ├── __init__.cpython-310.pyc │ │ │ │ ├── __init__.cpython-39.pyc │ │ │ │ ├── easeManager.cpython-310.pyc │ │ │ │ └── texManager.cpython-39.pyc │ │ │ └── ease │ │ │ │ └── ease000.json │ │ ├── keyframeAssistant │ │ │ ├── __init__.py │ │ │ ├── ui.py │ │ │ ├── __pycache__ │ │ │ │ ├── __init__.cpython-39.pyc │ │ │ │ ├── __init__.cpython-310.pyc │ │ │ │ ├── texManager.cpython-39.pyc │ │ │ │ ├── keyframeAssistant.cpython-310.pyc │ │ │ │ └── keyframeAssistant.cpython-39.pyc │ │ │ └── prefs.json │ │ ├── stickyController │ │ │ ├── __init__.py │ │ │ ├── __pycache__ │ │ │ │ ├── __init__.cpython-39.pyc │ │ │ │ └── stickyController.cpython-39.pyc │ │ │ ├── stickyController.py │ │ │ └── BasePanel.ui │ │ └── easecontrol │ │ │ ├── __pycache__ │ │ │ ├── flip.cpython-39.pyc │ │ │ ├── flipX.cpython-39.pyc │ │ │ └── flipY.cpython-39.pyc │ │ │ ├── flipX.py │ │ │ ├── flipY_simple Working.py │ │ │ └── flip.py │ ├── gradientManager │ │ └── __init__.py │ ├── projectFolder.py │ ├── lvnodeutils │ │ ├── commands.json │ │ ├── test.py │ │ ├── lvnodeutils.ui │ │ └── lvnodeutils.py │ ├── README.md │ ├── LVTimelineUtils.py │ ├── tex.py │ ├── LVUpdater.py │ ├── camutils.py │ ├── LVPlaybarUtils.py │ ├── stickyparent.py │ ├── LVRender.py │ ├── LVMatUtils.py │ ├── LVRenderUtils.py │ ├── LVLightUtils.py │ ├── knotcontrol.py │ ├── LVAI.py │ ├── quickmarks │ │ └── quickmarks.ui │ ├── LVAnimTools.py │ ├── rampSave.py │ ├── LVRadMenu.py │ └── HDAUtils.py ├── 123.py └── 456.py ├── lv.png ├── default.hiplc ├── util └── renderpaths ├── otls ├── LV.Mat.hda ├── LV.Alembic.hda ├── lv_mat.2.hdalc ├── LV.FitFloat.hdalc ├── LV.Mat.1.0.hdalc ├── LV.Slicer.hdalc ├── LV.UVCycle.hdalc ├── LV.Gnomon.1.0.hdalc ├── LV.MakeBlend.hdalc ├── LV.Roller.1.0.hdalc ├── LV.SimpleROP.hdalc ├── LV.Slicer.1.3.hdalc ├── LV.Alembic.1.0.hdalc ├── LV.Alembic.2.0.hdalc ├── LV.Backdrop.1.0.hdalc ├── LV.Balancer.1.1.hdalc ├── LV.CamGuides.1.0.hdalc ├── LV.DrawRamp.1.0.hdalc ├── LV.EasyGroup.1.0.hdalc ├── LV.GSG_Mat.1.0.hdalc ├── LV.IMResize.1.0.hdalc ├── LV.SafeBevel.1.0.hdalc ├── LV.SplitPath.1.0.hdalc ├── LV.UV2WORLD.1.0.hdalc ├── LV.Variant.1.0.hdalc ├── LV.WORLD2UV.1.0.hdalc ├── LV.WORLD2UV.2.0.hdalc ├── LV.BevelCurve.1.0.hdalc ├── LV.BlendByAtt.1.1.hdalc ├── LV.EaseManager.1.0.hdalc ├── LV.InlineChop.1.0.hdalc ├── LV.UVMatchSize.1.0.hdalc ├── LV.VDBBoolean.1.0.hdalc ├── LV.dev.Enable.1.0.hdalc ├── Clip_by_Attribute.2.0.hdalc ├── LV.3DPrintOutput.1.0.hdalc ├── LV.Clipandmirror.1.0.hdalc ├── LV.CycleAttribute.1.0.hdalc ├── LV.Deletepieces.1.0.hdalc ├── LV.DoubleResample.1.0.hdalc ├── LV.FloodAttribute.1.0.hdalc ├── LV.InfiniteBlend.1.0.hdalc ├── LV.LargestPiece.1.0.hdalc ├── LV.MoveAlongPath.1.0.hdalc ├── LV.PointsOnCurve.1.0.hdalc ├── LV.SimpleRetime.1.0.hdalc ├── LV.build_tilemap.1.0.hdalc ├── LV.dev.TimeWarp.1.0.hdalc ├── LV.dev.TimeWarp.2.0.hdalc ├── LV.dev.lv_handler.1.0.hdalc ├── LV.lv_fisheye.1.0.hdalcbak ├── LV.lv_tile_sample.1.0.hdalc ├── LV.shape_builder.1.0.hdalc ├── LV.ClipByAttribute.1.0.hdalc ├── LV.PaleteFromImage.1.0.hdalc ├── LV.Radial_Symmetry.1.0.hdalc ├── LV.Radial_Symmetry.1.1.hdalc ├── LV.RoundCornerCurve.1.0.hdalc ├── LV.lv_move_to_udim.1.0.hdalc ├── LV.lv_path_browser.1.0.hdalc ├── LV.trimcurvelength.1.0.hdalc ├── LV.dev.PointsOnCurve.1.0.hdalc ├── LV.dev.PointsOnCurve.1.1.hdalc ├── LV.dev.VellumTimeShift.1.0.hdalc ├── LV.lv_attribute_clone.1.0.hdalc ├── LV.lv_source_multi_res.1.0.hdalc ├── LV.trimcurvelengthGRAD.1.0.hdalc ├── LV.StickyNoteController.1.0.hdalc ├── LV.lv_angled_tile_sample.1.0.hdalc ├── LV.lv_quantize_attribute.1.0.hdalc ├── PIC-TWO.lv_light_target.1.0.hdalc ├── LV.lv_attribute_from_bounds.1.0.hdalc └── rename.py ├── backup └── default_bak2.hiplc ├── presets ├── Sop │ ├── attribdelete.idx │ └── blast.idx └── Top │ └── genericgenerator.idx ├── vex └── include │ └── lvutils.h ├── LVTools.json ├── python3.10libs ├── __pycache__ │ ├── extra.cpython-39.pyc │ ├── extra.cpython-310.pyc │ ├── nodegraphhooks.cpython-310.pyc │ ├── nodegraphhooks.cpython-39.pyc │ └── nodegraphtitle.cpython-39.pyc ├── nodegraphhooks.pybak ├── nodegraphtitle.pybak └── extra.py ├── expressions └── LVExpressions.expr ├── help └── nodes │ └── Sop │ ├── LV--lv_mat.txt │ ├── LV_WORLD2UV.txt │ ├── LV_Roller.txt │ ├── LV--GSG_Mat.txt │ ├── LV_Deletepieces.txt │ ├── LV_Gnomon.txt │ ├── lv_variant.txt │ ├── LV_UV2W.txt │ ├── LV--InlineChop.txt │ ├── LV_BevelCurve.txt │ ├── LV_MakeBlend.txt │ ├── LV_RoundCornerCurve.txt │ ├── LV--trimcurvelength.txt │ ├── LV--trimcurvelengthGRAD.txt │ ├── LV_largestprim.txt │ ├── LV_EaseManager.txt │ ├── lv_mat.txt │ ├── Clip_by_Attribute.txt │ ├── LV_SplitPath.txt │ ├── LV_Clipandmirror.txt │ ├── LV_VDBBoolean.txt │ ├── LV_EasyGroup.txt │ ├── LV--Radial_Symmetry.txt │ ├── LV--LV_FloodAttribute.txt │ ├── LV_Draw_Ramp.txt │ ├── LV--SafeBevel.txt │ ├── LV_Double_Resample.txt │ ├── LV_SimpleRetime.txt │ ├── LV_movealongpath.txt │ ├── LV_Alembic.txt │ ├── LV_fitfloat.txt │ ├── LV_Slicer.txt │ ├── LV_blendbyatt.txt │ ├── LV--LV_Backdrop.txt │ ├── LV--PaleteFromImage.txt │ ├── LV_3D_Print_Output.txt │ ├── PIC_TWO--LV_StickyNoteController.txt │ ├── LV--LV_UVMatchSize.txt │ ├── LV_CycleAttribute.txt │ ├── LV_Balancer.txt │ └── LV_Path.txt ├── prefs.json ├── python3.9libs ├── nodegraphhooks.py └── extra.py ├── .gitignore ├── PlaybarMenu.xml ├── lv.svg ├── codeswap └── swap.txt ├── python_panels ├── deprecated │ ├── LVGraph.pypanel │ ├── LVHDRIManager.pypanel │ ├── LVEaseManager.pypanel │ ├── LVStickyController.pypanel │ ├── LVPBRBuilder.pypanel │ ├── LVTexManager.pypanel │ ├── LVKeyframeAssistant.pypanel │ ├── LVRSLightMixer.pypanel │ ├── LVRSLightLink.pypanel │ └── LV.pypanel ├── LVNodeShare.pypanel ├── LVAnimationManager.pypanel ├── LVRampManager.pypanel ├── LVNodeUtils.pypanel ├── LVProjectManager.pypanel └── LVPathBrowser.pypanel ├── config └── NodeShapes │ ├── sideways.json │ └── controller.json ├── README.md ├── radialmenu └── LVNetwork.radialmenu ├── MainMenuCommon.xml ├── windows_installer.ps1 ├── OPmenu.xml ├── PARMmenu.xml └── toolbar └── LV_Dev.shelf /scripts/python/animManager/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /scripts/python/pathbrowser/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /scripts/python/BasePythonPanel/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /scripts/python/LVProjectManager/notes: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /scripts/python/deprecated/graph/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /scripts/python/gradientManager/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /scripts/python/deprecated/PBRBuilder/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /scripts/python/deprecated/texManager/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /scripts/python/deprecated/HDRIManager/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /scripts/python/deprecated/RSLightLink/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /scripts/python/deprecated/RSLightMixer/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /scripts/python/deprecated/easeManager/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /scripts/python/deprecated/keyframeAssistant/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /scripts/python/deprecated/stickyController/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /scripts/python/deprecated/HDRIManager/favs.json: -------------------------------------------------------------------------------- 1 | {"favs": []} -------------------------------------------------------------------------------- /lv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/lv.png -------------------------------------------------------------------------------- /default.hiplc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/default.hiplc -------------------------------------------------------------------------------- /util/renderpaths: -------------------------------------------------------------------------------- 1 | $HIP/render/$HIPNAME.$F4.png 2 | $HIP/render/$HIPNAME/$HIPNAME.$F4.png -------------------------------------------------------------------------------- /otls/LV.Mat.hda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/LV.Mat.hda -------------------------------------------------------------------------------- /otls/LV.Alembic.hda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/LV.Alembic.hda -------------------------------------------------------------------------------- /otls/lv_mat.2.hdalc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/lv_mat.2.hdalc -------------------------------------------------------------------------------- /otls/LV.FitFloat.hdalc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/LV.FitFloat.hdalc -------------------------------------------------------------------------------- /otls/LV.Mat.1.0.hdalc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/LV.Mat.1.0.hdalc -------------------------------------------------------------------------------- /otls/LV.Slicer.hdalc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/LV.Slicer.hdalc -------------------------------------------------------------------------------- /otls/LV.UVCycle.hdalc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/LV.UVCycle.hdalc -------------------------------------------------------------------------------- /otls/LV.Gnomon.1.0.hdalc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/LV.Gnomon.1.0.hdalc -------------------------------------------------------------------------------- /otls/LV.MakeBlend.hdalc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/LV.MakeBlend.hdalc -------------------------------------------------------------------------------- /otls/LV.Roller.1.0.hdalc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/LV.Roller.1.0.hdalc -------------------------------------------------------------------------------- /otls/LV.SimpleROP.hdalc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/LV.SimpleROP.hdalc -------------------------------------------------------------------------------- /otls/LV.Slicer.1.3.hdalc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/LV.Slicer.1.3.hdalc -------------------------------------------------------------------------------- /backup/default_bak2.hiplc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/backup/default_bak2.hiplc -------------------------------------------------------------------------------- /otls/LV.Alembic.1.0.hdalc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/LV.Alembic.1.0.hdalc -------------------------------------------------------------------------------- /otls/LV.Alembic.2.0.hdalc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/LV.Alembic.2.0.hdalc -------------------------------------------------------------------------------- /otls/LV.Backdrop.1.0.hdalc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/LV.Backdrop.1.0.hdalc -------------------------------------------------------------------------------- /otls/LV.Balancer.1.1.hdalc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/LV.Balancer.1.1.hdalc -------------------------------------------------------------------------------- /otls/LV.CamGuides.1.0.hdalc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/LV.CamGuides.1.0.hdalc -------------------------------------------------------------------------------- /otls/LV.DrawRamp.1.0.hdalc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/LV.DrawRamp.1.0.hdalc -------------------------------------------------------------------------------- /otls/LV.EasyGroup.1.0.hdalc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/LV.EasyGroup.1.0.hdalc -------------------------------------------------------------------------------- /otls/LV.GSG_Mat.1.0.hdalc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/LV.GSG_Mat.1.0.hdalc -------------------------------------------------------------------------------- /otls/LV.IMResize.1.0.hdalc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/LV.IMResize.1.0.hdalc -------------------------------------------------------------------------------- /otls/LV.SafeBevel.1.0.hdalc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/LV.SafeBevel.1.0.hdalc -------------------------------------------------------------------------------- /otls/LV.SplitPath.1.0.hdalc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/LV.SplitPath.1.0.hdalc -------------------------------------------------------------------------------- /otls/LV.UV2WORLD.1.0.hdalc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/LV.UV2WORLD.1.0.hdalc -------------------------------------------------------------------------------- /otls/LV.Variant.1.0.hdalc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/LV.Variant.1.0.hdalc -------------------------------------------------------------------------------- /otls/LV.WORLD2UV.1.0.hdalc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/LV.WORLD2UV.1.0.hdalc -------------------------------------------------------------------------------- /otls/LV.WORLD2UV.2.0.hdalc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/LV.WORLD2UV.2.0.hdalc -------------------------------------------------------------------------------- /scripts/python/deprecated/HDRIManager/prefs.json: -------------------------------------------------------------------------------- 1 | {"currentIndex": "-1", "gsglib": "D:\\Assets\\GSG Library\\"} -------------------------------------------------------------------------------- /otls/LV.BevelCurve.1.0.hdalc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/LV.BevelCurve.1.0.hdalc -------------------------------------------------------------------------------- /otls/LV.BlendByAtt.1.1.hdalc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/LV.BlendByAtt.1.1.hdalc -------------------------------------------------------------------------------- /otls/LV.EaseManager.1.0.hdalc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/LV.EaseManager.1.0.hdalc -------------------------------------------------------------------------------- /otls/LV.InlineChop.1.0.hdalc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/LV.InlineChop.1.0.hdalc -------------------------------------------------------------------------------- /otls/LV.UVMatchSize.1.0.hdalc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/LV.UVMatchSize.1.0.hdalc -------------------------------------------------------------------------------- /otls/LV.VDBBoolean.1.0.hdalc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/LV.VDBBoolean.1.0.hdalc -------------------------------------------------------------------------------- /otls/LV.dev.Enable.1.0.hdalc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/LV.dev.Enable.1.0.hdalc -------------------------------------------------------------------------------- /presets/Sop/attribdelete.idx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/presets/Sop/attribdelete.idx -------------------------------------------------------------------------------- /otls/Clip_by_Attribute.2.0.hdalc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/Clip_by_Attribute.2.0.hdalc -------------------------------------------------------------------------------- /otls/LV.3DPrintOutput.1.0.hdalc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/LV.3DPrintOutput.1.0.hdalc -------------------------------------------------------------------------------- /otls/LV.Clipandmirror.1.0.hdalc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/LV.Clipandmirror.1.0.hdalc -------------------------------------------------------------------------------- /otls/LV.CycleAttribute.1.0.hdalc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/LV.CycleAttribute.1.0.hdalc -------------------------------------------------------------------------------- /otls/LV.Deletepieces.1.0.hdalc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/LV.Deletepieces.1.0.hdalc -------------------------------------------------------------------------------- /otls/LV.DoubleResample.1.0.hdalc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/LV.DoubleResample.1.0.hdalc -------------------------------------------------------------------------------- /otls/LV.FloodAttribute.1.0.hdalc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/LV.FloodAttribute.1.0.hdalc -------------------------------------------------------------------------------- /otls/LV.InfiniteBlend.1.0.hdalc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/LV.InfiniteBlend.1.0.hdalc -------------------------------------------------------------------------------- /otls/LV.LargestPiece.1.0.hdalc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/LV.LargestPiece.1.0.hdalc -------------------------------------------------------------------------------- /otls/LV.MoveAlongPath.1.0.hdalc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/LV.MoveAlongPath.1.0.hdalc -------------------------------------------------------------------------------- /otls/LV.PointsOnCurve.1.0.hdalc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/LV.PointsOnCurve.1.0.hdalc -------------------------------------------------------------------------------- /otls/LV.SimpleRetime.1.0.hdalc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/LV.SimpleRetime.1.0.hdalc -------------------------------------------------------------------------------- /otls/LV.build_tilemap.1.0.hdalc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/LV.build_tilemap.1.0.hdalc -------------------------------------------------------------------------------- /otls/LV.dev.TimeWarp.1.0.hdalc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/LV.dev.TimeWarp.1.0.hdalc -------------------------------------------------------------------------------- /otls/LV.dev.TimeWarp.2.0.hdalc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/LV.dev.TimeWarp.2.0.hdalc -------------------------------------------------------------------------------- /otls/LV.dev.lv_handler.1.0.hdalc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/LV.dev.lv_handler.1.0.hdalc -------------------------------------------------------------------------------- /otls/LV.lv_fisheye.1.0.hdalcbak: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/LV.lv_fisheye.1.0.hdalcbak -------------------------------------------------------------------------------- /otls/LV.lv_tile_sample.1.0.hdalc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/LV.lv_tile_sample.1.0.hdalc -------------------------------------------------------------------------------- /otls/LV.shape_builder.1.0.hdalc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/LV.shape_builder.1.0.hdalc -------------------------------------------------------------------------------- /presets/Top/genericgenerator.idx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/presets/Top/genericgenerator.idx -------------------------------------------------------------------------------- /otls/LV.ClipByAttribute.1.0.hdalc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/LV.ClipByAttribute.1.0.hdalc -------------------------------------------------------------------------------- /otls/LV.PaleteFromImage.1.0.hdalc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/LV.PaleteFromImage.1.0.hdalc -------------------------------------------------------------------------------- /otls/LV.Radial_Symmetry.1.0.hdalc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/LV.Radial_Symmetry.1.0.hdalc -------------------------------------------------------------------------------- /otls/LV.Radial_Symmetry.1.1.hdalc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/LV.Radial_Symmetry.1.1.hdalc -------------------------------------------------------------------------------- /otls/LV.RoundCornerCurve.1.0.hdalc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/LV.RoundCornerCurve.1.0.hdalc -------------------------------------------------------------------------------- /otls/LV.lv_move_to_udim.1.0.hdalc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/LV.lv_move_to_udim.1.0.hdalc -------------------------------------------------------------------------------- /otls/LV.lv_path_browser.1.0.hdalc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/LV.lv_path_browser.1.0.hdalc -------------------------------------------------------------------------------- /otls/LV.trimcurvelength.1.0.hdalc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/LV.trimcurvelength.1.0.hdalc -------------------------------------------------------------------------------- /otls/LV.dev.PointsOnCurve.1.0.hdalc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/LV.dev.PointsOnCurve.1.0.hdalc -------------------------------------------------------------------------------- /otls/LV.dev.PointsOnCurve.1.1.hdalc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/LV.dev.PointsOnCurve.1.1.hdalc -------------------------------------------------------------------------------- /otls/LV.dev.VellumTimeShift.1.0.hdalc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/LV.dev.VellumTimeShift.1.0.hdalc -------------------------------------------------------------------------------- /otls/LV.lv_attribute_clone.1.0.hdalc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/LV.lv_attribute_clone.1.0.hdalc -------------------------------------------------------------------------------- /otls/LV.lv_source_multi_res.1.0.hdalc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/LV.lv_source_multi_res.1.0.hdalc -------------------------------------------------------------------------------- /otls/LV.trimcurvelengthGRAD.1.0.hdalc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/LV.trimcurvelengthGRAD.1.0.hdalc -------------------------------------------------------------------------------- /scripts/python/projectFolder.py: -------------------------------------------------------------------------------- 1 | import os 2 | import hou 3 | 4 | def openDir(): 5 | hou.ui.showInFileBrowser(hou.hipFile.path()) -------------------------------------------------------------------------------- /vex/include/lvutils.h: -------------------------------------------------------------------------------- 1 | float rand_range(float arg1; float arg2; float arg3) 2 | { 3 | return fit01(rand(arg1), arg2, arg3); 4 | } -------------------------------------------------------------------------------- /otls/LV.StickyNoteController.1.0.hdalc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/LV.StickyNoteController.1.0.hdalc -------------------------------------------------------------------------------- /otls/LV.lv_angled_tile_sample.1.0.hdalc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/LV.lv_angled_tile_sample.1.0.hdalc -------------------------------------------------------------------------------- /otls/LV.lv_quantize_attribute.1.0.hdalc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/LV.lv_quantize_attribute.1.0.hdalc -------------------------------------------------------------------------------- /otls/PIC-TWO.lv_light_target.1.0.hdalc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/PIC-TWO.lv_light_target.1.0.hdalc -------------------------------------------------------------------------------- /otls/LV.lv_attribute_from_bounds.1.0.hdalc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/otls/LV.lv_attribute_from_bounds.1.0.hdalc -------------------------------------------------------------------------------- /LVTools.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": [ 3 | { 4 | "LV": "D:\Assets\Houdini Packages\LV Tools\Houdini Tools" 5 | } 6 | ], 7 | "path": "$LV" 8 | 9 | } -------------------------------------------------------------------------------- /python3.10libs/__pycache__/extra.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/python3.10libs/__pycache__/extra.cpython-39.pyc -------------------------------------------------------------------------------- /scripts/python/deprecated/PBRBuilder/prefs.json: -------------------------------------------------------------------------------- 1 | {"diffSpace": "sRGB", "roughSpace": "Raw", "bumpSpace": "Auto)", "extraSpace": "ACEScg", "matStyle": "1"} -------------------------------------------------------------------------------- /python3.10libs/__pycache__/extra.cpython-310.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/python3.10libs/__pycache__/extra.cpython-310.pyc -------------------------------------------------------------------------------- /scripts/python/deprecated/RSLightLink/icon/on.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/scripts/python/deprecated/RSLightLink/icon/on.png -------------------------------------------------------------------------------- /scripts/python/deprecated/keyframeAssistant/ui.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/scripts/python/deprecated/keyframeAssistant/ui.py -------------------------------------------------------------------------------- /scripts/python/deprecated/HDRIManager/icon/error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/scripts/python/deprecated/HDRIManager/icon/error.png -------------------------------------------------------------------------------- /scripts/python/deprecated/HDRIManager/icon/fav1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/scripts/python/deprecated/HDRIManager/icon/fav1.png -------------------------------------------------------------------------------- /scripts/python/deprecated/HDRIManager/icon/fav2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/scripts/python/deprecated/HDRIManager/icon/fav2.png -------------------------------------------------------------------------------- /scripts/python/deprecated/HDRIManager/icon/good.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/scripts/python/deprecated/HDRIManager/icon/good.png -------------------------------------------------------------------------------- /scripts/python/deprecated/RSLightLink/icon/off.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/scripts/python/deprecated/RSLightLink/icon/off.png -------------------------------------------------------------------------------- /scripts/python/deprecated/HDRIManager/icon/error2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/scripts/python/deprecated/HDRIManager/icon/error2.png -------------------------------------------------------------------------------- /scripts/python/deprecated/HDRIManager/icon/missing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/scripts/python/deprecated/HDRIManager/icon/missing.png -------------------------------------------------------------------------------- /scripts/python/deprecated/HDRIManager/icon/warning.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/scripts/python/deprecated/HDRIManager/icon/warning.png -------------------------------------------------------------------------------- /expressions/LVExpressions.expr: -------------------------------------------------------------------------------- 1 | # New function detit 2 | detit(i){ 3 | return detail(i,"iteration",0); 4 | } 5 | 6 | quant(t,i){ 7 | return ceil(t/i)*i; 8 | } 9 | -------------------------------------------------------------------------------- /python3.10libs/__pycache__/nodegraphhooks.cpython-310.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/python3.10libs/__pycache__/nodegraphhooks.cpython-310.pyc -------------------------------------------------------------------------------- /python3.10libs/__pycache__/nodegraphhooks.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/python3.10libs/__pycache__/nodegraphhooks.cpython-39.pyc -------------------------------------------------------------------------------- /python3.10libs/__pycache__/nodegraphtitle.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/python3.10libs/__pycache__/nodegraphtitle.cpython-39.pyc -------------------------------------------------------------------------------- /scripts/python/deprecated/graph/__pycache__/graph.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/scripts/python/deprecated/graph/__pycache__/graph.cpython-39.pyc -------------------------------------------------------------------------------- /scripts/python/deprecated/graph/__pycache__/__init__.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/scripts/python/deprecated/graph/__pycache__/__init__.cpython-39.pyc -------------------------------------------------------------------------------- /scripts/python/deprecated/easecontrol/__pycache__/flip.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/scripts/python/deprecated/easecontrol/__pycache__/flip.cpython-39.pyc -------------------------------------------------------------------------------- /scripts/python/deprecated/graph/__pycache__/texManager.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/scripts/python/deprecated/graph/__pycache__/texManager.cpython-39.pyc -------------------------------------------------------------------------------- /scripts/python/deprecated/PBRBuilder/__pycache__/__init__.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/scripts/python/deprecated/PBRBuilder/__pycache__/__init__.cpython-39.pyc -------------------------------------------------------------------------------- /scripts/python/deprecated/easecontrol/__pycache__/flipX.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/scripts/python/deprecated/easecontrol/__pycache__/flipX.cpython-39.pyc -------------------------------------------------------------------------------- /scripts/python/deprecated/easecontrol/__pycache__/flipY.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/scripts/python/deprecated/easecontrol/__pycache__/flipY.cpython-39.pyc -------------------------------------------------------------------------------- /scripts/python/deprecated/texManager/__pycache__/__init__.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/scripts/python/deprecated/texManager/__pycache__/__init__.cpython-39.pyc -------------------------------------------------------------------------------- /scripts/python/deprecated/HDRIManager/__pycache__/__init__.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/scripts/python/deprecated/HDRIManager/__pycache__/__init__.cpython-39.pyc -------------------------------------------------------------------------------- /scripts/python/deprecated/PBRBuilder/__pycache__/PBRBuilder.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/scripts/python/deprecated/PBRBuilder/__pycache__/PBRBuilder.cpython-39.pyc -------------------------------------------------------------------------------- /scripts/python/deprecated/PBRBuilder/__pycache__/texManager.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/scripts/python/deprecated/PBRBuilder/__pycache__/texManager.cpython-39.pyc -------------------------------------------------------------------------------- /scripts/python/deprecated/RSLightLink/__pycache__/__init__.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/scripts/python/deprecated/RSLightLink/__pycache__/__init__.cpython-39.pyc -------------------------------------------------------------------------------- /scripts/python/deprecated/RSLightMixer/__pycache__/__init__.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/scripts/python/deprecated/RSLightMixer/__pycache__/__init__.cpython-39.pyc -------------------------------------------------------------------------------- /scripts/python/deprecated/easeManager/__pycache__/__init__.cpython-310.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/scripts/python/deprecated/easeManager/__pycache__/__init__.cpython-310.pyc -------------------------------------------------------------------------------- /scripts/python/deprecated/easeManager/__pycache__/__init__.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/scripts/python/deprecated/easeManager/__pycache__/__init__.cpython-39.pyc -------------------------------------------------------------------------------- /scripts/python/deprecated/graph/prefs.json: -------------------------------------------------------------------------------- 1 | {"difChecks": "color, colour, col, basecolor, diffuse, Cd, test", "difCS": "ACEScg", "rawChecks": "bump, normal, roughness, rough, ao, .exr, grade", "rawCS": "Raw"} -------------------------------------------------------------------------------- /scripts/python/deprecated/texManager/__pycache__/texManager.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/scripts/python/deprecated/texManager/__pycache__/texManager.cpython-39.pyc -------------------------------------------------------------------------------- /scripts/python/deprecated/HDRIManager/__pycache__/HDRIManager.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/scripts/python/deprecated/HDRIManager/__pycache__/HDRIManager.cpython-39.pyc -------------------------------------------------------------------------------- /scripts/python/deprecated/HDRIManager/__pycache__/texManager.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/scripts/python/deprecated/HDRIManager/__pycache__/texManager.cpython-39.pyc -------------------------------------------------------------------------------- /scripts/python/deprecated/RSLightLink/__pycache__/RSLightLink.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/scripts/python/deprecated/RSLightLink/__pycache__/RSLightLink.cpython-39.pyc -------------------------------------------------------------------------------- /scripts/python/deprecated/RSLightLink/__pycache__/texManager.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/scripts/python/deprecated/RSLightLink/__pycache__/texManager.cpython-39.pyc -------------------------------------------------------------------------------- /scripts/python/deprecated/RSLightMixer/__pycache__/texManager.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/scripts/python/deprecated/RSLightMixer/__pycache__/texManager.cpython-39.pyc -------------------------------------------------------------------------------- /scripts/python/deprecated/easeManager/__pycache__/easeManager.cpython-310.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/scripts/python/deprecated/easeManager/__pycache__/easeManager.cpython-310.pyc -------------------------------------------------------------------------------- /scripts/python/deprecated/easeManager/__pycache__/texManager.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/scripts/python/deprecated/easeManager/__pycache__/texManager.cpython-39.pyc -------------------------------------------------------------------------------- /scripts/123.py: -------------------------------------------------------------------------------- 1 | import hou 2 | import LVLightUtils 3 | from importlib import reload 4 | 5 | reload(LVLightUtils) 6 | 7 | LVLightUtils.light_listen() 8 | hou.hscript('exread "$LV/expressions/LVExpressions.expr"') 9 | -------------------------------------------------------------------------------- /scripts/456.py: -------------------------------------------------------------------------------- 1 | import hou 2 | import LVLightUtils 3 | from importlib import reload 4 | 5 | reload(LVLightUtils) 6 | 7 | LVLightUtils.light_listen() 8 | hou.hscript('exread "$LV/expressions/LVExpressions.expr"') 9 | -------------------------------------------------------------------------------- /scripts/python/deprecated/RSLightMixer/__pycache__/RSLightMixer.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/scripts/python/deprecated/RSLightMixer/__pycache__/RSLightMixer.cpython-39.pyc -------------------------------------------------------------------------------- /scripts/python/deprecated/keyframeAssistant/__pycache__/__init__.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/scripts/python/deprecated/keyframeAssistant/__pycache__/__init__.cpython-39.pyc -------------------------------------------------------------------------------- /scripts/python/deprecated/keyframeAssistant/prefs.json: -------------------------------------------------------------------------------- 1 | {"difChecks": "color, colour, col, basecolor, diffuse, Cd, test", "difCS": "ACEScg", "rawChecks": "bump, normal, roughness, rough, ao, .exr, grade", "rawCS": "Raw"} -------------------------------------------------------------------------------- /scripts/python/deprecated/stickyController/__pycache__/__init__.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/scripts/python/deprecated/stickyController/__pycache__/__init__.cpython-39.pyc -------------------------------------------------------------------------------- /scripts/python/deprecated/keyframeAssistant/__pycache__/__init__.cpython-310.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/scripts/python/deprecated/keyframeAssistant/__pycache__/__init__.cpython-310.pyc -------------------------------------------------------------------------------- /scripts/python/deprecated/keyframeAssistant/__pycache__/texManager.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/scripts/python/deprecated/keyframeAssistant/__pycache__/texManager.cpython-39.pyc -------------------------------------------------------------------------------- /help/nodes/Sop/LV--lv_mat.txt: -------------------------------------------------------------------------------- 1 | = LV Mat Empty = 2 | 3 | == Overview == 4 | 5 | Explanation of the node's purpose and operation. 6 | 7 | @inputs 8 | 9 | Label: 10 | 11 | What the input is for. 12 | 13 | @parameters -------------------------------------------------------------------------------- /help/nodes/Sop/LV_WORLD2UV.txt: -------------------------------------------------------------------------------- 1 | = LV World 2 UV = 2 | 3 | == Overview == 4 | 5 | Explanation of the node's purpose and operation. 6 | 7 | @inputs 8 | 9 | Label: 10 | 11 | What the input is for. 12 | 13 | @parameters -------------------------------------------------------------------------------- /scripts/python/deprecated/stickyController/__pycache__/stickyController.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/scripts/python/deprecated/stickyController/__pycache__/stickyController.cpython-39.pyc -------------------------------------------------------------------------------- /scripts/python/deprecated/keyframeAssistant/__pycache__/keyframeAssistant.cpython-310.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/scripts/python/deprecated/keyframeAssistant/__pycache__/keyframeAssistant.cpython-310.pyc -------------------------------------------------------------------------------- /scripts/python/deprecated/keyframeAssistant/__pycache__/keyframeAssistant.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukevanlukevan/LV-Tools/HEAD/scripts/python/deprecated/keyframeAssistant/__pycache__/keyframeAssistant.cpython-39.pyc -------------------------------------------------------------------------------- /scripts/python/deprecated/texManager/prefs.json: -------------------------------------------------------------------------------- 1 | {"difChecks": "color, colour, col, basecolor, diffuse, Cd, test, Emissive", "difCS": "sRGB", "rawChecks": "bump, Normal, Roughness, Rough, ao, .exr, grade, _Height, _Metallic", "rawCS": "Raw"} -------------------------------------------------------------------------------- /help/nodes/Sop/LV_Roller.txt: -------------------------------------------------------------------------------- 1 | = LV Roller = 2 | 3 | == Overview == 4 | 5 | Explanation of the node's purpose and operation. 6 | 7 | @inputs 8 | 9 | Label: 10 | 11 | What the input is for. 12 | 13 | @parameters 14 | 15 | U: 16 | #U: 17 | float: U -------------------------------------------------------------------------------- /help/nodes/Sop/LV--GSG_Mat.txt: -------------------------------------------------------------------------------- 1 | = LV GSG Mat = 2 | 3 | == Overview == 4 | 5 | Explanation of the node's purpose and operation. 6 | 7 | @inputs 8 | 9 | Label: 10 | 11 | What the input is for. 12 | 13 | @parameters 14 | 15 | matname: 16 | #matname: 17 | string: matname -------------------------------------------------------------------------------- /scripts/python/lvnodeutils/commands.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "label": "Add Random Parm", 4 | "icon": "DATATYPES_parameter", 5 | "command": "lambda: LVParmUtils.addFloatParm(kwargs={'parms': (currentNode.parm('snippet'),)})", 6 | "node": "attribwrangle" 7 | } 8 | ] 9 | 10 | -------------------------------------------------------------------------------- /help/nodes/Sop/LV_Deletepieces.txt: -------------------------------------------------------------------------------- 1 | = LV Delete Pieces = 2 | 3 | == Overview == 4 | 5 | Explanation of the node's purpose and operation. 6 | 7 | @inputs 8 | 9 | Label: 10 | 11 | What the input is for. 12 | 13 | @parameters 14 | 15 | Delete Non Selected: 16 | #negate: 17 | toggle: Delete Non Selected -------------------------------------------------------------------------------- /help/nodes/Sop/LV_Gnomon.txt: -------------------------------------------------------------------------------- 1 | = LV Gnomon = 2 | 3 | == Overview == 4 | 5 | Explanation of the node's purpose and operation. 6 | 7 | @inputs 8 | 9 | Label: 10 | 11 | What the input is for. 12 | 13 | @parameters 14 | 15 | Type: 16 | #type: 17 | menu: Type 18 | 19 | Scale: 20 | #scale: 21 | float: Scale -------------------------------------------------------------------------------- /help/nodes/Sop/lv_variant.txt: -------------------------------------------------------------------------------- 1 | = LV Variant = 2 | 3 | == Overview == 4 | 5 | Explanation of the node's purpose and operation. 6 | 7 | @inputs 8 | 9 | Label: 10 | 11 | What the input is for. 12 | 13 | @parameters 14 | 15 | Type: 16 | #class: 17 | menu: Type 18 | 19 | Variant: 20 | #variant: 21 | int: Variant -------------------------------------------------------------------------------- /scripts/python/README.md: -------------------------------------------------------------------------------- 1 | # Scripts 2 | 3 | # LV AI 4 | 5 | Right now there is a simple shelf tool that adds comments to wrangles to explain what the code does. I can't vouch for anything here, but it can be fun to give it a go. Get an API key [here](https://platform.openai.com/api-keys) and then follow the prompts 6 | -------------------------------------------------------------------------------- /prefs.json: -------------------------------------------------------------------------------- 1 | {"ramp_basis": 5, "ramp_keys": "(0.0, 0.16787439584732056, 0.5507246255874634, 1.0)", "ramp_values": "(1.0, 1.0, 0.03651685267686844, 0.0)", "plot_values": [1.0, 0.9739482402801514, 0.8458456993103027, 0.6504068970680237, 0.44933465123176575, 0.2757076621055603, 0.14910520613193512, 0.07092908024787903, 0.027220867574214935, 0.00829215906560421]} -------------------------------------------------------------------------------- /scripts/python/LVTimelineUtils.py: -------------------------------------------------------------------------------- 1 | import hou # type: ignore 2 | 3 | def set_quickmark(kwargs): 4 | # hou.anim.newBookmark("QM 1", int(hou.frame()), int(hou.frame())) 5 | get_quickmark() 6 | # print(kwargs) 7 | 8 | def get_quickmark(): 9 | marks = hou.anim.bookmarks() 10 | for mark in marks: 11 | hou.setFrame(mark.startFrame()) -------------------------------------------------------------------------------- /help/nodes/Sop/LV_UV2W.txt: -------------------------------------------------------------------------------- 1 | = LV UV 2 World = 2 | 3 | == Overview == 4 | 5 | Explanation of the node's purpose and operation. 6 | 7 | @inputs 8 | 9 | Label: 10 | 11 | What the input is for. 12 | 13 | @parameters 14 | 15 | Freeze Input Geometry: 16 | #freeze: 17 | toggle: Freeze Input Geometry 18 | 19 | Freeze Frame: 20 | #freezeframe: 21 | int: Freeze Frame -------------------------------------------------------------------------------- /help/nodes/Sop/LV--InlineChop.txt: -------------------------------------------------------------------------------- 1 | = LV Inline CHOP = 2 | 3 | == Overview == 4 | 5 | Explanation of the node's purpose and operation. 6 | 7 | @inputs 8 | 9 | Label: 10 | 11 | What the input is for. 12 | 13 | @parameters 14 | 15 | Channel Scope: 16 | #chanscope: 17 | string: Channel Scope 18 | 19 | Attribute Scope: 20 | #attscope: 21 | string: Attribute Scope -------------------------------------------------------------------------------- /help/nodes/Sop/LV_BevelCurve.txt: -------------------------------------------------------------------------------- 1 | = LV Bevel Curve = 2 | 3 | == Overview == 4 | 5 | NOT WORKING 6 | 7 | @inputs 8 | 9 | Label: 10 | 11 | What the input is for. 12 | 13 | @parameters 14 | 15 | Maximum Normal Angle: 16 | #flatangle: 17 | float: Maximum Normal Angle 18 | 19 | Distance: 20 | #offset: 21 | float: Distance 22 | 23 | Divisions: 24 | #divisions: 25 | int: Divisions -------------------------------------------------------------------------------- /help/nodes/Sop/LV_MakeBlend.txt: -------------------------------------------------------------------------------- 1 | = LV Make Blend = 2 | 3 | == Overview == 4 | 5 | Explanation of the node's purpose and operation. 6 | 7 | @inputs 8 | 9 | Label: 10 | 11 | What the input is for. 12 | 13 | @parameters 14 | 15 | Steps: 16 | #segs: 17 | int: Steps 18 | 19 | Closed: 20 | #closedall: 21 | toggle: Closed 22 | 23 | Connectivity: 24 | #surftype: 25 | menu: Connectivity -------------------------------------------------------------------------------- /help/nodes/Sop/LV_RoundCornerCurve.txt: -------------------------------------------------------------------------------- 1 | = LV Round Corner Curve = 2 | 3 | == Overview == 4 | 5 | Explanation of the node's purpose and operation. 6 | 7 | @inputs 8 | 9 | Label: 10 | 11 | What the input is for. 12 | 13 | @parameters 14 | 15 | Group: 16 | #group: 17 | string: Group 18 | 19 | Distance: 20 | #offset: 21 | float: Distance 22 | 23 | Length: 24 | #length: 25 | float: Length -------------------------------------------------------------------------------- /help/nodes/Sop/LV--trimcurvelength.txt: -------------------------------------------------------------------------------- 1 | = PIC Trim Curve With Length = 2 | 3 | == Overview == 4 | 5 | Explanation of the node's purpose and operation. 6 | 7 | @inputs 8 | 9 | Label: 10 | 11 | What the input is for. 12 | 13 | @parameters 14 | 15 | Start Position: 16 | #dist: 17 | float: Start Position 18 | 19 | Length: 20 | #length: 21 | float: Length 22 | 23 | Flip: 24 | #flip: 25 | toggle: Flip -------------------------------------------------------------------------------- /python3.9libs/nodegraphhooks.py: -------------------------------------------------------------------------------- 1 | import hou 2 | from canvaseventtypes import * 3 | import nodegraphdisplay as display 4 | import nodegraphview as view 5 | 6 | import extra 7 | from importlib import reload 8 | 9 | 10 | def createEventHandler(uievent, pending_actions): 11 | reload(extra) 12 | if extra.do_stuff(uievent): 13 | return None, True 14 | else: 15 | return None, False 16 | -------------------------------------------------------------------------------- /help/nodes/Sop/LV--trimcurvelengthGRAD.txt: -------------------------------------------------------------------------------- 1 | = PIC Trim Curve With Length (Grad) = 2 | 3 | == Overview == 4 | 5 | Explanation of the node's purpose and operation. 6 | 7 | @inputs 8 | 9 | Label: 10 | 11 | What the input is for. 12 | 13 | @parameters 14 | 15 | Start Position: 16 | #dist: 17 | float: Start Position 18 | 19 | Length: 20 | #length: 21 | float: Length 22 | 23 | Flip: 24 | #flip: 25 | toggle: Flip -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | LV Tools.approj 2 | .ap/* 3 | Houdini Tools.zip 4 | .gitignore 5 | hda/backup/* 6 | hda/back 7 | otls_bak/* 8 | */*/*/__pycache__/* 9 | */*/__pycache__/* 10 | python3.9libs/__pycache__/* 11 | otls/backup/* 12 | scripts/python/LVProjectManager/prefs.json 13 | python3.9libs/nodegraphtitle.py 14 | scripts/python/.env 15 | scripts/python/gpt.py 16 | scripts/python/.bak 17 | scripts/python/gradientManager/ramps/*.json 18 | prefs.json -------------------------------------------------------------------------------- /PlaybarMenu.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /help/nodes/Sop/LV_largestprim.txt: -------------------------------------------------------------------------------- 1 | = LV Extract Largest = 2 | 3 | == Overview == 4 | 5 | Explanation of the node's purpose and operation. 6 | 7 | @inputs 8 | 9 | Label: 10 | 11 | What the input is for. 12 | 13 | @parameters 14 | 15 | Type: 16 | #type: 17 | menu: Type 18 | 19 | Group?: 20 | #group: 21 | toggle: Group? 22 | 23 | Group Name: 24 | #g_name: 25 | string: Group Name 26 | 27 | Message: 28 | #labelparm: 29 | label: Message -------------------------------------------------------------------------------- /help/nodes/Sop/LV_EaseManager.txt: -------------------------------------------------------------------------------- 1 | = LV Ease Manager = 2 | 3 | == Overview == 4 | 5 | Explanation of the node's purpose and operation. 6 | 7 | @inputs 8 | 9 | Label: 10 | 11 | What the input is for. 12 | 13 | @parameters 14 | 15 | Label: 16 | #newparameter: 17 | menu: Label 18 | 19 | Label: 20 | #newparameter2: 21 | menu: Label 22 | 23 | Label: 24 | #newparameter3min: 25 | float: Label 26 | 27 | Label: 28 | #newparameter3max: 29 | float: Label -------------------------------------------------------------------------------- /lv.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /help/nodes/Sop/lv_mat.txt: -------------------------------------------------------------------------------- 1 | = LV Mat = 2 | 3 | == Overview == 4 | 5 | Explanation of the node's purpose and operation. 6 | 7 | @inputs 8 | 9 | Label: 10 | 11 | What the input is for. 12 | 13 | @parameters 14 | 15 | Color: 16 | #base_colorr: 17 | float: Color 18 | 19 | Color: 20 | #base_colorg: 21 | float: Color 22 | 23 | Color: 24 | #base_colorb: 25 | float: Color 26 | 27 | Weight: 28 | #refl_weight: 29 | float: Weight 30 | 31 | Roughness: 32 | #refl_roughness: 33 | float: Roughness -------------------------------------------------------------------------------- /python3.10libs/nodegraphhooks.pybak: -------------------------------------------------------------------------------- 1 | import hou 2 | from canvaseventtypes import * 3 | import nodegraphdisplay as display 4 | import nodegraphview as view 5 | 6 | import extra 7 | from importlib import reload 8 | 9 | 10 | def createEventHandler(uievent, pending_actions): 11 | reload(extra) 12 | # return None, False 13 | if extra.do_stuff(uievent): 14 | return None, True # we return True here to hijack the event and stop it getting caught by houdini naturally 15 | else: 16 | return None, False 17 | -------------------------------------------------------------------------------- /help/nodes/Sop/Clip_by_Attribute.txt: -------------------------------------------------------------------------------- 1 | = LV Clip by Attribute = 2 | 3 | == Overview == 4 | 5 | Clip geometry by input attribute. 6 | 7 | @parameters 8 | 9 | Clip Attribute: 10 | #clipatt: 11 | Attribute to use for clipping of geometry. 12 | 13 | Add Noise: 14 | #addnoise: 15 | Add noise to attribute. 16 | 17 | noise: 18 | #noise: 19 | Noise controls (exposed from Attribute Noise). 20 | 21 | Clip Threshold: 22 | #clipamount: 23 | Value to clip by. 24 | 25 | Keep: 26 | #clipop: 27 | Control for removing values above or below threshold. -------------------------------------------------------------------------------- /help/nodes/Sop/LV_SplitPath.txt: -------------------------------------------------------------------------------- 1 | = LV Path = 2 | 3 | == Overview == 4 | 5 | Explanation of the node's purpose and operation. 6 | 7 | @inputs 8 | 9 | Label: 10 | 11 | What the input is for. 12 | 13 | @parameters 14 | 15 | Split Group: 16 | #group: 17 | string: Split Group 18 | 19 | Prepend name with prim attribute: 20 | #useprimatt: 21 | toggle: Prepend name with prim attribute 22 | 23 | Attribute: 24 | #att: 25 | string: Attribute 26 | 27 | Name: 28 | #name: 29 | string: Name 30 | 31 | Group Type: 32 | #grouptype: 33 | menu: Group Type -------------------------------------------------------------------------------- /scripts/python/tex.py: -------------------------------------------------------------------------------- 1 | import hou 2 | 3 | def createAbs(): 4 | nodes = hou.selectedNodes() 5 | path = nodes[0].path() 6 | path_list = path.split("/") 7 | del path_list[-1] 8 | rebuild = "/".join(path_list) 9 | rebuild_item = hou.item(rebuild) 10 | 11 | abs = rebuild_item.createNode("RSMathAbs") 12 | baseP = nodes[0].position() 13 | abs.setPosition(hou.Vector2(baseP[0]-5, baseP[1])) 14 | abs.setName("Scale_Controller") 15 | for node in nodes: 16 | if node.type().name() == "redshift::TextureSampler": 17 | node.setInput(0, abs) -------------------------------------------------------------------------------- /help/nodes/Sop/LV_Clipandmirror.txt: -------------------------------------------------------------------------------- 1 | = LV Clip and Mirror = 2 | 3 | == Overview == 4 | 5 | Clip geometry and mirror by the same plane. 6 | 7 | @inputs 8 | 9 | Label: 10 | 11 | What the input is for. 12 | 13 | @parameters 14 | 15 | Clip Distance: 16 | #dist: 17 | float: Clip Distance 18 | 19 | Simple Direction: 20 | #sdir: 21 | toggle: Simple Direction 22 | 23 | Direction: 24 | #dirx: 25 | float: Direction 26 | 27 | Direction: 28 | #diry: 29 | float: Direction 30 | 31 | Direction: 32 | #dirz: 33 | float: Direction 34 | 35 | Direction: 36 | #simpleDir: 37 | menu: Direction -------------------------------------------------------------------------------- /help/nodes/Sop/LV_VDBBoolean.txt: -------------------------------------------------------------------------------- 1 | = LV VDB Boolean = 2 | 3 | == Overview == 4 | 5 | Explanation of the node's purpose and operation. 6 | 7 | @inputs 8 | 9 | Label: 10 | 11 | What the input is for. 12 | 13 | @parameters 14 | 15 | Voxel Size: 16 | #voxelsize: 17 | float: Voxel Size 18 | 19 | Operation: 20 | #op: 21 | menu: Operation 22 | 23 | Label: 24 | #de: 25 | menu: Label 26 | 27 | : 28 | #de_amt: 29 | float: 30 | 31 | Operation: 32 | #operation: 33 | string: Operation 34 | 35 | Filter Voxel Radius: 36 | #radius: 37 | int: Filter Voxel Radius 38 | 39 | Iterations: 40 | #iterations: 41 | int: Iterations -------------------------------------------------------------------------------- /python3.10libs/nodegraphtitle.pybak: -------------------------------------------------------------------------------- 1 | from __future__ import print_function 2 | import hou 3 | import nodegraphprefs as prefs 4 | 5 | 6 | def networkEditorTitleLeft(editor): 7 | try: 8 | title = '' 9 | pwd = editor.pwd() 10 | title = 'Follow @wobblypictures\non Twitter' 11 | # print('updated') 12 | 13 | except: 14 | title = '' 15 | 16 | return title 17 | 18 | 19 | def networkEditorTitleRight(editor): 20 | try: 21 | title = '' 22 | pwd = editor.pwd() 23 | title += pwd.childTypeCategory().label() 24 | 25 | except: 26 | title = '' 27 | 28 | return title 29 | -------------------------------------------------------------------------------- /help/nodes/Sop/LV_EasyGroup.txt: -------------------------------------------------------------------------------- 1 | = LV Easy Group = 2 | 3 | == Overview == 4 | 5 | Explanation of the node's purpose and operation. 6 | 7 | @inputs 8 | 9 | Label: 10 | 11 | What the input is for. 12 | 13 | @parameters 14 | 15 | Group Name: 16 | #groupname: 17 | string: Group Name 18 | 19 | Invert: 20 | #invert: 21 | toggle: Invert 22 | 23 | X Size: 24 | #xsize: 25 | float: X Size 26 | 27 | Y Size: 28 | #ysize: 29 | float: Y Size 30 | 31 | Z Size: 32 | #zsize: 33 | float: Z Size 34 | 35 | X Offset: 36 | #xoff: 37 | float: X Offset 38 | 39 | Y Offset: 40 | #yoff: 41 | float: Y Offset 42 | 43 | Z Offset: 44 | #zoff: 45 | float: Z Offset -------------------------------------------------------------------------------- /codeswap/swap.txt: -------------------------------------------------------------------------------- 1 | # Script code that runs for each task in the node. 2 | # 3 | # The following variables are available: 4 | # work_item - the work item currently running 5 | # graph - the graph attributes for the current work item 6 | # 7 | # In addition to the above, in-process scripts can also access: 8 | # self - the current PDG node 9 | # parent_item - the parent work item, if it exists 10 | 11 | name = work_item.stringAttribValue("filename") 12 | 13 | wedge = int(name.split(".")[0].split("_")[-1]) 14 | frame = int(name.split(".")[1]) 15 | 16 | work_item.setIntAttrib("wedge", wedge, -1) 17 | work_item.setIntAttrib("frame", name, -1) 18 | -------------------------------------------------------------------------------- /help/nodes/Sop/LV--Radial_Symmetry.txt: -------------------------------------------------------------------------------- 1 | = LV Radial Symmetry = 2 | 3 | == Overview == 4 | 5 | Explanation of the node's purpose and operation. 6 | 7 | @inputs 8 | 9 | Label: 10 | 11 | What the input is for. 12 | 13 | @parameters 14 | 15 | Auto Align Slice: 16 | #aslice: 17 | toggle: Auto Align Slice 18 | 19 | Loops: 20 | #loops: 21 | int: Loops 22 | 23 | Mirror Mode: 24 | #mirmode: 25 | toggle: Mirror Mode 26 | 27 | Fuse Edges: 28 | #fuse: 29 | toggle: Fuse Edges 30 | 31 | Snap Distance: 32 | #tol3d: 33 | float: Snap Distance 34 | 35 | Preview Slice: 36 | #slice: 37 | toggle: Preview Slice 38 | 39 | Show Guides: 40 | #guides: 41 | toggle: Show Guides -------------------------------------------------------------------------------- /help/nodes/Sop/LV--LV_FloodAttribute.txt: -------------------------------------------------------------------------------- 1 | = LV Flood Attribute = 2 | 3 | == Overview == 4 | 5 | Explanation of the node's purpose and operation. 6 | 7 | @inputs 8 | 9 | Label: 10 | 11 | What the input is for. 12 | 13 | @parameters 14 | 15 | Original Name: 16 | #inname: 17 | string: Original Name 18 | 19 | Clamp Min: 20 | #min: 21 | float: Clamp Min 22 | 23 | Clamp Max: 24 | #max: 25 | float: Clamp Max 26 | 27 | Range Min: 28 | #outputmin: 29 | float: Range Min 30 | 31 | Range Max: 32 | #outputmax: 33 | float: Range Max 34 | 35 | Reverse Direction: 36 | #reverse: 37 | toggle: Reverse Direction 38 | 39 | Flood Slider: 40 | #flood: 41 | float: Flood Slider -------------------------------------------------------------------------------- /help/nodes/Sop/LV_Draw_Ramp.txt: -------------------------------------------------------------------------------- 1 | = LV Draw Ramp = 2 | 3 | == Overview == 4 | 5 | Explanation of the node's purpose and operation. 6 | 7 | @inputs 8 | 9 | Label: 10 | 11 | What the input is for. 12 | 13 | @parameters 14 | 15 | Pull Shape: 16 | #pull: 17 | button: Pull Shape 18 | 19 | Ramp: 20 | #ramp: 21 | ramp: Ramp 22 | 23 | Position: 24 | #ramp1pos: 25 | float: Position 26 | 27 | Value: 28 | #ramp1value: 29 | float: Value 30 | 31 | Interpolation: 32 | #ramp1interp: 33 | menu: Interpolation 34 | 35 | Position: 36 | #ramp2pos: 37 | float: Position 38 | 39 | Value: 40 | #ramp2value: 41 | float: Value 42 | 43 | Interpolation: 44 | #ramp2interp: 45 | menu: Interpolation -------------------------------------------------------------------------------- /scripts/python/LVUpdater.py: -------------------------------------------------------------------------------- 1 | # from git import Repo 2 | import hou 3 | import subprocess 4 | import os 5 | import shutil 6 | 7 | 8 | def update(): 9 | path = hou.text.expandString("$LV") 10 | os.chdir(path) 11 | result = subprocess.run('git fetch --dry-run', shell=True, capture_output=True, text=True) 12 | 13 | if not result.stdout == "": 14 | if hou.ui.displayMessage("Update available. Download update?", buttons=("Yes", "No")) == 0: 15 | subprocess.run('git pull') 16 | hou.ui.displayMessage("Updated. Please restart Houdini.", buttons=("Okay", "Close")) 17 | 18 | else: 19 | hou.ui.displayMessage("Up to date.", buttons=("Okay", "Close")) 20 | -------------------------------------------------------------------------------- /help/nodes/Sop/LV--SafeBevel.txt: -------------------------------------------------------------------------------- 1 | = LV Safe Bevel = 2 | 3 | == Overview == 4 | 5 | Explanation of the node's purpose and operation. 6 | 7 | @inputs 8 | 9 | Label: 10 | 11 | What the input is for. 12 | 13 | @parameters 14 | 15 | Group: 16 | #group: 17 | string: Group 18 | 19 | Ignore Flat Edges (Coplanar Incident Polygons): 20 | #ignoreflatedges: 21 | toggle: Ignore Flat Edges (Coplanar Incident Polygons) 22 | 23 | Maximum Normal Angle: 24 | #flatangle: 25 | float: Maximum Normal Angle 26 | 27 | fillet: 28 | #fillet: 29 | : fillet 30 | 31 | Distance: 32 | #offset: 33 | float: Distance 34 | 35 | Divisions: 36 | #divisions: 37 | int: Divisions 38 | 39 | Stop Loops: 40 | #limit: 41 | menu: Stop Loops -------------------------------------------------------------------------------- /scripts/python/camutils.py: -------------------------------------------------------------------------------- 1 | import hou 2 | 3 | node = hou.pwd() 4 | cam = hou.pwd().parm('cam') 5 | link = hou.item(cam.eval()) 6 | 7 | def enableMask(): 8 | if(link == None): 9 | pass 10 | else: 11 | ptg = link.parmTemplateGroup() 12 | 13 | vm = hou.properties.parmTemplate('viewport', 'viewport_mask') 14 | 15 | vmf = hou.FolderParmTemplate('View Mask', 'View Mask', parm_templates=((vm),)) 16 | 17 | ptg.append(vmf) 18 | try: 19 | link.setParmTemplateGroup(ptg) 20 | link.parm("maskoverlay").set(node.path()) 21 | link.parm("maskaspect").setExpression('ch("resx")/ch("resy")') 22 | except hou.Error: 23 | print("Failed to set View Mask. Camera may already have view mask options exposed.") 24 | 25 | -------------------------------------------------------------------------------- /scripts/python/LVPlaybarUtils.py: -------------------------------------------------------------------------------- 1 | import hou 2 | 3 | 4 | def setTimeline(kwargs): 5 | playbar = hou.playbar 6 | range = playbar.frameRange() 7 | playRange = playbar.playbackRange() 8 | 9 | endmod = playRange[1]/range[1] 10 | startmod = playRange[0]/range[0] 11 | 12 | 13 | fps = hou.fps() 14 | 15 | btn_idx, values = hou.ui.readMultiInput( 16 | "Set timeline", ("FPS", "Start Frame", "End Frame"), 17 | initial_contents=(str(fps), str(range[0]), str(range[1])), 18 | title="Timeline Settings", 19 | buttons=("OK", "Cancel"), 20 | default_choice=0, close_choice=1, 21 | ) 22 | 23 | playbar.setFrameRange(float(values[1]), float(values[2])) 24 | playbar.setPlaybackRange(float(values[1]) * startmod, float(values[2]) * endmod) 25 | hou.setFps(float(values[0])) 26 | -------------------------------------------------------------------------------- /help/nodes/Sop/LV_Double_Resample.txt: -------------------------------------------------------------------------------- 1 | = LV Double Resample = 2 | 3 | == Overview == 4 | 5 | Explanation of the node's purpose and operation. 6 | 7 | @inputs 8 | 9 | Label: 10 | 11 | What the input is for. 12 | 13 | @parameters 14 | 15 | pre: 16 | #pre: 17 | : pre 18 | 19 | Maximum Segment Length: 20 | #dolength: 21 | toggle: Maximum Segment Length 22 | 23 | Length: 24 | #length: 25 | float: Length 26 | 27 | Maximum Segments: 28 | #dosegs: 29 | toggle: Maximum Segments 30 | 31 | Segments: 32 | #segs: 33 | int: Segments 34 | 35 | post: 36 | #post: 37 | : post 38 | 39 | Maximum Segment Length: 40 | #dolength2: 41 | toggle: Maximum Segment Length 42 | 43 | Length: 44 | #length2: 45 | float: Length 46 | 47 | Maximum Segments: 48 | #dosegs2: 49 | toggle: Maximum Segments 50 | 51 | Segments: 52 | #segs2: 53 | int: Segments -------------------------------------------------------------------------------- /scripts/python/BasePythonPanel/BasePanel.py: -------------------------------------------------------------------------------- 1 | import os 2 | import sys 3 | import hou 4 | import json 5 | 6 | from hutil.PySide import QtCore, QtUiTools, QtWidgets, QtGui 7 | from hutil.PySide.QtWidgets import QGridLayout 8 | 9 | 10 | from texManager import texManager 11 | 12 | 13 | class TexManager(QtWidgets.QWidget): 14 | def __init__(self): 15 | super(TexManager, self).__init__() 16 | 17 | self.folderpath = os.path.dirname(os.path.realpath(__file__)) 18 | 19 | ui_file_path = self.folderpath + "/BasePanel.ui" 20 | 21 | loader = QtUiTools.QUiLoader() 22 | self.ui = loader.load(ui_file_path) 23 | 24 | mainLayout = QtWidgets.QVBoxLayout() 25 | 26 | mainLayout.addWidget(self.ui) 27 | self.setLayout(mainLayout) 28 | 29 | def createInterface(self): 30 | pass 31 | 32 | -------------------------------------------------------------------------------- /python_panels/deprecated/LVGraph.pypanel: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /python_panels/deprecated/LVHDRIManager.pypanel: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /python_panels/deprecated/LVEaseManager.pypanel: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /python_panels/LVNodeShare.pypanel: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /python_panels/deprecated/LVStickyController.pypanel: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /python_panels/LVAnimationManager.pypanel: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /python_panels/deprecated/LVPBRBuilder.pypanel: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /python_panels/LVRampManager.pypanel: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /python_panels/deprecated/LVTexManager.pypanel: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /scripts/python/stickyparent.py: -------------------------------------------------------------------------------- 1 | import hou 2 | 3 | node = hou.selectedItems()[0] 4 | 5 | sNote = hou.selectedItems()[1] 6 | 7 | diff = node.position()-sNote.position() 8 | 9 | def onNodeMoved(**kwargs): 10 | sNote.setPosition(node.position() - diff) 11 | 12 | def clearCall(**kwargs): 13 | node.removeAllEventCallbacks() 14 | 15 | def linkNodes(): 16 | if len(hou.selectedItems())<2: 17 | print("Select parent node and child node.") 18 | else: 19 | 20 | #register callback 21 | if len(node.eventCallbacks()) == 0 : 22 | node.removeAllEventCallbacks() 23 | node.setComment("This node has a linked node. To unlink, reactivate the script.") 24 | node.addEventCallback((hou.nodeEventType.PositionChanged, ), onNodeMoved) 25 | node.addEventCallback((hou.nodeEventType.BeingDeleted, ), clearCall) 26 | else: 27 | node.removeAllEventCallbacks() 28 | node.setComment("") -------------------------------------------------------------------------------- /python_panels/LVNodeUtils.pypanel: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /python_panels/LVProjectManager.pypanel: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /help/nodes/Sop/LV_SimpleRetime.txt: -------------------------------------------------------------------------------- 1 | = LV Simple Retime = 2 | 3 | == Overview == 4 | 5 | Explanation of the node's purpose and operation. 6 | 7 | @inputs 8 | 9 | Label: 10 | 11 | What the input is for. 12 | 13 | @parameters 14 | 15 | Global Retime: 16 | #global_retime: 17 | float: Global Retime 18 | 19 | Input End Frame (Hold): 20 | #end: 21 | int: Input End Frame (Hold) 22 | 23 | Retiming Ramp: 24 | #retime_ramp: 25 | ramp: Retiming Ramp 26 | 27 | Retime Domain (Frames): 28 | #out_end: 29 | int: Retime Domain (Frames) 30 | 31 | Message: 32 | #labelparm: 33 | label: Message 34 | 35 | Position: 36 | #retime_ramp1pos: 37 | float: Position 38 | 39 | Value: 40 | #retime_ramp1value: 41 | float: Value 42 | 43 | Interpolation: 44 | #retime_ramp1interp: 45 | menu: Interpolation 46 | 47 | Position: 48 | #retime_ramp2pos: 49 | float: Position 50 | 51 | Value: 52 | #retime_ramp2value: 53 | float: Value 54 | 55 | Interpolation: 56 | #retime_ramp2interp: 57 | menu: Interpolation -------------------------------------------------------------------------------- /help/nodes/Sop/LV_movealongpath.txt: -------------------------------------------------------------------------------- 1 | = LV Move Along Path = 2 | 3 | == Overview == 4 | 5 | Explanation of the node's purpose and operation. 6 | 7 | @inputs 8 | 9 | Label: 10 | 11 | What the input is for. 12 | 13 | @parameters 14 | 15 | Resample Resolution: 16 | #resrez: 17 | float: Resample Resolution 18 | 19 | Progress: 20 | #progress: 21 | float: Progress 22 | 23 | Multiple Paths: 24 | #multi: 25 | toggle: Multiple Paths 26 | 27 | multimode: 28 | #multimode: 29 | : multimode 30 | 31 | Pack and Instance: 32 | #pack: 33 | toggle: Pack and Instance 34 | 35 | Piece Attribute: 36 | #useidattrib: 37 | toggle: Piece Attribute 38 | 39 | Piece Attribute: 40 | #idattrib: 41 | string: Piece Attribute 42 | 43 | Automatically apply variant attribute: 44 | #autov: 45 | toggle: Automatically apply variant attribute 46 | 47 | Seed: 48 | #randomseed: 49 | float: Seed 50 | 51 | Offset Attribute: 52 | #inname: 53 | string: Offset Attribute 54 | 55 | Offset Scale: 56 | #off_s: 57 | float: Offset Scale -------------------------------------------------------------------------------- /python_panels/deprecated/LVKeyframeAssistant.pypanel: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /python_panels/LVPathBrowser.pypanel: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /python_panels/deprecated/LVRSLightMixer.pypanel: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /otls/rename.py: -------------------------------------------------------------------------------- 1 | import os 2 | import shutil 3 | 4 | root = os.path.dirname(__file__) 5 | print(root) 6 | 7 | files = os.listdir(root) 8 | 9 | for f in files: 10 | if f != "rename.py": 11 | name = f 12 | # if name.startswith("LV_"): 13 | # new_name = name.replace("LV_", "LV.") 14 | # os.rename(name, new_name) 15 | # if name.startswith("LV.LV_"): 16 | # new_name = name.replace("LV.LV_", "LV.") 17 | # extra = name[6:] 18 | # new = "LV." + extra 19 | # os.rename(name, new) 20 | # if f.startswith("."): 21 | # new_name = name.replace("LV", "LV.", 1) 22 | # os.rename(os.path.join(root, name), os.path.join(root, name[2:])) 23 | # if not name.startswith("LV"): 24 | # os.rename(os.path.join(root, name), os.path.join(root, "LV." + name)) 25 | # if "_" in name: 26 | # test_str = name 27 | # res = ''.join([word.capitalize() for word in test_str.split("_")]) 28 | # print(res.capitalize()) 29 | -------------------------------------------------------------------------------- /help/nodes/Sop/LV_Alembic.txt: -------------------------------------------------------------------------------- 1 | = LV Alembic = 2 | 3 | == Overview == 4 | 5 | Explanation of the node's purpose and operation. 6 | 7 | @inputs 8 | 9 | Label: 10 | 11 | What the input is for. 12 | 13 | @parameters 14 | 15 | Save to Disk: 16 | #execute: 17 | button: Save to Disk 18 | 19 | Controls...: 20 | #renderdialog: 21 | button: Controls... 22 | 23 | Valid Frame Range: 24 | #trange: 25 | menu: Valid Frame Range 26 | 27 | Start/End/Inc: 28 | #f1: 29 | float: Start/End/Inc 30 | 31 | Start/End/Inc: 32 | #f2: 33 | float: Start/End/Inc 34 | 35 | Start/End/Inc: 36 | #f3: 37 | float: Start/End/Inc 38 | 39 | Use File Directory: 40 | #usefilepath: 41 | toggle: Use File Directory 42 | 43 | File Directory: 44 | #dir: 45 | string: File Directory 46 | 47 | Alembic File: 48 | #filename: 49 | string: Alembic File 50 | 51 | Name: 52 | #name: 53 | string: Name 54 | 55 | Open Directory: 56 | #openDir: 57 | button: Open Directory 58 | 59 | -: 60 | #vDown: 61 | button: - 62 | 63 | +: 64 | #vUp: 65 | button: + 66 | 67 | Version: 68 | #v: 69 | int: Version -------------------------------------------------------------------------------- /help/nodes/Sop/LV_fitfloat.txt: -------------------------------------------------------------------------------- 1 | = LV Fit Float = 2 | 3 | == Overview == 4 | 5 | Explanation of the node's purpose and operation. 6 | 7 | @inputs 8 | 9 | Label: 10 | 11 | What the input is for. 12 | 13 | @parameters 14 | 15 | Input Attribute: 16 | #inname: 17 | string: Input Attribute 18 | 19 | Attribute Type: 20 | #attribute_type: 21 | menu: Attribute Type 22 | 23 | Auto 0-1: 24 | #auto: 25 | toggle: Auto 0-1 26 | 27 | Floatify: 28 | #floatify: 29 | toggle: Floatify 30 | 31 | Input Min: 32 | #min: 33 | float: Input Min 34 | 35 | Input Max: 36 | #max: 37 | float: Input Max 38 | 39 | Ramp: 40 | #remap: 41 | ramp: Ramp 42 | 43 | Output Attribute: 44 | #outname: 45 | string: Output Attribute 46 | 47 | Position: 48 | #remap1pos: 49 | float: Position 50 | 51 | Value: 52 | #remap1value: 53 | float: Value 54 | 55 | Interpolation: 56 | #remap1interp: 57 | menu: Interpolation 58 | 59 | Position: 60 | #remap2pos: 61 | float: Position 62 | 63 | Value: 64 | #remap2value: 65 | float: Value 66 | 67 | Interpolation: 68 | #remap2interp: 69 | menu: Interpolation -------------------------------------------------------------------------------- /help/nodes/Sop/LV_Slicer.txt: -------------------------------------------------------------------------------- 1 | = LV Slicer = 2 | 3 | == Overview == 4 | 5 | Explanation of the node's purpose and operation. 6 | 7 | @inputs 8 | 9 | Label: 10 | 11 | What the input is for. 12 | 13 | @parameters 14 | 15 | Time: 16 | #time: 17 | float: Time 18 | 19 | Slice Amount: 20 | #sliceamount: 21 | int: Slice Amount 22 | 23 | Slice Duration: 24 | #slicedur: 25 | int: Slice Duration 26 | 27 | Slice Ease: 28 | #ease: 29 | ramp: Slice Ease 30 | 31 | Random Slice Position: 32 | #randp: 33 | toggle: Random Slice Position 34 | 35 | Random Position Amount: 36 | #p_amount: 37 | float: Random Position Amount 38 | 39 | Rotation Amount: 40 | #r_amount: 41 | float: Rotation Amount 42 | 43 | Seed: 44 | #seed: 45 | float: Seed 46 | 47 | Position: 48 | #ease1pos: 49 | float: Position 50 | 51 | Value: 52 | #ease1value: 53 | float: Value 54 | 55 | Interpolation: 56 | #ease1interp: 57 | menu: Interpolation 58 | 59 | Position: 60 | #ease2pos: 61 | float: Position 62 | 63 | Value: 64 | #ease2value: 65 | float: Value 66 | 67 | Interpolation: 68 | #ease2interp: 69 | menu: Interpolation -------------------------------------------------------------------------------- /python_panels/deprecated/LVRSLightLink.pypanel: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /help/nodes/Sop/LV_blendbyatt.txt: -------------------------------------------------------------------------------- 1 | = LV Blend by Attribute = 2 | 3 | == Overview == 4 | 5 | Simple blend between 2 pieces of geometry by an input attribute. Blendshape SOP has this feature. 6 | 7 | @inputs 8 | 9 | Label: 10 | 11 | What the input is for. 12 | 13 | @parameters 14 | 15 | Blend Attribute: 16 | #blendatt: 17 | string: Blend Attribute 18 | 19 | Remapping: 20 | #Remapping: 21 | : Remapping 22 | 23 | Compute Range: 24 | #computerange: 25 | button: Compute Range 26 | 27 | Input Min: 28 | #inputmin: 29 | float: Input Min 30 | 31 | Input Max: 32 | #inputmax: 33 | float: Input Max 34 | 35 | Shape: 36 | #shape: 37 | ramp: Shape 38 | 39 | Label: 40 | #zero: 41 | float: Label 42 | 43 | Label: 44 | #one: 45 | float: Label 46 | 47 | Position: 48 | #shape1pos: 49 | float: Position 50 | 51 | Value: 52 | #shape1value: 53 | float: Value 54 | 55 | Interpolation: 56 | #shape1interp: 57 | menu: Interpolation 58 | 59 | Position: 60 | #shape2pos: 61 | float: Position 62 | 63 | Value: 64 | #shape2value: 65 | float: Value 66 | 67 | Interpolation: 68 | #shape2interp: 69 | menu: Interpolation -------------------------------------------------------------------------------- /help/nodes/Sop/LV--LV_Backdrop.txt: -------------------------------------------------------------------------------- 1 | = LV Backdrop = 2 | 3 | == Overview == 4 | 5 | Explanation of the node's purpose and operation. 6 | 7 | @inputs 8 | 9 | Label: 10 | 11 | What the input is for. 12 | 13 | @parameters 14 | 15 | Roof: 16 | #roof: 17 | toggle: Roof 18 | 19 | Left Wall: 20 | #left: 21 | toggle: Left Wall 22 | 23 | Right Wall: 24 | #right: 25 | toggle: Right Wall 26 | 27 | Back Wall: 28 | #back: 29 | toggle: Back Wall 30 | 31 | Front Wall: 32 | #front: 33 | toggle: Front Wall 34 | 35 | Curve Distance: 36 | #offset: 37 | float: Curve Distance 38 | 39 | Center: 40 | #tx: 41 | float: Center 42 | 43 | Center: 44 | #ty: 45 | float: Center 46 | 47 | Center: 48 | #tz: 49 | float: Center 50 | 51 | Size: 52 | #sizex: 53 | float: Size 54 | 55 | Size: 56 | #sizey: 57 | float: Size 58 | 59 | Size: 60 | #sizez: 61 | float: Size 62 | 63 | Uniform Scale: 64 | #scale: 65 | float: Uniform Scale 66 | 67 | Rotate: 68 | #rx: 69 | float: Rotate 70 | 71 | Rotate: 72 | #ry: 73 | float: Rotate 74 | 75 | Rotate: 76 | #rz: 77 | float: Rotate 78 | 79 | Divisions: 80 | #divisions: 81 | int: Divisions -------------------------------------------------------------------------------- /help/nodes/Sop/LV--PaleteFromImage.txt: -------------------------------------------------------------------------------- 1 | = Palette from Image = 2 | 3 | == Overview == 4 | 5 | Explanation of the node's purpose and operation. 6 | 7 | @inputs 8 | 9 | Label: 10 | 11 | What the input is for. 12 | 13 | @parameters 14 | 15 | Texture Map: 16 | #filename: 17 | string: Texture Map 18 | 19 | Build Gradient: 20 | #build: 21 | button: Build Gradient 22 | 23 | Gradient: 24 | #Gradient: 25 | ramp: Gradient 26 | 27 | Guide Scale: 28 | #guide_scale: 29 | float: Guide Scale 30 | 31 | Pixel Resolution: 32 | #targetsize: 33 | float: Pixel Resolution 34 | 35 | Position: 36 | #Gradient1pos: 37 | float: Position 38 | 39 | Color: 40 | #Gradient1cr: 41 | float: Color 42 | 43 | Color: 44 | #Gradient1cg: 45 | float: Color 46 | 47 | Color: 48 | #Gradient1cb: 49 | float: Color 50 | 51 | Interpolation: 52 | #Gradient1interp: 53 | menu: Interpolation 54 | 55 | Position: 56 | #Gradient2pos: 57 | float: Position 58 | 59 | Color: 60 | #Gradient2cr: 61 | float: Color 62 | 63 | Color: 64 | #Gradient2cg: 65 | float: Color 66 | 67 | Color: 68 | #Gradient2cb: 69 | float: Color 70 | 71 | Interpolation: 72 | #Gradient2interp: 73 | menu: Interpolation -------------------------------------------------------------------------------- /help/nodes/Sop/LV_3D_Print_Output.txt: -------------------------------------------------------------------------------- 1 | = LV 3D Print Output = 2 | 3 | == Overview == 4 | 5 | Explanation of the node's purpose and operation. 6 | 7 | @inputs 8 | 9 | Label: 10 | 11 | What the input is for. 12 | 13 | @parameters 14 | 15 | Set Height: 16 | #input: 17 | toggle: Set Height 18 | 19 | Height: 20 | #height: 21 | float: Height 22 | 23 | Check Line Width: 24 | #c_width: 25 | toggle: Check Line Width 26 | 27 | Offset by: 28 | #offset_y: 29 | float: Offset by 30 | 31 | Check Line Height: 32 | #c_height: 33 | toggle: Check Line Height 34 | 35 | over: 36 | #over: 37 | : over 38 | 39 | Check Overhang: 40 | #c_over: 41 | toggle: Check Overhang 42 | 43 | Overhang Angle2: 44 | #angle: 45 | float: Overhang Angle2 46 | 47 | File Name: 48 | #name: 49 | string: File Name 50 | 51 | Save to Disk: 52 | #execute: 53 | button: Save to Disk 54 | 55 | Open In Slicer: 56 | #openSlicer: 57 | button: Open In Slicer 58 | 59 | path: 60 | #path: 61 | string: path 62 | 63 | parms: 64 | #parms: 65 | : parms 66 | 67 | Print Base Folder: 68 | #baseFolder: 69 | string: Print Base Folder 70 | 71 | Slicer Path (.exe): 72 | #slicerPath: 73 | string: Slicer Path (.exe) -------------------------------------------------------------------------------- /help/nodes/Sop/PIC_TWO--LV_StickyNoteController.txt: -------------------------------------------------------------------------------- 1 | = LV Sticky Note Controller = 2 | 3 | == Overview == 4 | 5 | Explanation of the node's purpose and operation. 6 | 7 | @inputs 8 | 9 | Label: 10 | 11 | What the input is for. 12 | 13 | @parameters 14 | 15 | Drag Sticky Note Here: 16 | #note: 17 | string: Drag Sticky Note Here 18 | 19 | Text Size: 20 | #size: 21 | float: Text Size 22 | 23 | Text Color: 24 | #tcolorr: 25 | float: Text Color 26 | 27 | Text Color: 28 | #tcolorg: 29 | float: Text Color 30 | 31 | Text Color: 32 | #tcolorb: 33 | float: Text Color 34 | 35 | f_bg: 36 | #f_bg: 37 | : f_bg 38 | 39 | Enable Background: 40 | #bg: 41 | toggle: Enable Background 42 | 43 | Background Color: 44 | #bgcr: 45 | float: Background Color 46 | 47 | Background Color: 48 | #bgcg: 49 | float: Background Color 50 | 51 | Background Color: 52 | #bgcb: 53 | float: Background Color 54 | 55 | parent: 56 | #parent: 57 | : parent 58 | 59 | Parent: 60 | #link: 61 | string: Parent 62 | 63 | X Offset: 64 | #x: 65 | float: X Offset 66 | 67 | Y Offset: 68 | #y: 69 | float: Y Offset 70 | 71 | Add Link: 72 | #blink: 73 | button: Add Link 74 | 75 | Remove Link: 76 | #bunlink: 77 | button: Remove Link -------------------------------------------------------------------------------- /python3.9libs/extra.py: -------------------------------------------------------------------------------- 1 | import hou 2 | from canvaseventtypes import * 3 | import nodegraphdisplay as display 4 | import nodegraphview as view 5 | from datetime import datetime 6 | 7 | 8 | def your_function(): 9 | print("consistent double click") 10 | 11 | def createEventHandler(uievent, pending_actions): 12 | if isinstance(uievent, MouseEvent): 13 | if (uievent.eventtype == 'mousedown'): 14 | try: 15 | if not hou.session.first_click: 16 | if hou.session.first_click - datetime.now() > 1000: 17 | hou.session.first_click = datetime.now() 18 | else: 19 | second = datetime.now() 20 | diff = second - hou.session.first_click 21 | mil_diff = diff.total_seconds() * 1000 22 | # print(mil_diff) 23 | # if diff > 500: 24 | if not mil_diff < 200: 25 | hou.session.first_click = datetime.now() 26 | 27 | else: 28 | your_function() 29 | 30 | except: 31 | hou.session.first_click = datetime.now() 32 | 33 | return None, True 34 | return None, False 35 | -------------------------------------------------------------------------------- /python_panels/deprecated/LV.pypanel: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /config/NodeShapes/sideways.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "LV_SideWays", 3 | "flags": { 4 | "0": { "outline": [[0.65,-0.2392],[0.65,-0.31],[0.6393,-0.3369],[0.61,-0.35],[0.39,-0.35],[0.3616,-0.3379],[0.35,-0.3094],[0.35,-0.2008]] }, 5 | "1": { "outline": [[0.65,-0.0981],[0.65,-0.2392],[0.35,-0.2008],[0.35,-0.0606]] }, 6 | "2": { "outline": [[0.65,0.5008],[0.65,0.3608],[0.35,0.3992],[0.35,0.5392]] }, 7 | "3": { "outline": [[0.3607,0.6369],[0.39,0.65],[0.61,0.65],[0.6384,0.6379],[0.65,0.6094],[0.65,0.5008],[0.35,0.5392],[0.35,0.61]] } 8 | }, 9 | "outline": [[0.39,-0.35],[0.3616,-0.3379],[0.35,-0.3094],[0.35,0.61],[0.3607,0.6369],[0.39,0.65],[0.61,0.65],[0.6384,0.6379],[0.65,0.6094],[0.65,-0.31],[0.6393,-0.3369],[0.61,-0.35]], 10 | "inputs": [[0.3552,0.75,90],[0.379333,0.75,90],[0.403467,0.75,90],[0.4276,0.75,90],[0.451733,0.75,90],[0.475867,0.75,90],[0.5,0.75,90],[0.524133,0.75,90],[0.548267,0.75,90],[0.5724,0.75,90],[0.596533,0.75,90],[0.620667,0.75,90],[0.6448,0.75,90]], 11 | "outputs": [[0.3552,-0.49,270],[0.379333,-0.49,270],[0.403467,-0.49,270],[0.4276,-0.49,270],[0.451733,-0.49,270],[0.475867,-0.49,270],[0.5,-0.49,270],[0.524133,-0.49,270],[0.548267,-0.49,270],[0.5724,-0.49,270],[0.596533,-0.49,270],[0.620667,-0.49,270],[0.6448,-0.49,270]], 12 | "icon": [[0.38,0.03],[0.62,0.27]] 13 | } -------------------------------------------------------------------------------- /scripts/python/animManager/animManager.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | MainWindow 4 | 5 | 6 | 7 | 0 8 | 0 9 | 560 10 | 600 11 | 12 | 13 | 14 | MainWindow 15 | 16 | 17 | 18 | 19 | 0 20 | 0 21 | 22 | 23 | 24 | 25 | 0 26 | 27 | 28 | 0 29 | 30 | 31 | 0 32 | 33 | 34 | 0 35 | 36 | 37 | 6 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /help/nodes/Sop/LV--LV_UVMatchSize.txt: -------------------------------------------------------------------------------- 1 | = LV UV Match Size = 2 | 3 | == Overview == 4 | 5 | Explanation of the node's purpose and operation. 6 | 7 | @inputs 8 | 9 | Label: 10 | 11 | What the input is for. 12 | 13 | @parameters 14 | 15 | Target Size: 16 | #sizex: 17 | float: Target Size 18 | 19 | Target Size: 20 | #sizey: 21 | float: Target Size 22 | 23 | Target Size: 24 | #sizez: 25 | float: Target Size 26 | 27 | Translate: 28 | #dotranslate: 29 | toggle: Translate 30 | 31 | Justify X: 32 | #justify_x: 33 | menu: Justify X 34 | 35 | to: 36 | #goal_x: 37 | menu: to 38 | 39 | Offset by: 40 | #offset_x: 41 | float: Offset by 42 | 43 | Justify Y: 44 | #justify_y: 45 | menu: Justify Y 46 | 47 | to: 48 | #goal_y: 49 | menu: to 50 | 51 | Offset by: 52 | #offset_y: 53 | float: Offset by 54 | 55 | Justify Z: 56 | #justify_z: 57 | menu: Justify Z 58 | 59 | to: 60 | #goal_z: 61 | menu: to 62 | 63 | Offset by: 64 | #offset_z: 65 | float: Offset by 66 | 67 | Scale to Fit: 68 | #doscale: 69 | toggle: Scale to Fit 70 | 71 | Uniform Scale: 72 | #uniformscale: 73 | toggle: Uniform Scale 74 | 75 | Scale Axis: 76 | #scale_axis: 77 | menu: Scale Axis 78 | 79 | Scale X: 80 | #scale_x: 81 | toggle: Scale X 82 | 83 | Scale Y: 84 | #scale_y: 85 | toggle: Scale Y 86 | 87 | Scale Z: 88 | #scale_z: 89 | toggle: Scale Z -------------------------------------------------------------------------------- /scripts/python/deprecated/easecontrol/flipX.py: -------------------------------------------------------------------------------- 1 | import hou 2 | pane_tab = hou.ui.paneTabOfType(hou.paneTabType.ChannelEditor) 3 | keyframes = pane_tab.graph().selectedKeyframes() 4 | 5 | kfs = [] 6 | okfs = [] 7 | val = [] 8 | 9 | i = -1; 10 | 11 | for parm in keyframes.keys(): 12 | for key in keyframes[parm]: 13 | kfs.append(key) 14 | #okfs.append(key.value()) 15 | okfs.append(key) 16 | val.append(key.value()) 17 | parm.deleteAllKeyframes() 18 | 19 | 20 | kfs.reverse() 21 | 22 | for parm in keyframes.keys(): 23 | for index in range(len(kfs)): 24 | 25 | #declare new vs old: in X, we want value to swap + invert slope 26 | newKey = kfs[index] #newkey created from unflipped keys 27 | 28 | accel = okfs[index].accel() 29 | inAccel = okfs[index].inAccel() 30 | 31 | slope = okfs[index].slope() 32 | inSlope = okfs[index].inSlope() 33 | 34 | print(accel) 35 | 36 | #do reversing 37 | 38 | newKey.setSlope(slope * -1) 39 | newKey.setInSlope(inSlope * -1) 40 | newKey.setAccel(accel) 41 | newKey.setInAccel(inAccel) 42 | newKey.setValue(val[index]) 43 | 44 | #set keyframe 45 | parm.setKeyframe(newKey) 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | -------------------------------------------------------------------------------- /help/nodes/Sop/LV_CycleAttribute.txt: -------------------------------------------------------------------------------- 1 | = LV Cycle Attribute = 2 | 3 | == Overview == 4 | 5 | Explanation of the node's purpose and operation. 6 | 7 | @inputs 8 | 9 | Label: 10 | 11 | What the input is for. 12 | 13 | @parameters 14 | 15 | Attribute to Cycle: 16 | #in_att: 17 | string: Attribute to Cycle 18 | 19 | loop: 20 | #loop: 21 | : loop 22 | 23 | Loop Mode: 24 | #loopmode: 25 | menu: Loop Mode 26 | 27 | Time: 28 | #Time: 29 | float: Time 30 | 31 | Loop Duration (Frames): 32 | #duration: 33 | float: Loop Duration (Frames) 34 | 35 | Loops Per Cycle: 36 | #loops: 37 | int: Loops Per Cycle 38 | 39 | Shape: 40 | #Shape: 41 | ramp: Shape 42 | 43 | perpiece: 44 | #perpiece: 45 | : perpiece 46 | 47 | Piece Attribute: 48 | #in_piece: 49 | string: Piece Attribute 50 | 51 | Random Per Piece: 52 | #do_rand: 53 | toggle: Random Per Piece 54 | 55 | Random Scale: 56 | #Random_Scale: 57 | float: Random Scale 58 | 59 | Reverse Direction: 60 | #flip: 61 | toggle: Reverse Direction 62 | 63 | Output Attribute: 64 | #out_att: 65 | string: Output Attribute 66 | 67 | Position: 68 | #Shape1pos: 69 | float: Position 70 | 71 | Value: 72 | #Shape1value: 73 | float: Value 74 | 75 | Interpolation: 76 | #Shape1interp: 77 | menu: Interpolation 78 | 79 | Position: 80 | #Shape2pos: 81 | float: Position 82 | 83 | Value: 84 | #Shape2value: 85 | float: Value 86 | 87 | Interpolation: 88 | #Shape2interp: 89 | menu: Interpolation -------------------------------------------------------------------------------- /help/nodes/Sop/LV_Balancer.txt: -------------------------------------------------------------------------------- 1 | = LV Balancer = 2 | 3 | == Overview == 4 | 5 | Explanation of the node's purpose and operation. 6 | 7 | @inputs 8 | 9 | Label: 10 | 11 | What the input is for. 12 | 13 | @parameters 14 | 15 | Simple Stack: 16 | #btype: 17 | toggle: Simple Stack 18 | 19 | size: 20 | #size: 21 | : size 22 | 23 | Overall Size: 24 | #maxSize: 25 | float: Overall Size 26 | 27 | rand: 28 | #rand: 29 | : rand 30 | 31 | Random Scale Seed: 32 | #seed: 33 | int: Random Scale Seed 34 | 35 | Min Scale: 36 | #scalemin: 37 | float: Min Scale 38 | 39 | Max Scale: 40 | #scalemax: 41 | float: Max Scale 42 | 43 | Random Scale Weighting: 44 | #ramp_: 45 | ramp: Random Scale Weighting 46 | 47 | randsettings2: 48 | #randsettings2: 49 | : randsettings2 50 | 51 | Random Orientation: 52 | #randomorient: 53 | toggle: Random Orientation 54 | 55 | Random Orientation Seed: 56 | #randrotseed: 57 | float: Random Orientation Seed 58 | 59 | Position: 60 | #ramp_1pos: 61 | float: Position 62 | 63 | Value: 64 | #ramp_1value: 65 | float: Value 66 | 67 | Interpolation: 68 | #ramp_1interp: 69 | menu: Interpolation 70 | 71 | Position: 72 | #ramp_2pos: 73 | float: Position 74 | 75 | Value: 76 | #ramp_2value: 77 | float: Value 78 | 79 | Interpolation: 80 | #ramp_2interp: 81 | menu: Interpolation 82 | 83 | Position: 84 | #ramp_3pos: 85 | float: Position 86 | 87 | Value: 88 | #ramp_3value: 89 | float: Value 90 | 91 | Interpolation: 92 | #ramp_3interp: 93 | menu: Interpolation -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # LV Tools for Houdini 2 | 3 | # PLEASE NOTE: 4 | 5 | # LV Tools 6 | 7 | A collection of HDAs that I use everyday to make my life easier/better/faster. 8 | 9 | This is a pay-what-you-want project! If you would like to support me, you can do so at [buy me a coffee](https://www.buymeacoffee.com/lukevan) or [PayPal](https://paypal.me/wobblypictures?country.x=ZA&locale.x=en_US). 10 | 11 | ### Installation: 12 | 13 | For those of you running Houdini 17.5 or later, you have an option for a much easier install. 14 | Simply create a folder inside your Houdini preferences directory (where the houdini.env typically is) called "packages", and place the LVTools.json file from the download into that package folder. Your preferences directory on Windows is typically in `My Documents\houdiniXX.X`. In OS X it's in `~Library/Preferences/Houdini`. 15 | 16 | Then edit LVTools.json and change the "LV" variable to match the LV Tools install path you chose in step 1 (the directory that contains "otls", "scripts", and so on). 17 | 18 | # Please note 19 | 20 | If you had this installed before, its worth redownloading and fixing the install directory as I made some changes to the structure of the git repo. 21 | If you are a git user, its worth it to clear the folder and backup any preferences you need, and then reclone it. 22 | 23 | ## Documentation: 24 | 25 | [HDAs](/otls/) 26 | [Scripts](/scripts/python/README.md) 27 | [Python Panels](/python_panels/) 28 | [Node Graph Hooks](/python3.10libs/) 29 | [Shelf Tabs](/toolbar/) 30 | 31 | -------------------------------------------------------------------------------- /radialmenu/LVNetwork.radialmenu: -------------------------------------------------------------------------------- 1 | { 2 | "fileversion":"20.0.653", 3 | "name":"LVNetwork", 4 | "categories":"Standard", 5 | "pane":"network", 6 | "label":"LVNetwork", 7 | "type":"submenu", 8 | "items":{ 9 | "0":{ 10 | "label":"LV Create Named Geo", 11 | "type":"script_action", 12 | "icon":"$LV/lv.svg", 13 | "script":"radialmenu.runShelfTool(kwargs, 'LV_Create_Named_Geo')" 14 | }, 15 | "2":{ 16 | "label":"LV Color", 17 | "type":"script_action", 18 | "icon":"SOP_color", 19 | "script":"radialmenu.runShelfTool(kwargs, 'LV_Color')" 20 | }, 21 | "3":{ 22 | "label":"LV Texture Abs", 23 | "type":"script_action", 24 | "icon":"$LV/lv.svg", 25 | "script":"radialmenu.runShelfTool(kwargs, 'LV_Texture_Abs')" 26 | }, 27 | "4":{ 28 | "label":"Layout Tools", 29 | "type":"submenu", 30 | "items":{ 31 | "2":{ 32 | "label":"LV Arrange", 33 | "type":"script_action", 34 | "icon":"$LV/lv.svg", 35 | "script":"radialmenu.runShelfTool(kwargs, 'LV_Arrange')" 36 | }, 37 | "6":{ 38 | "label":"LV Make Space", 39 | "type":"script_action", 40 | "icon":"$LV/lv.svg", 41 | "script":"radialmenu.runShelfTool(kwargs, 'LV_Make_Space')" 42 | } 43 | } 44 | }, 45 | "5":{ 46 | "label":"Light Visibility Listener", 47 | "type":"script_action", 48 | "icon":"OBJ_light_area", 49 | "script":"radialmenu.runShelfTool(kwargs, 'Light_Visibility_Listener')" 50 | }, 51 | "6":{ 52 | "label":"add float parm", 53 | "type":"script_action", 54 | "icon":"$LV/lv.svg", 55 | "script":"radialmenu.runShelfTool(kwargs, 'add float parm')" 56 | } 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /MainMenuCommon.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | h.save_as 14 | 15 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | help_menu 30 | 31 | 32 | 33 | 34 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 54 | 55 | 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /scripts/python/LVRender.py: -------------------------------------------------------------------------------- 1 | import hou 2 | import subprocess 3 | 4 | 5 | def post_render(node=hou.pwd()): 6 | start = node.parm("f1").eval() # type: ignore 7 | parm = node.parm("RS_outputFileNamePrefix") 8 | wide = parm.unexpandedString() # type: ignore 9 | wide = wide.replace("$OS", node.name()) 10 | 11 | if "$F4" in wide: 12 | wide = wide.replace("$F4", "%04d") 13 | elif "$F3" in wide: 14 | wide = wide.replace("$F3", "%03d") 15 | elif "$F2" in wide: 16 | wide = wide.replace("$F2", "%02d") 17 | 18 | full = hou.expandString(wide) 19 | # print("full: ", full) 20 | 21 | video = "".join(full.split(".")[:-1]) + ".mp4" 22 | 23 | video = video.replace("%04d", "") 24 | video = video.replace("%03d", "") 25 | video = video.replace("%02d", "") 26 | 27 | command = f'ffmpeg -framerate 25 -y -start_number {int(start)} -i "{full}" -c:v libx264 -crf 23 -pix_fmt yuv420p "{video}"' 28 | 29 | print(command) 30 | 31 | subprocess.Popen(command) 32 | 33 | hou.ui.showInFileBrowser(video) 34 | 35 | 36 | def pre_render(node=hou.pwd()): 37 | parm = node.parm("RS_outputFileNamePrefix") 38 | wide = parm.unexpandedString() # type: ignore 39 | import hou 40 | 41 | detects = ['$F', '$F4', '$F3', '$F2'] 42 | if any(x in wide for x in detects): 43 | pass 44 | # hou.ui.displayMessage('Render output contains frame number identifier.', severity=hou.severityType.Message) 45 | else: 46 | hou.ui.displayMessage('Render output missing frame number identifier.', severity=hou.severityType.Warning) 47 | pass 48 | # hou.hscript('rkill *') 49 | -------------------------------------------------------------------------------- /windows_installer.ps1: -------------------------------------------------------------------------------- 1 | 2 | <# 3 | .SYNOPSIS 4 | Powershell Script for Setup Package Json File 5 | 6 | .LINK 7 | https://www.sidefx.com/docs/houdini/ref/plugins.html 8 | 9 | .AUTHOR 10 | Mandrake0 (Francis Pimenta) 11 | #> 12 | 13 | 14 | # Getting the Location 15 | $currentLocation = $PSScriptRoot 16 | $UserLocation = "$env:USERPROFILE\Documents\" 17 | $jsonFile = "LVTools.json" 18 | $json = Get-Content $currentLocation\$jsonFile 19 | 20 | # Get the Houdini Folder to Write the package JSON File 21 | Set-Location $UserLocation 22 | $HoudiniFolder = Get-Item .\houdini* | Select-Object -Property Name | Out-GridView -Title "Houdini Installation Folder Selection" -PassThru 23 | 24 | if (!$HoudiniFolder) { 25 | Write-Warning "No Houdini Folder Selected, Abort Setup" 26 | Return 1 27 | } 28 | 29 | $Houdini = $HoudiniFolder.Name 30 | $fullpath = $UserLocation + $Houdini 31 | 32 | $MSG = @{} 33 | $MSG.Add("Github LV Tools Folder", $currentLocation) 34 | $MSG.Add("Houdini Version", $Houdini) 35 | 36 | # Check if Houdini Package Folder Exist 37 | if (!(Test-Path $fullpath\packages)) { 38 | $MSG.Add("Pagackes Folder Created", "YES") 39 | New-Item -ItemType Directory -Path $fullpath\packages 40 | } else { 41 | $MSG.Add("Pagackes Folder Created", "NO") 42 | } 43 | 44 | # Create JSON File | it just Overwrites when it exist :-) 45 | Write-Output $json.Replace("/path/to/folder", $currentLocation.Replace("\", "/")) | Out-File -FilePath $fullpath\packages\$jsonFile -Encoding default 46 | $MSG.Add("json File", "$fullpath\packages\$jsonFile") 47 | 48 | Write-Output "LV Tools Package Created" 49 | Write-Output $MSG 50 | 51 | Read-Host "Press ENTER to Close" -------------------------------------------------------------------------------- /scripts/python/LVMatUtils.py: -------------------------------------------------------------------------------- 1 | import hou 2 | 3 | def shader_switch_to_mat(kwargs): 4 | node = kwargs['node'] 5 | 6 | parms = node.parms() 7 | for inputs in node.inputs(): 8 | pass 9 | # for parm in parms: 10 | # print(parm.name()) 11 | # if parm.name.startswith('shader'): 12 | # parm.set(1) 13 | 14 | def move_to_mat(kwargs): 15 | node = kwargs['node'] 16 | mat_node = hou.node(node.path() + "/the_matnet/lv_mat1") 17 | new = hou.copyNodesTo([mat_node], hou.node("/mat")) 18 | node.parm("shop_materialpath1").set(new[0].path()) 19 | 20 | for c in mat_node.children(): 21 | c.destroy() 22 | 23 | # set parm refs 24 | new[0].setName(node.name()) 25 | new[0].moveToGoodPosition() 26 | newmat = hou.node(new[0].path() + "/StandardMaterial1") 27 | newmat.parm("base_colorr").deleteAllKeyframes() 28 | newmat.parm("base_colorg").deleteAllKeyframes() 29 | newmat.parm("base_colorb").deleteAllKeyframes() 30 | newmat.parm("refl_weight").deleteAllKeyframes() 31 | newmat.parm("refl_roughness").deleteAllKeyframes() 32 | newmat.parm("base_colorr").set(node.parm("base_colorr").eval()) 33 | newmat.parm("base_colorg").set(node.parm("base_colorg").eval()) 34 | newmat.parm("base_colorb").set(node.parm("base_colorb").eval()) 35 | newmat.parm("refl_weight").set(node.parm("refl_weight").eval()) 36 | newmat.parm("refl_roughness").set(node.parm("refl_roughness").eval()) 37 | 38 | oldinput = node.inputs()[0] 39 | 40 | material = node.createInputNode(0, "material") 41 | material.parm("shop_materialpath1").set(new[0].path()) 42 | material.setInput(0, oldinput) 43 | node.destroy() 44 | material.moveToGoodPosition() 45 | -------------------------------------------------------------------------------- /help/nodes/Sop/LV_Path.txt: -------------------------------------------------------------------------------- 1 | = LV Path = 2 | 3 | == Overview == 4 | 5 | Explanation of the node's purpose and operation. 6 | 7 | @inputs 8 | 9 | Label: 10 | 11 | What the input is for. 12 | 13 | @parameters 14 | 15 | Group: 16 | #group: 17 | string: Group 18 | 19 | Group Type: 20 | #grouptype: 21 | menu: Group Type 22 | 23 | Run Over: 24 | #class: 25 | menu: Run Over 26 | 27 | Number Count: 28 | #vex_numcount: 29 | int: Number Count 30 | 31 | Thread Job Size: 32 | #vex_threadjobsize: 33 | int: Thread Job Size 34 | 35 | VEXpression: 36 | #snippet: 37 | string: VEXpression 38 | 39 | Attributes to Create: 40 | #exportlist: 41 | string: Attributes to Create 42 | 43 | Enforce Prototypes: 44 | #vex_strict: 45 | toggle: Enforce Prototypes 46 | 47 | Autobind by Name: 48 | #autobind: 49 | toggle: Autobind by Name 50 | 51 | Number of Bindings: 52 | #bindings: 53 | folder: Number of Bindings 54 | 55 | Autobind Groups by Name: 56 | #groupautobind: 57 | toggle: Autobind Groups by Name 58 | 59 | Group Bindings: 60 | #groupbindings: 61 | folder: Group Bindings 62 | 63 | Evaluation Node Path: 64 | #vex_cwdpath: 65 | string: Evaluation Node Path 66 | 67 | Export Parameters: 68 | #vex_outputmask: 69 | string: Export Parameters 70 | 71 | Update Normals If Displaced: 72 | #vex_updatenmls: 73 | toggle: Update Normals If Displaced 74 | 75 | Attribute to Match: 76 | #vex_matchattrib: 77 | string: Attribute to Match 78 | 79 | Compute Results In Place: 80 | #vex_inplace: 81 | toggle: Compute Results In Place 82 | 83 | Output Selection Group: 84 | #vex_selectiongroup: 85 | string: Output Selection Group 86 | 87 | VEX Precision: 88 | #vex_precision: 89 | string: VEX Precision 90 | 91 | Name: 92 | #name: 93 | string: Name -------------------------------------------------------------------------------- /scripts/python/LVRenderUtils.py: -------------------------------------------------------------------------------- 1 | import hou 2 | 3 | 4 | def snapshot_and_save(kwargs): 5 | from time import gmtime, strftime 6 | import shutil 7 | 8 | filename = strftime("Snapshot_%d_%b_%Y_%H_%M_%S", gmtime()) 9 | path = hou.expandString('$HIP') 10 | outpath = path + "/Snapshots/" + filename 11 | 12 | # get rop 13 | 14 | rop = hou.node("/out") 15 | children = rop.children() 16 | 17 | rs_rops = list(filter(lambda x: x.type().name() == 'Redshift_ROP', children)) 18 | if len(rs_rops) == 0: 19 | print("No Redshift_ROP found") 20 | return 21 | else: 22 | rop = rs_rops[0] 23 | 24 | old_range = rop.parm("trange").eval() 25 | old_output = rop.parm("RS_outputFileNamePrefix").eval() 26 | old_mplay = rop.parm("RS_renderToMPlay").eval() 27 | 28 | rop.parm("trange").set("off") 29 | rop.parm("RS_outputFileNamePrefix").set(outpath + ".png") 30 | # rop.parm("RS_renderToMPlay").set(0) 31 | 32 | rop.parm("execute").pressButton() 33 | 34 | rop.parm("trange").set(old_range) 35 | rop.parm("RS_outputFileNamePrefix").set(old_output) 36 | # rop.parm("RS_renderToMPlay").set(old_mplay) 37 | 38 | source_file = hou.hipFile.path() 39 | destination_file = outpath + ".hip" 40 | 41 | shutil.copy(source_file, destination_file) 42 | hou.ui.showInFileBrowser(destination_file) 43 | 44 | 45 | def fix_output(kwargs): 46 | rop = kwargs["node"] 47 | old_output = rop.parm("RS_outputFileNamePrefix").eval() 48 | pngname = old_output.replace(".exr", ".png") 49 | rop.parm("RS_outputFileNamePrefix").set(pngname) 50 | 51 | type_parm = rop.parm("RS_outputFileFormat") 52 | type_parm.set(".png") 53 | -------------------------------------------------------------------------------- /OPmenu.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 21 | 22 | 23 | 24 | 25 | 26 | 32 | 33 | 34 | 35 | 36 | 37 | 43 | 44 | 45 | 46 | 47 | 48 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | -------------------------------------------------------------------------------- /scripts/python/deprecated/stickyController/stickyController.py: -------------------------------------------------------------------------------- 1 | import os 2 | import sys 3 | import hou 4 | import json 5 | 6 | from hutil.PySide import QtCore, QtUiTools, QtWidgets, QtGui 7 | 8 | # from PyQt5.QtCore import * 9 | # from PyQt5.QtUiTools import * 10 | # from PyQt5.QtGui import * 11 | from hutil.PySide.QtWidgets import QGridLayout, QHBoxLayout 12 | 13 | from stickyController import stickyController 14 | 15 | 16 | class StickyController(QtWidgets.QWidget): 17 | def __init__(self): 18 | super(StickyController, self).__init__() 19 | 20 | self.folderpath = hou.getenv("LV") + "/scripts/python/stickyController" 21 | 22 | ui_file_path = self.folderpath + "/BasePanel.ui" 23 | 24 | loader = QtUiTools.QUiLoader() 25 | self.ui = loader.load(ui_file_path) 26 | self.basegrid = self.ui.findChild(QGridLayout, "baseGrid") 27 | 28 | mainLayout = QtWidgets.QVBoxLayout() 29 | 30 | self.initUI() 31 | 32 | mainLayout.addWidget(self.ui) 33 | self.setLayout(mainLayout) 34 | 35 | def initUI(self): 36 | self.c1 = hou.qt.ColorField() 37 | self.c2 = hou.qt.ColorField() 38 | self.hb1 = self.ui.findChild(QHBoxLayout, "hb1") 39 | self.hb2 = self.ui.findChild(QHBoxLayout, "hb2") 40 | self.hb1.addWidget(self.c1) 41 | self.hb2.addWidget(self.c2) 42 | 43 | # node = hou.pwd() 44 | # note = node.parm("note") 45 | # slider = node.parm("size").eval() 46 | # tc = node.parmTuple("tcolor").eval() 47 | # bgc = node.parmTuple("bgc").eval() 48 | # bg = node.parm("bg").eval() 49 | 50 | # sNote = hou.item(note.eval()) 51 | 52 | # tcolor = hou.Color((tc)) 53 | # bgcolor = hou.Color((bgc)) 54 | 55 | # sNote.setTextSize(slider) 56 | # sNote.setTextColor(tcolor) 57 | # sNote.setColor(bgcolor) 58 | # sNote.setDrawBackground(bg) 59 | 60 | -------------------------------------------------------------------------------- /scripts/python/lvnodeutils/test.py: -------------------------------------------------------------------------------- 1 | # from hutil.Qt import QtWidgets, QtUiTools, 2 | from hutil.PySide import QtWidgets, QtUiTools, QtCore, QtGui 3 | from hutil.PySide.QtWidgets import ( 4 | QPushButton, 5 | QComboBox, 6 | QTableWidget, 7 | QTableWidgetItem, 8 | ) 9 | import hou 10 | import os 11 | import json 12 | from importlib import reload 13 | 14 | import LVParmUtils 15 | 16 | reload(LVParmUtils) 17 | 18 | 19 | class lvnodeutils(QtWidgets.QWidget): 20 | def __init__(self): 21 | super().__init__() 22 | self.folderpath = hou.getenv("LV") + "/scripts/python/lvnodeutils" 23 | ui_file_path = self.folderpath + "/lvnodeutils.ui" 24 | 25 | loader = QtUiTools.QUiLoader() 26 | self.ui = loader.load(ui_file_path) 27 | 28 | # create initial 29 | 30 | global btnLayout 31 | 32 | btnLayout = self.ui.findChild(QtWidgets.QVBoxLayout, "btnLayout") 33 | btnLayout = self.ui.findChild(QtWidgets.QVBoxLayout, "btnLayout") 34 | 35 | layout = QtWidgets.QVBoxLayout() 36 | layout.setContentsMargins(0, 0, 0, 0) 37 | 38 | layout.addWidget(self.ui) 39 | self.setLayout(layout) 40 | 41 | def getNode(self, node): 42 | print(node) 43 | 44 | def buildUI(self): 45 | # create buttons 46 | 47 | btns = [] 48 | 49 | addFloatParm = QPushButton("Add Float Parm") 50 | # addFloatParm.clicked.connect(LVParmUtils.addFloatParm(kwargs={"node": hou.selectedNodes()[0]})) 51 | btns.append(addFloatParm) 52 | 53 | for btn in btns: 54 | btnLayout.addWidget(btn) 55 | 56 | # end create buttons 57 | 58 | spacer = QtWidgets.QSpacerItem( 59 | 20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding 60 | ) 61 | btnLayout.addItem(spacer) 62 | -------------------------------------------------------------------------------- /presets/Sop/blast.idx: -------------------------------------------------------------------------------- 1 | INDXLV Class by Iteration8e!P#PSI_PRESET 2 | version 2.0a 3 | opspareparmdef 4 | 0707070000010000000006660000000000000000010000001450702052000001700000002216opspareparmdef parm { 5 | name "group" 6 | baseparm 7 | label "Group" 8 | export none 9 | bindselector everything Delete 10 | "Select the geometry to delete and press Enter to complete." 11 | 0 1 0xffffffff 0 grouptype 0 12 | } 13 | parm { 14 | name "grouptype" 15 | baseparm 16 | label "Group Type" 17 | export none 18 | } 19 | parm { 20 | name "computenorms" 21 | baseparm 22 | label "Recompute Normals" 23 | export none 24 | } 25 | parm { 26 | name "negate" 27 | baseparm 28 | label "Delete Non Selected" 29 | export all 30 | } 31 | parm { 32 | name "fillhole" 33 | baseparm 34 | label "Fill Simple Holes" 35 | export all 36 | } 37 | parm { 38 | name "removegrp" 39 | baseparm 40 | label "Delete Unused Groups" 41 | export none 42 | } 43 | parm { 44 | name "spare_input0" 45 | label "Spare Input 0" 46 | type oppath 47 | default { "" } 48 | help "Refer to this in expressions as -1, such as: npoints(-1)" 49 | parmtag { "cook_dependent" "1" } 50 | parmtag { "opfilter" "!!SOP!!" } 51 | parmtag { "oprelative" "." } 52 | } 53 | opvalues 54 | { 55 | version 0.8 56 | group [ 0 locks=0 ] ( "@class==`detail(-1, \"iteration\", 0)`" ) 57 | grouptype [ 0 locks=0 ] ( "guess" ) 58 | computenorms [ 0 locks=0 ] ( "off" ) 59 | negate [ 0 locks=0 ] ( "off" ) 60 | fillhole [ 0 locks=0 ] ( "off" ) 61 | removegrp [ 0 locks=0 ] ( "off" ) 62 | spare_input0 [ 0 locks=0 ] ( "" ) 63 | } 64 | -------------------------------------------------------------------------------- /scripts/python/LVLightUtils.py: -------------------------------------------------------------------------------- 1 | import hou 2 | from hou import nodeEventType 3 | 4 | 5 | def listenForLight(nodes): 6 | sel = nodes 7 | 8 | types = ['rslightdome::2.0', 'rslight', 'rslightsun'] 9 | 10 | def flagChanged(node, event_type, **kwargs): 11 | flag = node.isDisplayFlagSet() 12 | 13 | # node.setGenericFlag(hou.nodeFlag.DisplayComment, True) 14 | 15 | c = hou.Color() 16 | 17 | if not flag: 18 | # node.setComment('Light Off') 19 | hsv = (0, 1, 1) 20 | c.setHSV(hsv) 21 | node.setColor(c) 22 | else: 23 | # node.setComment('Light On') 24 | hsv = (0, 0, 1) 25 | c.setHSV(hsv) 26 | node.setColor(c) 27 | 28 | for node in sel: 29 | try: 30 | flag = node.isDisplayFlagSet() 31 | 32 | if any(node.type().name() == x for x in types): 33 | node.removeAllEventCallbacks() 34 | node.addEventCallback((hou.nodeEventType.FlagChanged, ), flagChanged) 35 | node.parm('light_enabled').setExpression('hou.pwd().isDisplayFlagSet()', hou.exprLanguage.Python) 36 | 37 | c = hou.Color() 38 | 39 | if not flag: 40 | hsv = (0, 1, 1) 41 | c.setHSV(hsv) 42 | node.setColor(c) 43 | else: 44 | hsv = (0, 0, 1) 45 | c.setHSV(hsv) 46 | node.setColor(c) 47 | except: 48 | pass 49 | 50 | 51 | def light_listen(): 52 | 53 | def prep(event_type, **kwargs): 54 | single = kwargs['child_node'] 55 | listenForLight(tuple([single])) 56 | hou.node("/obj").removeAllEventCallbacks() # type: ignore 57 | hou.node("/obj").addEventCallback((hou.nodeEventType.ChildCreated,), prep) # type: ignore 58 | 59 | objs = hou.node("/obj").children() # type: ignore 60 | for o in objs: 61 | cb = o.eventCallbacks() 62 | -------------------------------------------------------------------------------- /scripts/python/deprecated/graph/graph.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | MainWindow 4 | 5 | 6 | 7 | 0 8 | 0 9 | 560 10 | 600 11 | 12 | 13 | 14 | MainWindow 15 | 16 | 17 | 18 | 19 | 0 20 | 0 21 | 22 | 23 | 24 | 25 | 0 26 | 27 | 28 | 0 29 | 30 | 31 | 0 32 | 33 | 34 | 0 35 | 36 | 37 | 6 38 | 39 | 40 | 41 | 42 | 0 43 | 44 | 45 | 8 46 | 47 | 48 | 49 | 50 | Qt::Vertical 51 | 52 | 53 | 54 | 20 55 | 40 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | -------------------------------------------------------------------------------- /scripts/python/knotcontrol.py: -------------------------------------------------------------------------------- 1 | import hou 2 | import random 3 | 4 | 5 | def doDist(kwargs, ramp_basis): 6 | p = kwargs['parms'][0] 7 | v = p.eval() 8 | keys = v.keys() 9 | new_keys = [] 10 | num_keys = len(v.basis()) 11 | values = v.values() 12 | 13 | new_basis = (ramp_basis, ) * (num_keys + 1) 14 | 15 | if ramp_basis == hou.rampBasis.Constant: 16 | new_basis = (ramp_basis, ) * (num_keys + 1) 17 | for i in range(len(keys)): 18 | new_keys.append(1/(num_keys) * i) 19 | else: 20 | pass 21 | 22 | new_ramp = hou.Ramp(new_basis, list(new_keys), list(v.values())) 23 | 24 | p.set(new_ramp) 25 | 26 | 27 | def randomizeKnots(kwargs): 28 | p = kwargs['parms'][0] 29 | v = p.eval() 30 | ramp_basis = v.basis()[0] 31 | keys = v.keys() 32 | new_keys = [] 33 | num_keys = len(v.basis()) 34 | values = v.values() 35 | 36 | new_basis = (ramp_basis, ) * (num_keys) 37 | 38 | new_basis = (ramp_basis, ) * (num_keys + 1) 39 | for i in range(len(keys)): 40 | new_keys.append(1/(num_keys - 1) * i) 41 | 42 | val_list = list(values) 43 | random.shuffle(val_list) 44 | 45 | new_ramp = hou.Ramp(new_basis, list(new_keys), val_list) 46 | 47 | p.set(new_ramp) 48 | 49 | 50 | def sortKnots(kwargs): 51 | 52 | def huesort(val): 53 | col = hou.Color(val) 54 | return col.hsv()[0] 55 | 56 | p = kwargs['parms'][0] 57 | v = p.eval() 58 | ramp_basis = v.basis()[0] 59 | keys = v.keys() 60 | new_keys = [] 61 | num_keys = len(v.basis()) 62 | values = v.values() 63 | 64 | print(values) 65 | 66 | new_basis = (ramp_basis, ) * (num_keys) 67 | 68 | new_basis = (ramp_basis, ) * (num_keys + 1) 69 | for i in range(len(keys)): 70 | new_keys.append(1/(num_keys - 1) * i) 71 | 72 | val_list = list(values) 73 | val_list.sort(key=huesort) 74 | 75 | new_ramp = hou.Ramp(new_basis, list(new_keys), val_list) 76 | 77 | p.set(new_ramp) 78 | -------------------------------------------------------------------------------- /scripts/python/LVAI.py: -------------------------------------------------------------------------------- 1 | import hou 2 | import openai 3 | import os 4 | from dotenv import load_dotenv, find_dotenv, dotenv_values 5 | 6 | 7 | def setKey(): 8 | pbase = os.getcwd() 9 | pdir = os.path.dirname(os.path.abspath(__file__)) 10 | os.chdir(pdir) 11 | load_dotenv(find_dotenv()) 12 | keys = dotenv_values(".env") 13 | key = list(keys.values())[0] 14 | pbase = os.getcwd() 15 | pdir = os.path.dirname(os.path.abspath(__file__)) 16 | os.chdir(pbase) 17 | if key == "" or key == None: 18 | c, val = hou.ui.readInput("Please acquire OpenAI key and paste here", buttons=("Ok", "Cancel",), title="Open AI Key", close_choice=1) 19 | if c == 0: 20 | os.chdir(pdir) 21 | if not val == "": 22 | with open(".env", "w") as f: 23 | f.write("OPENAI_KEY=" + val) 24 | os.chdir(pbase) 25 | key = val 26 | 27 | return key 28 | 29 | 30 | def call(): 31 | key = setKey() 32 | if (key == ""): 33 | # print("OpenAI key is not set") 34 | pass 35 | else: 36 | openai.api_key = key 37 | node = hou.selectedNodes()[0] 38 | snippet = node.parm("snippet") 39 | 40 | print("GPT-3 is running...") 41 | 42 | initial = snippet.eval() 43 | 44 | snippet.set("// Running GPT-3...\n\n" + initial) 45 | 46 | response = openai.chat.completions.create( 47 | messages=[{"role": "system", "content": "you are are a code solving robot. I return only code blocks"}, 48 | {"role": "user", "content": "add comments to this houdini vex code: ```\n" + initial + "\n``` do not return anything other than code block. do not explain answer"}], 49 | model="gpt-3.5-turbo", 50 | 51 | ) 52 | resp = response.choices[0].message.content.split("```") 53 | a = resp[1] if resp[0] == "" else resp[0] 54 | snippet.set(a.split("\n", 1)[1]) 55 | -------------------------------------------------------------------------------- /scripts/python/deprecated/RSLightMixer/RSLightMixer.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | MainWindow 4 | 5 | 6 | 7 | 0 8 | 0 9 | 560 10 | 600 11 | 12 | 13 | 14 | MainWindow 15 | 16 | 17 | 18 | 19 | 0 20 | 0 21 | 22 | 23 | 24 | 25 | 0 26 | 27 | 28 | 0 29 | 30 | 31 | 0 32 | 33 | 34 | 0 35 | 36 | 37 | 6 38 | 39 | 40 | 41 | 42 | QLayout::SetMaximumSize 43 | 44 | 45 | 46 | 47 | Qt::Vertical 48 | 49 | 50 | 51 | 20 52 | 40 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | -------------------------------------------------------------------------------- /scripts/python/deprecated/easeManager/ease/ease000.json: -------------------------------------------------------------------------------- 1 | {"name": "", "times": [0.0, 1.12], "frames": [1.0, 29.0], "values": [1.0, 1.2615943513458083], "accels": [0.5208333333333334, 0.26286734413119967], "slopes": [0.0, 3.5573653181451053], "plot_values": [1.0, 0.9999720456230767, 0.9998871601829715, 0.9997437789466993, 0.9995402919019525, 0.9992750432063309, 0.9989463281042649, 0.9985523961237015, 0.9980914423656104, 0.9975616081034231, 0.9969609855709118, 0.9962876047516255, 0.9955394385541773, 0.9947143958489914, 0.9938103311547416, 0.9928250247946904, 0.9917561878974244, 0.9906014724586437, 0.9893584459941056, 0.9880246035433564, 0.9865973558879951, 0.9850740469920132, 0.9834519205208123, 0.9817281300387839, 0.9798997553377249, 0.9779637621860245, 0.9759170224609047, 0.9737562963259371, 0.971478258927615, 0.9690794501016087, 0.966556299819253, 0.963905106215517, 0.9611220683542191, 0.9582032245611606, 0.9551444726606598, 0.9519415985616847, 0.9485902050573921, 0.9450857479057885, 0.9414235050109189, 0.9375986213760097, 0.933606023643128, 0.9294404480515024, 0.9250964786229017, 0.9205684496733498, 0.9158504944351402, 0.9109365027090218, 0.9058201802724962, 0.9004949332726492, 0.8949539049732805, 0.8891900251032533, 0.8831958788468987, 0.8769637701217119, 0.8704856638744045, 0.8637532625040284, 0.8567578514449086, 0.8494903456196141, 0.8419413515233134, 0.8341009927170362, 0.8259589899506072, 0.8175045824663154, 0.8087266241674982, 0.7996133782526097, 0.7901525737944521, 0.7803314818556168, 0.7701366833328895, 0.7595541678692609, 0.7485692255997805, 0.7371665656509099, 0.7253300423187299, 0.7130427210237988, 0.7002869688919069, 0.6870441442944817, 0.6732947156002933, 0.659018110005695, 0.6441928561770984, 0.6287962160566115, 0.6128043147320801, 0.596191955949654, 0.5789327787729202, 0.5609988190754971, 0.5423605825882155, 0.5229871542861471, 0.5028456969998472, 0.4819015986467765, 0.4601182071905041, 0.43745701117358227, 0.4138770381564302, 0.38933492180090556, 0.36378501725103163, 0.33717871044141723, 0.30946458013484757, 0.2805880156119058, 0.25049142423227566, 0.21911340223496922, 0.18638879174960787, 0.1522488077622608, 0.1166200926599471, 0.07942491244154537, 0.040580633142817235, 0.0]} -------------------------------------------------------------------------------- /scripts/python/quickmarks/quickmarks.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | Form 4 | 5 | 6 | 7 | 0 8 | 0 9 | 400 10 | 300 11 | 12 | 13 | 14 | 15 | 1 16 | 1 17 | 18 | 19 | 20 | Form 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 0 30 | 0 31 | 32 | 33 | 34 | Jump 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 0 45 | 0 46 | 47 | 48 | 49 | Add 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 0 58 | 0 59 | 60 | 61 | 62 | Delete 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | -------------------------------------------------------------------------------- /scripts/python/deprecated/graph/graph.py: -------------------------------------------------------------------------------- 1 | import os 2 | import sys 3 | import hou 4 | import json 5 | 6 | from hutil.Qt import QtCore, QtUiTools, QtWidgets, QtGui 7 | # from PyQt5.QtCore import * 8 | # from PyQt5.QtUiTools import * 9 | # from PyQt5.QtGui import * 10 | # from PyQt5.QtWidgets import * 11 | 12 | from graph import graph 13 | 14 | class graph(QtWidgets.QWidget): 15 | 16 | def __init__(self): 17 | super(graph, self).__init__() 18 | 19 | self.folderpath = hou.getenv("LV") + "/scripts/python/graph" 20 | 21 | ui_file_path = self.folderpath + "/graph.ui" 22 | 23 | loader = QtUiTools.QUiLoader() 24 | self.ui = loader.load(ui_file_path) 25 | 26 | 27 | self.mainGrid = self.ui.findChild(QtWidgets.QGridLayout, "mainGrid") 28 | 29 | self.y_values = [10, 30, 20, 50, 40, 30, 20, 10] 30 | self.graph = GraphView(self.y_values) 31 | 32 | self.mainGrid.addWidget(self.graph, 0, 0) 33 | 34 | self.createInterface() #run create interface 35 | 36 | mainLayout = QtWidgets.QVBoxLayout() 37 | 38 | mainLayout.addWidget(self.ui) 39 | self.setLayout(mainLayout) 40 | 41 | def createInterface(self): 42 | pass 43 | 44 | class GraphView(QtWidgets.QGraphicsView): 45 | def __init__(self, y_values): 46 | super().__init__() 47 | 48 | self.y_values = y_values 49 | 50 | # set up the scene 51 | self.scene = QtWidgets.QGraphicsScene(self) 52 | self.setScene(self.scene) 53 | 54 | self.setFixedSize(100, 100) 55 | self.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) 56 | self.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) 57 | 58 | self.setStyleSheet("border: None;") 59 | 60 | 61 | # set up the pen for drawing the lines 62 | self.pen = QtGui.QPen(QtCore.Qt.white) 63 | self.pen.setWidth(1) 64 | 65 | def resizeEvent(self, event): 66 | # resize the scene to match the view 67 | 68 | # clear any existing items from the scene 69 | self.scene.clear() 70 | 71 | # calculate the x spacing 72 | num_points = len(self.y_values) 73 | x_spacing = self.width() / (num_points - 1) 74 | 75 | # draw the lines between the points 76 | for i in range(num_points - 1): 77 | x1 = i * x_spacing 78 | y1 = self.y_values[i] 79 | x2 = (i + 1) * x_spacing 80 | y2 = self.y_values[i + 1] 81 | line = QtWidgets.QGraphicsLineItem(x1, y1, x2, y2) 82 | line.setPen(self.pen) 83 | self.scene.addItem(line) -------------------------------------------------------------------------------- /scripts/python/deprecated/RSLightMixer/RSLightMixer.py: -------------------------------------------------------------------------------- 1 | import os 2 | import sys 3 | import hou 4 | import json 5 | 6 | from hutil.PySide import QtCore, QtUiTools, QtWidgets, QtGui 7 | from hutil.PySide.QtWidgets import QWidget, QGridLayout, QVBoxLayout, QSlider, QLabel, QPushButton, QHBoxLayout, QCheckBox 8 | from hutil.PySide.QtCore import Qt 9 | 10 | from RSLightMixer import RSLightMixer 11 | 12 | loader = QtUiTools.QUiLoader() 13 | 14 | class RSLightMixer(QtWidgets.QWidget): 15 | 16 | def __init__(self): 17 | super(RSLightMixer, self).__init__() 18 | 19 | self.folderpath = os.path.dirname(os.path.realpath(__file__)) 20 | 21 | ui_file_path = self.folderpath + "/RSLightMixer.ui" 22 | 23 | self.ui = loader.load(ui_file_path) 24 | 25 | self.layout = QtWidgets.QVBoxLayout() 26 | self.main = self.ui.findChild(QGridLayout, "itemBox") 27 | 28 | self.fillList() 29 | 30 | self.layout.addWidget(self.ui) 31 | self.setLayout(self.layout) 32 | 33 | 34 | 35 | 36 | def fillList(self): 37 | geo = hou.node('/obj').children() 38 | 39 | i = 0 40 | for node in geo: 41 | # if node.type().name() == 'rsLight': 42 | item = LightItem(node) 43 | self.main.addWidget(item, i, 0) 44 | i += 1 45 | 46 | class LightItem(QWidget): 47 | def __init__(self, node): 48 | super().__init__() 49 | 50 | parmDict = ['RSL_intensityMultiplier', 51 | 'Light1_exposure', 52 | 'RSL_spread'] 53 | 54 | self.node = node 55 | 56 | self.folderpath = os.path.dirname(os.path.realpath(__file__)) 57 | 58 | self.item = loader.load(self.folderpath + "/Item.ui") 59 | 60 | self.itemMain = self.item.findChild(QHBoxLayout) 61 | self.itemV = self.item.findChild(QVBoxLayout, "lightItem") 62 | 63 | self.enable = self.item.findChild(QCheckBox) 64 | if self.node.parm('light_enabled').eval() == 1: 65 | self.enable.setChecked(True) 66 | 67 | self.enable.setText(self.node.name()) 68 | 69 | for parm in self.node.parms(): 70 | if parm.name() in parmDict: 71 | 72 | holder = QHBoxLayout() 73 | label = QLabel(parm.description()) 74 | label.setMinimumWidth(120) 75 | slider = QSlider(Qt.Horizontal) 76 | 77 | holder.addWidget(label) 78 | holder.addWidget(slider) 79 | 80 | self.itemV.addLayout(holder) 81 | 82 | 83 | 84 | #pass item into widget 85 | self.setLayout(self.itemMain) 86 | self.setFixedHeight(self.sizeHint().height()) 87 | 88 | 89 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /scripts/python/deprecated/RSLightMixer/item.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | main 4 | 5 | 6 | 7 | 0 8 | 0 9 | 400 10 | 218 11 | 12 | 13 | 14 | Form 15 | 16 | 17 | 18 | 19 | 20 | 21 | 0 22 | 23 | 24 | 0 25 | 26 | 27 | 0 28 | 29 | 30 | 0 31 | 32 | 33 | 34 | 35 | QLayout::SetMinimumSize 36 | 37 | 38 | 0 39 | 40 | 41 | 0 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 0 50 | 0 51 | 52 | 53 | 54 | QFrame::StyledPanel 55 | 56 | 57 | QFrame::Raised 58 | 59 | 60 | 61 | 62 | 63 | 0 64 | 65 | 66 | 67 | 68 | 69 | 70 | Light Name 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | -------------------------------------------------------------------------------- /python3.10libs/extra.py: -------------------------------------------------------------------------------- 1 | import hou 2 | from canvaseventtypes import * 3 | import nodegraphdisplay as display 4 | import nodegraphview as view 5 | from datetime import datetime 6 | 7 | 8 | def do_stuff(uievent): 9 | createEventHandler(uievent) 10 | # print("consistent double click") 11 | 12 | 13 | def createEventHandler(uievent): 14 | 15 | if isinstance(uievent, MouseEvent): 16 | if (uievent.eventtype == 'mousewheel'): 17 | node_dive(uievent) 18 | if (uievent.eventtype == 'mousedown'): 19 | try: 20 | 21 | if not hou.session.first_click: 22 | if hou.session.first_click - datetime.now() > 1000: 23 | hou.session.first_click = datetime.now() 24 | else: 25 | second = datetime.now() 26 | diff = second - hou.session.first_click 27 | mil_diff = diff.total_seconds() * 1000 28 | # if diff > 500: 29 | if not mil_diff < 200: 30 | hou.session.first_click = datetime.now() 31 | 32 | else: 33 | ctrl = uievent.modifierstate.ctrl 34 | shift = uievent.modifierstate.shift 35 | if (ctrl and shift): 36 | pos = uievent.mousepos 37 | editor = uievent.editor 38 | items = editor.networkItemsInBox(pos, pos, for_select=True) 39 | node = items[-1][0] 40 | 41 | name = node.name() 42 | 43 | name = "OUT_" + name 44 | 45 | null = node.createOutputNode('null', name) 46 | null.moveToGoodPosition() 47 | 48 | except: 49 | hou.session.first_click = datetime.now() 50 | 51 | return None, True 52 | return None, False 53 | 54 | def node_dive(uievent): 55 | try: 56 | ctrl = uievent.modifierstate.ctrl 57 | 58 | if ctrl: 59 | net = hou.ui.paneTabUnderCursor() 60 | netpos = net.cursorPosition() 61 | b = net.visibleBounds() 62 | min = b.min() 63 | max = b.max() 64 | tl = hou.Vector2(min.x(), max.y()) 65 | br = hou.Vector2(max.x(), min.y()) 66 | 67 | visnodes = net.networkItemsInBox(net.posToScreen(tl), net.posToScreen(br), for_select=True) 68 | sorted_visnodes = sorted([node[0] for node in visnodes if node[1] == "node"], key=lambda x: (netpos - x.position()).length()) 69 | hero = sorted_visnodes[0] 70 | 71 | if uievent.wheelvalue > 0: 72 | net.cd(hero.path()) 73 | else: 74 | net.setCurrentNode(hero.parent()) 75 | except: 76 | pass -------------------------------------------------------------------------------- /scripts/python/LVAnimTools.py: -------------------------------------------------------------------------------- 1 | import hou 2 | 3 | 4 | # def getKeys(): 5 | # """ 6 | # Returns a list of keyframes for the selected nodes. 7 | # """ 8 | # pane_tab = hou.ui.paneTabOfType(hou.paneTabType.ChannelEditor) 9 | # keyframes = pane_tab.graph().selectedKeyframes() 10 | 11 | # for parm in keyframes.keys(): 12 | # for key in keyframes[parm]: 13 | # # print(key) 14 | # print(key.isSlopeAuto()) 15 | # print(key.asCode()) 16 | # # val = key.value() 17 | # # t = key.time() 18 | # # inAccel = key.inAccel() 19 | # # outAccel = key.accel() 20 | 21 | # # inSlope = key.inSlope() 22 | # # outSlope = key.slope() 23 | 24 | # # print(val, t, inAccel, outAccel, inSlope, outSlope) 25 | 26 | 27 | def flip_y(): 28 | """ 29 | Returns a list of keyframes for the selected nodes. 30 | """ 31 | pane_tab = hou.ui.paneTabOfType(hou.paneTabType.ChannelEditor) 32 | keyframes = pane_tab.graph().selectedKeyframes() 33 | 34 | for parm in keyframes.keys(): 35 | 36 | vals = [] 37 | for key in keyframes[parm]: 38 | vals.append(key.value()) 39 | 40 | min_val = min(vals) 41 | max_val = max(vals) 42 | 43 | for key in keyframes[parm]: 44 | val = key.value() 45 | led = lerp(val, min_val, max_val, max_val, min_val) 46 | key.setValue(led) 47 | # key.setValue(lerp(val, min_val, max_val, max_val, min_val)) 48 | # inAccel = key.inAccel() 49 | # outAccel = key.accel() 50 | 51 | # inSlope = key.inSlope() 52 | # outSlope = key.slope() 53 | parm.setKeyframe(key) 54 | 55 | 56 | def flip_x(): 57 | """ 58 | Returns a list of keyframes for the selected nodes. 59 | """ 60 | pane_tab = hou.ui.paneTabOfType(hou.paneTabType.ChannelEditor) 61 | keyframes = pane_tab.graph().selectedKeyframes() 62 | 63 | for parm in keyframes.keys(): 64 | 65 | flipped = keyframes[parm][::-1] 66 | print(flipped) 67 | print(keyframes[parm]) 68 | 69 | for key in keyframes[parm]: 70 | code = key.asCode(function_name="key") 71 | # key = code 72 | # print(code) 73 | # print(type(code)) 74 | # val = key.value() 75 | # # key.setValue(lerp(val, min_val, max_val, max_val, min_val)) 76 | # # inAccel = key.inAccel() 77 | # # outAccel = key.accel() 78 | 79 | # # inSlope = key.inSlope() 80 | # # outSlope = key.slope() 81 | # parm.setKeyframe(eval(str(key))) 82 | 83 | 84 | def lerp(value, inmin, inmax, outmin, outmax): 85 | """ 86 | Linearly interpolates a value from one range to another. 87 | """ 88 | return (value - inmin) * (outmax - outmin) / (inmax - inmin) + outmin 89 | -------------------------------------------------------------------------------- /scripts/python/deprecated/easecontrol/flipY_simple Working.py: -------------------------------------------------------------------------------- 1 | import hou 2 | #lerps courtesy of https://gist.github.com/laundmo/b224b1f4c8ef6ca5fe47e132c8deab56 3 | def lerp(a: float, b: float, t: float) -> float: 4 | """Linear interpolate on the scale given by a to b, using t as the point on that scale. 5 | Examples 6 | -------- 7 | 50 == lerp(0, 100, 0.5) 8 | 4.2 == lerp(1, 5, 0.8) 9 | """ 10 | return (1 - t) * a + t * b 11 | 12 | def inv_lerp(a: float, b: float, v: float) -> float: 13 | """Inverse Linar Interpolation, get the fraction between a and b on which v resides. 14 | Examples 15 | -------- 16 | 0.5 == inv_lerp(0, 100, 50) 17 | 0.8 == inv_lerp(1, 5, 4.2) 18 | """ 19 | return (v - a) / (b - a) 20 | 21 | def remap(i_min: float, i_max: float, o_min: float, o_max: float, v: float) -> float: 22 | """Remap values from one linear scale to another, a combination of lerp and inv_lerp. 23 | i_min and i_max are the scale on which the original value resides, 24 | o_min and o_max are the scale to which it should be mapped. 25 | Examples 26 | -------- 27 | 45 == remap(0, 100, 40, 50, 50) 28 | 6.2 == remap(1, 5, 3, 7, 4.2) 29 | """ 30 | return lerp(o_min, o_max, inv_lerp(i_min, i_max, v)) 31 | 32 | def doFlip(): 33 | print('--------') 34 | pane_tab = hou.ui.paneTabOfType(hou.paneTabType.ChannelEditor) 35 | keyframes = pane_tab.graph().selectedKeyframes() 36 | 37 | pb = hou.playbar.playbackRange() 38 | dur = pb[1]-pb[0]+1 39 | 40 | flipped = [] 41 | base_keys = [] 42 | val = [] 43 | 44 | for parm in keyframes.keys(): 45 | for key in keyframes[parm]: 46 | flipped.append(key) 47 | base_keys.append(key) 48 | val.append(key.value()) 49 | 50 | parm.deleteAllKeyframes() 51 | 52 | #find min and max 53 | k_min = 0.0 54 | k_max = 0.0 55 | for test_key in base_keys: 56 | test_val = test_key.value() 57 | if test_val > k_max: 58 | k_max = test_val 59 | elif test_val < k_min: 60 | k_min = test_val 61 | 62 | print("Min: ", k_min, ". Max: ", k_max) 63 | 64 | flipped.reverse() 65 | 66 | kl = len(flipped)-1 67 | 68 | for parm in keyframes.keys(): 69 | 70 | endKey = hou.Keyframe() 71 | endKey.setFrame(dur) 72 | parm.setKeyframe(endKey) 73 | 74 | for index in range(len(base_keys)): 75 | 76 | # New keyframe from unflipped set. This is BASE 77 | newKey = base_keys[index] 78 | 79 | #v = val[kl-index] 80 | 81 | # Set value 82 | #l_val = remap(k_min, k_max, k_max, k_min, newKey.value()) 83 | #newKey.setValue(l_val) 84 | 85 | # Set ease 86 | newKey.setSlope(newKey.slope() * -1) 87 | 88 | parm.setKeyframe(newKey) 89 | #pass 90 | 91 | parm.deleteKeyframeAtFrame(dur) -------------------------------------------------------------------------------- /scripts/python/rampSave.py: -------------------------------------------------------------------------------- 1 | import hou 2 | import os 3 | import json 4 | 5 | folderpath = hou.getenv("LV") 6 | 7 | def save(kwargs): 8 | 9 | p = kwargs['parms'][0] 10 | v = p.eval() 11 | keys = v.keys() 12 | ramp_basis = v.basis()[0] 13 | new_keys = [] 14 | num_keys = len(v.basis()) 15 | values = v.values() 16 | 17 | basis_type = 0 18 | if ramp_basis == hou.rampBasis.Linear: 19 | basis_type = 0 20 | elif ramp_basis == hou.rampBasis.Constant: 21 | basis_type = 1 22 | elif ramp_basis == hou.rampBasis.CatmullRom: 23 | basis_type = 2 24 | elif ramp_basis == hou.rampBasis.MonotoneCubic: 25 | basis_type = 3 26 | elif ramp_basis == hou.rampBasis.Bezier: 27 | basis_type = 4 28 | elif ramp_basis == hou.rampBasis.BSpline: 29 | basis_type = 5 30 | elif ramp_basis == hou.rampBasis.Hermite: 31 | basis_type = 6 32 | 33 | plot_values = [v.lookup(i*0.1) for i in range(10)] 34 | ramp = { 35 | "ramp_basis": basis_type, 36 | "ramp_keys": str(keys), 37 | "ramp_values": str(values), 38 | "plot_values": plot_values 39 | } 40 | 41 | saveJson(ramp) 42 | 43 | def saveJson(ramp): 44 | prefs = ramp 45 | with open(f"{folderpath}\prefs.json", "w") as outfile: 46 | json.dump(prefs, outfile) 47 | 48 | def load(kwargs, ramp_basis): 49 | p = kwargs['parms'][0] 50 | 51 | if os.path.isfile(f"{folderpath}\prefs.json"): 52 | 53 | with open(f"{folderpath}\prefs.json", "r") as openfile: 54 | json_object = json.load(openfile) 55 | 56 | basis_type = json_object["ramp_basis"] 57 | basis = None 58 | if basis_type == 0: 59 | basis = hou.rampBasis.Linear 60 | elif basis_type == 1: 61 | basis = hou.rampBasis.Constant 62 | elif basis_type == 2: 63 | basis = hou.rampBasis.CatmullRom 64 | elif basis_type == 3: 65 | basis = hou.rampBasis.MonotoneCubic 66 | elif basis_type == 4: 67 | basis = hou.rampBasis.Bezier 68 | elif basis_type == 5: 69 | basis = hou.rampBasis.BSpline 70 | elif basis_type == 6: 71 | basis = hou.rampBasis.Hermite 72 | 73 | keys = json_object["ramp_keys"].strip("()") 74 | keys = keys.split(", ") 75 | keys = list(dict.fromkeys(keys)) 76 | new_keys = [] 77 | for k in keys: 78 | new_keys.append(float(k)) 79 | 80 | values = json_object["ramp_values"].strip("()") 81 | values = values.split(", ") 82 | values = list(dict.fromkeys(values)) 83 | new_values = [] 84 | for val in values: 85 | new_values.append(float(val)) 86 | 87 | new_basis = (basis, ) * len(new_keys) 88 | 89 | new_ramp = hou.Ramp(new_basis, new_keys, new_values) 90 | 91 | p.set(new_ramp) -------------------------------------------------------------------------------- /scripts/python/LVRadMenu.py: -------------------------------------------------------------------------------- 1 | import LVUtils 2 | import LVNodes 3 | from importlib import reload 4 | from functools import partial 5 | 6 | def build_menu(kwargs, radialmenu): 7 | 8 | def call_func(func, kwargs): 9 | reload(LVUtils) 10 | reload(LVNodes) 11 | if func == "createNamedGeo": 12 | LVUtils.createNamedGeo(kwargs) 13 | elif func == "openControls": 14 | LVUtils.openControls() 15 | elif func == "changeColor": 16 | LVUtils.colorControl() 17 | elif func == "childNull": 18 | LVUtils.createChildNull(kwargs) 19 | elif func == "createFocusTarget": 20 | LVNodes.createRSFocusTarget(kwargs) 21 | elif func == "scenefilePreview": 22 | LVUtils.scenefile_preview() 23 | elif func == "createRSMaterial": 24 | LVUtils.createRSMaterial(kwargs) 25 | 26 | pane = kwargs["pane"] 27 | ptype = pane.pwd().type().name() 28 | contextname = pane.pwd().childTypeCategory() 29 | selected = pane.pwd().selectedItems() 30 | 31 | menu = {} 32 | 33 | directions = ["n", "s", "e", "w", "ne", "nw", "se", "sw"] 34 | items = [] 35 | 36 | if ptype == "obj": 37 | items.append({ 38 | "type": "script_action", 39 | "label": "Named Geo", 40 | "icon": "$LV/lv.svg", 41 | "script": lambda **kwargs: call_func("createNamedGeo",kwargs), 42 | }) 43 | 44 | items.append({ 45 | "type": "script_action", 46 | "label": "Open Controls", 47 | "icon": "$LV/lv.svg", 48 | "script": lambda **kwargs: call_func("openControls", kwargs), 49 | }) 50 | items.append({ 51 | "type": "script_action", 52 | "label": "Change Color", 53 | "icon": "$LV/lv.svg", 54 | "script": lambda **kwargs: call_func("changeColor", kwargs), 55 | }) 56 | if ptype == "geo": 57 | items.append({ 58 | "type": "script_action", 59 | "label": "Create Ouput Null", 60 | "icon": "$LV/lv.svg", 61 | "script": lambda **kwargs: call_func("childNull", kwargs), 62 | }) 63 | if any([n.type().name() == "cam" for n in selected]): 64 | items.append({ 65 | "type": "script_action", 66 | "label": "Create Focus Target", 67 | "icon": "$LV/lv.svg", 68 | "script": lambda **kwargs: call_func("createFocusTarget", kwargs), 69 | }) 70 | 71 | items.append({ 72 | "type": "script_action", 73 | "label": "Viewport Snapshot", 74 | "icon": "$LV/lv.svg", 75 | "script": lambda **kwargs: call_func("scenefilePreview", kwargs), 76 | }) 77 | 78 | if ptype == "mat": 79 | items.append({ 80 | "type": "script_action", 81 | "label": "Create RS Material", 82 | "icon": "$LV/lv.svg", 83 | "script": lambda **kwargs: call_func("createRSMaterial", kwargs), 84 | }) 85 | 86 | for i, item in enumerate(items): 87 | 88 | menu[directions[i]] = item 89 | 90 | 91 | radialmenu.setRadialMenu(menu) -------------------------------------------------------------------------------- /scripts/python/LVProjectManager/LVProjectManager.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | root 4 | 5 | 6 | 7 | 0 8 | 0 9 | 762 10 | 491 11 | 12 | 13 | 14 | Form 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | Add Folder 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | Select path 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 0 44 | 45 | 46 | 47 | 48 | Open Explorer 49 | 50 | 51 | 52 | 53 | 54 | 55 | Save Incremental 56 | 57 | 58 | 59 | 60 | 61 | 62 | Set $JOB 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 0 72 | 73 | 74 | 75 | 76 | No folder selected 77 | 78 | 79 | 80 | 81 | 82 | 83 | No folder selected 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | false 93 | 94 | 95 | 0 96 | 97 | 98 | 99 | Project 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | -------------------------------------------------------------------------------- /scripts/python/deprecated/RSLightLink/icon/checkmark.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 21 | 23 | 25 | 29 | 33 | 34 | 41 | 51 | 52 | 71 | 73 | 74 | 76 | image/svg+xml 77 | 79 | 80 | 81 | 82 | 83 | 87 | 93 | 94 | 95 | -------------------------------------------------------------------------------- /scripts/python/lvnodeutils/lvnodeutils.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | MainWindow 4 | 5 | 6 | 7 | 0 8 | 0 9 | 1099 10 | 443 11 | 12 | 13 | 14 | Project Selector 15 | 16 | 17 | 18 | 19 | 0 20 | 0 21 | 22 | 23 | 24 | 25 | QLayout::SetMinimumSize 26 | 27 | 28 | 29 | 30 | No node selected 31 | 32 | 33 | 34 | 35 | 36 | 37 | QLayout::SetMinimumSize 38 | 39 | 40 | 0 41 | 42 | 43 | 44 | 45 | QLayout::SetMinimumSize 46 | 47 | 48 | 49 | 50 | ho 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | true 63 | 64 | 65 | 66 | 67 | 0 68 | 0 69 | 1071 70 | 349 71 | 72 | 73 | 74 | 75 | 2 76 | 77 | 78 | QLayout::SetMinimumSize 79 | 80 | 81 | 0 82 | 83 | 84 | 0 85 | 86 | 87 | 0 88 | 89 | 90 | 0 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | -------------------------------------------------------------------------------- /scripts/python/deprecated/RSLightLink/item.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | main 4 | 5 | 6 | 7 | 0 8 | 0 9 | 400 10 | 300 11 | 12 | 13 | 14 | Form 15 | 16 | 17 | 18 | 19 | 20 | 21 | 0 22 | 23 | 24 | 0 25 | 26 | 27 | 0 28 | 29 | 30 | 0 31 | 32 | 33 | 34 | 35 | 0 36 | 37 | 38 | 0 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 16 47 | 0 48 | 49 | 50 | 51 | 52 | 24 53 | 16777215 54 | 55 | 56 | 57 | icon 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 0 66 | 0 67 | 68 | 69 | 70 | 71 | 0 72 | 0 73 | 74 | 75 | 76 | TextLabel 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 150 85 | 16777215 86 | 87 | 88 | 89 | color:hsl(0,0,70%) 90 | 91 | 92 | Light Included 93 | 94 | 95 | true 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 150 104 | 16777215 105 | 106 | 107 | 108 | color:hsl(0,0,70%) 109 | 110 | 111 | Shadow Included 112 | 113 | 114 | true 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | Qt::Horizontal 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | -------------------------------------------------------------------------------- /scripts/python/deprecated/stickyController/BasePanel.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | MainWindow 4 | 5 | 6 | 7 | 0 8 | 0 9 | 560 10 | 600 11 | 12 | 13 | 14 | MainWindow 15 | 16 | 17 | 18 | 19 | 0 20 | 0 21 | 22 | 23 | 24 | 25 | 0 26 | 27 | 28 | 0 29 | 30 | 31 | 0 32 | 33 | 34 | 0 35 | 36 | 37 | 6 38 | 39 | 40 | 41 | 42 | 0 43 | 44 | 45 | 50 46 | 47 | 48 | 8 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 100 57 | 0 58 | 59 | 60 | 61 | 62 | 100 63 | 16777215 64 | 65 | 66 | 67 | Background Color 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | true 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 100 94 | 0 95 | 96 | 97 | 98 | 99 | 100 100 | 16777215 101 | 102 | 103 | 104 | Text Color 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | Qt::Horizontal 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | Qt::Vertical 123 | 124 | 125 | 126 | 20 127 | 40 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | -------------------------------------------------------------------------------- /scripts/python/deprecated/RSLightLink/RSLightLink.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | MainWindow 4 | 5 | 6 | 7 | 0 8 | 0 9 | 560 10 | 600 11 | 12 | 13 | 14 | MainWindow 15 | 16 | 17 | 18 | 19 | 0 20 | 0 21 | 22 | 23 | 24 | 25 | QLayout::SetMinimumSize 26 | 27 | 28 | 0 29 | 30 | 31 | 0 32 | 33 | 34 | 0 35 | 36 | 37 | 0 38 | 39 | 40 | 6 41 | 42 | 43 | 44 | 45 | 6 46 | 47 | 48 | QLayout::SetMinimumSize 49 | 50 | 51 | 52 | 53 | RS Light 54 | 55 | 56 | 57 | 58 | 59 | 60 | Sync Selected 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | Qt::Vertical 70 | 71 | 72 | 73 | 20 74 | 40 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 0 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 16777215 93 | 0 94 | 95 | 96 | 97 | color: #e5e5e5 98 | 99 | 100 | Exclude 101 | 102 | 103 | true 104 | 105 | 106 | true 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 16777215 115 | 0 116 | 117 | 118 | 119 | color: #161616 120 | 121 | 122 | Include 123 | 124 | 125 | true 126 | 127 | 128 | false 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | -------------------------------------------------------------------------------- /scripts/python/HDAUtils.py: -------------------------------------------------------------------------------- 1 | import os 2 | import hou 3 | 4 | 5 | def findLoadedHDAs(): 6 | ''' 7 | Returns a list of loaded HDAs in Houdini scene. 8 | HDAs installed by default with Houdini are skipped. 9 | ''' 10 | loadedHDAs = [] 11 | # Scan all node categories 12 | for category in hou.nodeTypeCategories().values(): 13 | # Scan all node types 14 | for nodeType in category.nodeTypes().values(): 15 | nodeDef = nodeType.definition() 16 | # If its a valid and unique HDA 17 | if (nodeDef is not None) and \ 18 | (nodeDef.libraryFilePath() not in loadedHDAs): 19 | # If not stored at "HFS" (Houdini Installation) 20 | if nodeDef.libraryFilePath().startswith(hou.getenv("LV")): 21 | loadedHDAs.append(nodeDef) 22 | 23 | return loadedHDAs 24 | 25 | 26 | def build_help(): 27 | geo = hou.node("/obj/geo1") 28 | print(geo) 29 | i = 0 30 | for hda in findLoadedHDAs(): 31 | if hda.nodeTypeCategory().name() == "Sop": 32 | if not "dev" in hda.nodeTypeName().lower(): 33 | node = geo.createNode(hda.nodeTypeName()) 34 | 35 | # node = hou.selectedNodes()[0] 36 | type_name = node.type().name() 37 | node_type = node.type().category().name() 38 | 39 | info = hou.hda.componentsFromFullNodeTypeName(type_name) 40 | 41 | namespace = f'{info[1]}--' if info[1] != '' else '' 42 | version = f'{info[3]}' if info[3] != '' else '' 43 | 44 | filename = namespace + info[2] + ".txt" 45 | 46 | path = hou.text.expandString("$LV") + "/help" + "/nodes/" + node_type 47 | 48 | combined = path + "/" + filename 49 | 50 | pretty = node.type().description() 51 | 52 | extra = f"= {pretty} =\n\n== Overview ==\n\nExplanation of the node's purpose and operation.\n\n@inputs\n\nLabel:\n\nWhat the input is for.\n\n@parameters" 53 | 54 | for parm in node.parms(): 55 | if not parm.isHidden(): 56 | if not parm.name().startswith("folder"): 57 | # print("folder: ", parm.containingFolders()[-1]) 58 | # print(parm.description(), ", ", parm.name()) 59 | filler = parm.description() 60 | ptype = parm.parmTemplate().type() 61 | tname = "" 62 | if ptype == hou.parmTemplateType.Int: 63 | tname = "int" 64 | elif ptype == hou.parmTemplateType.Float: 65 | tname = "float" 66 | elif ptype == hou.parmTemplateType.String: 67 | tname = "string" 68 | elif ptype == hou.parmTemplateType.Toggle: 69 | tname = "toggle" 70 | elif ptype == hou.parmTemplateType.Menu: 71 | tname = "menu" 72 | elif ptype == hou.parmTemplateType.Button: 73 | tname = "button" 74 | elif ptype == hou.parmTemplateType.Folder: 75 | tname = "folder" 76 | elif ptype == hou.parmTemplateType.Label: 77 | tname = "label" 78 | elif ptype == hou.parmTemplateType.Separator: 79 | tname = "separator" 80 | elif ptype == hou.parmTemplateType.Ramp: 81 | tname = "ramp" 82 | extra += "\n\n" + parm.description() + ":\n\t#" + parm.name() + ":\n\t" + tname + ": " + parm.description() 83 | 84 | if not os.path.exists(path): 85 | os.makedirs(path) 86 | 87 | f = open(combined, "w") 88 | f.write(extra) 89 | f.close() 90 | 91 | node.destroy() 92 | 93 | 94 | def change_icon(): 95 | geo = hou.node("/obj/geo1") 96 | print(geo) 97 | i = 0 98 | findLoadedHDAs() 99 | for hda in findLoadedHDAs(): 100 | if hda.nodeTypeCategory().name() == "Sop": 101 | if not "dev" in hda.nodeTypeName().lower(): 102 | node = geo.createNode(hda.nodeTypeName()) 103 | hda.setIcon("$LV/lv.svg") 104 | 105 | node.allowEditingOfContents() 106 | hda.setIcon("$LV/lv.svg") 107 | hou.ui.openTypePropertiesDialog(node) 108 | # hda.updateFromNode(node) 109 | 110 | # node.destroy() 111 | -------------------------------------------------------------------------------- /PARMmenu.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | reference_menu 6 | 7 | 8 | 9 | 10 | 11 | parm = kwargs["parms"] 12 | if parm is None: 13 | return False 14 | 15 | return parm[0].parmTemplate().type().name() == 'Ramp' 16 | 17 | 18 | 19 | 26 | 27 | 28 | 29 | 30 | 31 | parm = kwargs["parms"] 32 | if parm is None: 33 | return False 34 | 35 | return parm[0].parmTemplate().type().name() == 'Ramp' 36 | 37 | 38 | 39 | 46 | 47 | 48 | 49 | 50 | 51 | parm = kwargs["parms"] 52 | if parm is None: 53 | return False 54 | 55 | return parm[0].parmTemplate().type().name() == 'Ramp' 56 | 57 | 58 | 59 | 66 | 67 | 68 | 69 | 70 | 71 | parm = kwargs["parms"] 72 | if parm is None: 73 | return False 74 | 75 | return parm[0].parmTemplate().type().name() == 'Ramp' 76 | 77 | 78 | 79 | 86 | 87 | 88 | 89 | 90 | parm = kwargs["parms"] 91 | if parm is None: 92 | return False 93 | 94 | return parm[0].parmTemplate().type().name() == 'Ramp' 95 | 96 | 97 | 98 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | parm = kwargs["parms"] 112 | if parm is None: 113 | return False 114 | 115 | return parm[0].name() == 'snippet' 116 | 117 | 118 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | parm = kwargs["parms"] 132 | if parm is None: 133 | return False 134 | 135 | return parm[0].name() == 'snippet' 136 | 137 | 138 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | LVM1 178 | 179 | 180 | 181 | 187 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | -------------------------------------------------------------------------------- /config/NodeShapes/controller.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "LV_Controller", 3 | "flags": { 4 | "0": { "outline": [[1.01453,0.0542948],[1.0133,0.0387537],[1.00961,0.0247706],[1.00346,0.0123453],[0.994854,0.00147784],[0.983787,-0.00783169],[0.970261,-0.0155833],[0.539495,-0.219142],[0.525969,-0.224174],[0.514902,-0.225323],[0.506295,-0.222591],[0.500147,-0.215976],[0.496458,-0.205479],[0.495228,-0.1911],[0.495228,0.00223264],[0.496458,0.0177737],[0.500147,0.0317569],[0.506295,0.0441822],[0.514902,0.0550496],[0.525969,0.0643591],[0.539495,0.0721108],[0.970261,0.27567],[0.983787,0.280701],[0.994854,0.281851],[1.00346,0.279118],[1.00961,0.272504],[1.0133,0.262007],[1.01453,0.247628]] }, 5 | "1": { "outline": [[0.451548,0.327226],[0.452823,0.318301],[0.456648,0.311926],[0.463023,0.308101],[0.471948,0.306826],[0.518508,0.306826],[0.527433,0.308101],[0.533808,0.311926],[0.537633,0.318301],[0.538908,0.327226],[0.538908,0.655597],[0.537633,0.664522],[0.533808,0.670897],[0.527433,0.674722],[0.518508,0.675997],[0.471948,0.675997],[0.463023,0.674722],[0.456648,0.670897],[0.452823,0.664522],[0.451548,0.655597]] }, 6 | "2": { "outline": [[0.0201954,-0.0155833],[0.00666955,-0.00783169],[-0.00439703,0.00147784],[-0.0130044,0.0123453],[-0.0191525,0.0247706],[-0.0228414,0.0387537],[-0.0240709,0.0542948],[-0.0240709,0.247628],[-0.0228414,0.262007],[-0.0191525,0.272504],[-0.0130044,0.279118],[-0.00439703,0.281851],[0.00666955,0.280701],[0.0201954,0.27567],[0.450962,0.0721108],[0.464488,0.0643591],[0.475554,0.0550496],[0.484162,0.0441822],[0.49031,0.0317569],[0.493999,0.0177737],[0.495228,0.00223264],[0.495228,-0.1911],[0.493999,-0.205479],[0.49031,-0.215976],[0.484162,-0.222591],[0.475554,-0.225323],[0.464488,-0.224174],[0.450962,-0.219142]] }, 7 | "3": { "outline": [[0.699228,0.806643],[0.69762,0.832211],[0.692819,0.857376],[0.684903,0.88174],[0.673995,0.904921],[0.660268,0.926551],[0.643938,0.946291],[0.625263,0.963828],[0.604537,0.978886],[0.582087,0.991228],[0.558268,1.00066],[0.533454,1.00703],[0.508038,1.01024],[0.482419,1.01024],[0.457002,1.00703],[0.432189,1.00066],[0.408369,0.991228],[0.38592,0.978886],[0.365194,0.963828],[0.346519,0.946291],[0.330189,0.926551],[0.316462,0.904921],[0.305554,0.88174],[0.297637,0.857376],[0.292837,0.832211],[0.291228,0.806643],[0.292837,0.781075],[0.297637,0.75591],[0.305554,0.731546],[0.316462,0.708365],[0.330189,0.686735],[0.346519,0.666995],[0.365194,0.649458],[0.38592,0.6344],[0.408369,0.622058],[0.432189,0.612627],[0.457003,0.606256],[0.482419,0.603046],[0.508038,0.603046],[0.533454,0.606256],[0.558268,0.612628],[0.582087,0.622058],[0.604537,0.6344],[0.625263,0.649458],[0.643938,0.666995],[0.660268,0.686735],[0.673995,0.708365],[0.684903,0.731546],[0.692819,0.75591],[0.69762,0.781075]] } 8 | }, 9 | "outline": [[0.69762,0.832211],[0.699228,0.806643],[0.69762,0.781075],[0.692819,0.75591],[0.684903,0.731546],[0.673995,0.708365],[0.660268,0.686735],[0.643938,0.666995],[0.625263,0.649458],[0.604537,0.6344],[0.582087,0.622058],[0.558268,0.612628],[0.538908,0.607657],[0.538908,0.499121],[0.969768,0.295518],[0.977574,0.290934],[0.983203,0.284654],[0.988066,0.278527],[0.991418,0.269829],[0.993431,0.263678],[0.994248,0.253439],[0.994248,0.0484834],[0.993431,0.0382446],[0.991418,0.0320941],[0.988066,0.0233957],[0.983203,0.0172682],[0.977574,0.0109888],[0.969768,0.0064047],[0.519708,-0.206271],[0.512106,-0.209618],[0.503642,-0.212634],[0.495228,-0.21306],[0.491403,-0.212867],[0.49031,-0.215976],[0.484162,-0.222591],[0.475554,-0.225323],[0.464488,-0.224174],[0.450962,-0.219142],[0.0201954,-0.0155833],[0.00666955,-0.00783169],[-0.00439703,0.00147784],[-0.0130044,0.0123453],[-0.0191525,0.0247706],[-0.0228414,0.0387537],[-0.0240709,0.0542948],[-0.0240709,0.247628],[-0.0228414,0.262007],[-0.0191525,0.272504],[-0.0130044,0.279118],[-0.00439703,0.281851],[0.00431073,0.280946],[0.00725386,0.284654],[0.0128824,0.290934],[0.0206889,0.295518],[0.0822513,0.324609],[0.0864306,0.333286],[0.0923137,0.339998],[0.101672,0.349856],[0.109314,0.354562],[0.119272,0.35938],[0.126314,0.361933],[0.134514,0.363538],[0.143314,0.364086],[0.152114,0.363538],[0.160314,0.361933],[0.160835,0.361744],[0.451548,0.499121],[0.451548,0.607657],[0.432189,0.612627],[0.408369,0.622058],[0.38592,0.6344],[0.365194,0.649458],[0.346519,0.666995],[0.330189,0.686735],[0.316462,0.708365],[0.305554,0.731546],[0.297637,0.75591],[0.292837,0.781075],[0.291228,0.806643],[0.292837,0.832211],[0.297637,0.857376],[0.305554,0.88174],[0.316462,0.904921],[0.330189,0.926551],[0.346519,0.946291],[0.365194,0.963828],[0.38592,0.978886],[0.408369,0.991228],[0.432189,1.00066],[0.457002,1.00703],[0.482419,1.01024],[0.508038,1.01024],[0.533454,1.00703],[0.558268,1.00066],[0.582087,0.991228],[0.604537,0.978886],[0.625263,0.963828],[0.643938,0.946291],[0.660268,0.926551],[0.673995,0.904921],[0.684903,0.88174],[0.692819,0.857376]], 10 | "inputs": [[0.2244,0.81,172.5],[0.233791,0.88133,165],[0.261323,0.9478,150],[0.305121,1.00488,135],[0.3622,1.04868,120],[0.428669,1.07621,105],[0.5,1.0856,90],[0.571331,1.07621,75],[0.6378,1.04868,60],[0.694879,1.00488,45],[0.738677,0.9478,30],[0.766209,0.88133,15],[0.7756,0.81,7.50006]], 11 | "outputs": [[0.0168,-0.108,234.434],[0.0757422,-0.150146,237.662],[0.145403,-0.189419,243.889],[0.224675,-0.223144,250.292],[0.311794,-0.249022,256.807],[0.404461,-0.26529,263.388],[0.5,-0.270838,270],[0.595539,-0.26529,276.612],[0.688206,-0.249022,283.193],[0.775325,-0.223144,289.708],[0.854597,-0.189419,296.111],[0.924258,-0.150146,302.338],[0.9832,-0.108,305.566]], 12 | "icon": [[0.3738,0.6738],[0.6262,0.9262]] 13 | } -------------------------------------------------------------------------------- /scripts/python/deprecated/easecontrol/flip.py: -------------------------------------------------------------------------------- 1 | import hou 2 | #lerps courtesy of https://gist.github.com/laundmo/b224b1f4c8ef6ca5fe47e132c8deab56 3 | def lerp(a: float, b: float, t: float) -> float: 4 | """Linear interpolate on the scale given by a to b, using t as the point on that scale. 5 | Examples 6 | -------- 7 | 50 == lerp(0, 100, 0.5) 8 | 4.2 == lerp(1, 5, 0.8) 9 | """ 10 | return (1 - t) * a + t * b 11 | 12 | def inv_lerp(a: float, b: float, v: float) -> float: 13 | """Inverse Linar Interpolation, get the fraction between a and b on which v resides. 14 | Examples 15 | -------- 16 | 0.5 == inv_lerp(0, 100, 50) 17 | 0.8 == inv_lerp(1, 5, 4.2) 18 | """ 19 | return (v - a) / (b - a) 20 | 21 | def remap(i_min: float, i_max: float, o_min: float, o_max: float, v: float) -> float: 22 | """Remap values from one linear scale to another, a combination of lerp and inv_lerp. 23 | i_min and i_max are the scale on which the original value resides, 24 | o_min and o_max are the scale to which it should be mapped. 25 | Examples 26 | -------- 27 | 45 == remap(0, 100, 40, 50, 50) 28 | 6.2 == remap(1, 5, 3, 7, 4.2) 29 | """ 30 | return lerp(o_min, o_max, inv_lerp(i_min, i_max, v)) 31 | 32 | def flipX(): 33 | print('--------') 34 | pane_tab = hou.ui.paneTabOfType(hou.paneTabType.ChannelEditor) 35 | keyframes = pane_tab.graph().selectedKeyframes() 36 | 37 | pb = hou.playbar.playbackRange() 38 | dur = pb[1]-pb[0]+1 39 | 40 | flipped = [] 41 | base_keys = [] 42 | val = [] 43 | 44 | for parm in keyframes.keys(): 45 | for key in keyframes[parm]: 46 | flipped.append(key) 47 | base_keys.append(key) 48 | val.append(key.value()) 49 | 50 | parm.deleteAllKeyframes() 51 | 52 | #find min and max 53 | k_min = 0.0 54 | k_max = 0.0 55 | for key in base_keys: 56 | test_val = key.value() 57 | if test_val > k_max: 58 | k_max = test_val 59 | elif test_val < k_min: 60 | k_min = test_val 61 | 62 | # print("Min: ", k_min, ". Max: ", k_max) 63 | 64 | kl = len(flipped)-1 65 | 66 | for parm in keyframes.keys(): 67 | 68 | endKey = hou.Keyframe() 69 | endKey.setFrame(dur) 70 | parm.setKeyframe(endKey) 71 | 72 | for index in range(len(base_keys)): 73 | 74 | # New keyframe from unflipped set. This is BASE 75 | newKey = base_keys[index] 76 | 77 | #v = val[kl-index] 78 | 79 | # Set value 80 | l_val = remap(k_min, k_max, k_max, k_min, newKey.value()) 81 | newKey.setValue(l_val) 82 | 83 | # Set ease 84 | newKey.setSlope(newKey.slope() * -1) 85 | 86 | parm.setKeyframe(newKey) 87 | 88 | parm.deleteKeyframeAtFrame(dur) 89 | 90 | 91 | # Y flip script starts here 92 | def flipY(): 93 | print('--------') 94 | pane_tab = hou.ui.paneTabOfType(hou.paneTabType.ChannelEditor) 95 | keyframes = pane_tab.graph().selectedKeyframes() 96 | 97 | pb = hou.playbar.playbackRange() 98 | dur = pb[1]-pb[0]+1 99 | 100 | flipped = [] 101 | base_keys = [] 102 | val = [] 103 | 104 | for parm in keyframes.keys(): 105 | for key in keyframes[parm]: 106 | flipped.append(key) 107 | base_keys.append(key) 108 | val.append(key.frame()) 109 | 110 | parm.deleteAllKeyframes() 111 | #find min and max 112 | k_min = 0.0 113 | k_max = 0.0 114 | for key in base_keys: 115 | test_val = key.frame() 116 | if test_val > k_max: 117 | k_max = test_val 118 | elif test_val < k_min: 119 | k_min = test_val 120 | 121 | flipped.reverse() 122 | 123 | kl = len(flipped)-1 124 | 125 | for parm in keyframes.keys(): 126 | 127 | endKey = hou.Keyframe() 128 | endKey.setFrame(dur) 129 | parm.setKeyframe(endKey) 130 | 131 | for index in range(len(base_keys)): 132 | 133 | # New keyframe from unflipped set. This is BASE 134 | newKey = base_keys[index] 135 | 136 | # Remap frame number 137 | l_frame = remap(k_min, k_max, k_max, k_min, newKey.frame()) 138 | l_frame += 1 139 | #print("Frame:", index, "- F:", l_frame) 140 | 141 | # Set time 142 | newKey.setFrame(l_frame) 143 | 144 | # Sort out the easeing mess 145 | if index == 0 or index == kl: 146 | print('start or end frame') 147 | 148 | else: 149 | print("middle frame") 150 | # Flip the accel 151 | 152 | in_accel = newKey.inAccel() 153 | accel = newKey.accel() 154 | newKey.setInAccel(accel) 155 | newKey.setAccel(in_accel) 156 | 157 | # Flip the slope 158 | print("auto key: ", newKey.isAccelInterpretedAsRatio()) 159 | if newKey.isSlopeTied() == False: 160 | in_slope = newKey.inSlope() 161 | slope = newKey.slope() 162 | newKey.setInSlope(slope*-1) 163 | newKey.setSlope(in_slope*-1) 164 | parm.setKeyframe(newKey) 165 | else: 166 | newKey.setSlope(newKey.slope()*-1) 167 | 168 | 169 | 170 | parm.setKeyframe(newKey) 171 | 172 | parm.deleteKeyframeAtFrame(dur) -------------------------------------------------------------------------------- /toolbar/LV_Dev.shelf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 61 | 62 | 63 | 64 | 102 | 103 | 104 | 105 | 109 | 110 | 111 | 112 | 118 | 119 | 120 | 121 | 126 | 127 | 128 | 129 | 134 | 135 | 136 | 137 | 140 | 141 | 142 | 143 | 176 | 177 | 178 | 179 | 183 | 184 | 185 | -------------------------------------------------------------------------------- /scripts/python/lvnodeutils/lvnodeutils.py: -------------------------------------------------------------------------------- 1 | from hutil.PySide import QtWidgets, QtUiTools, QtCore, QtGui # type: ignore 2 | from hutil.PySide.QtWidgets import QPushButton, QComboBox, QTableWidget, QTableWidgetItem # type: ignore 3 | import hou 4 | 5 | import os 6 | import json 7 | from importlib import reload # type: ignore 8 | 9 | import LVParmUtils 10 | reload(LVParmUtils) 11 | 12 | global direction 13 | direction = 1 14 | 15 | global loads 16 | 17 | 18 | class lvnodeutils(QtWidgets.QWidget): 19 | def __init__(self): 20 | super().__init__() 21 | self.folderpath = hou.getenv("LV") + "/scripts/python/lvnodeutils" 22 | ui_file_path = self.folderpath + "/lvnodeutils.ui" 23 | 24 | loader = QtUiTools.QUiLoader() 25 | self.ui = loader.load(ui_file_path) 26 | 27 | # create initial 28 | 29 | global btnLayout 30 | global btnLayout2 31 | global hori 32 | global nodeLabel 33 | 34 | hori = self.ui.findChild(QtWidgets.QPushButton, "hori") 35 | hori.setIcon(hou.qt.Icon('BUTTONS_collapse_left')) 36 | hori.setText('Collapse') 37 | hori.clicked.connect(self.setDir) 38 | hori.setMinimumWidth(3) 39 | 40 | btnLayout = self.ui.findChild(QtWidgets.QWidget, "vlayout").layout() 41 | nodeLabel = self.ui.findChild(QtWidgets.QLabel, "nodeLabel") 42 | # nodeLabel.hide() 43 | 44 | layout = QtWidgets.QVBoxLayout() 45 | layout.setContentsMargins(0, 0, 0, 0) 46 | 47 | layout.addWidget(self.ui) 48 | self.setLayout(layout) 49 | 50 | self.load_json() 51 | 52 | self.initBtns() 53 | 54 | def load_json(self): 55 | global loads 56 | file_path = self.folderpath + "/commands.json" 57 | if os.path.exists(file_path): 58 | with open(file_path, 'r') as f: 59 | loads = json.load(f) 60 | else: 61 | with open(file_path, 'w') as f: 62 | loads = {} 63 | json.dump(loads, f) 64 | 65 | def initBtns(self): 66 | global btns 67 | 68 | btns = [] 69 | 70 | # adding one million buttons here 71 | 72 | # attribwrangle 73 | addFloatParm = (QPushButton(hou.qt.Icon('DATATYPES_parameter'), "Add Float Parm"), "attribwrangle", "Add Float Parm") 74 | addFloatParm[0].clicked.connect(lambda: LVParmUtils.addFloatParm(kwargs={"parms": (currentNode.parm("snippet"),)})) 75 | btns.append(addFloatParm) 76 | 77 | addChramp = (QPushButton(hou.qt.Icon('COP2_ramp'), "Add Float Ramp Parm"), "attribwrangle", "Add Float Ramp Parm") 78 | addChramp[0].clicked.connect(lambda: LVParmUtils.addChramp(kwargs={"parms": (currentNode.parm("snippet"),)})) 79 | btns.append(addChramp) 80 | 81 | cleanParms = (QPushButton(hou.qt.Icon('ENGINE_clean_temp'), "Remove Unused Parms"), "attribwrangle", "Remove Unused Parms") 82 | cleanParms[0].clicked.connect(lambda: LVParmUtils.cleanParms(kwargs={"parms": (currentNode.parm("snippet"),)})) 83 | btns.append(cleanParms) 84 | 85 | # xform 86 | pivotFromSpare = (QPushButton(hou.qt.Icon('BUTTONS_chooser_node'), "Pivot From Spare Input"), "xform", "Pivot From Spare Input") 87 | pivotFromSpare[0].clicked.connect(lambda: LVParmUtils.pivotFromSpare(kwargs={"node": currentNode})) 88 | btns.append(pivotFromSpare) 89 | 90 | # timeshift 91 | # offsetByAttribute = (QPushButton(hou.qt.Icon('BUTTONS_chooser_node'), "Offset by Spare Input"), "timeshift", "Offset by Spare Input") 92 | # offsetByAttribute[0].clicked.connect(lambda: LVParmUtils.offsetByAttribute(kwargs={"node": currentNode})) 93 | # btns.append(offsetByAttribute) 94 | 95 | for btn in btns: 96 | btnLayout.addWidget(btn[0]) 97 | btn[0].hide() 98 | btn[0].setToolTip(btn[2]) 99 | btn[0].setStyleSheet("text-align: left;") 100 | 101 | spacer = QtWidgets.QSpacerItem(0, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) 102 | btnLayout.addItem(spacer) 103 | 104 | def getFirst(self, s): 105 | return ''.join([word[0].upper() for word in s.split()]) 106 | 107 | def setDir(self): 108 | global direction 109 | d = direction 110 | direction = 0 if direction else 1 111 | if direction == 0: 112 | hori.setText('') 113 | hori.setIcon(hou.qt.Icon('BUTTONS_expand_right')) 114 | else: 115 | hori.setText('Collapse') 116 | hori.setIcon(hou.qt.Icon('BUTTONS_collapse_left')) 117 | for btn in btns: 118 | if direction == 1: 119 | hide = btn[0].isHidden() 120 | btn[0].setText(btn[2]) 121 | btn[0].setToolTip(btn[2]) 122 | else: 123 | btn[0].setText(self.getFirst(btn[2])) 124 | btn[0].setToolTip(btn[2]) 125 | # btn[0].setStyleSheet("text-align: left; padding-left: 6px; padding-right: 6px") 126 | # h = hori.height() 127 | # btn[0].setFixedSize(h, h) 128 | # hori.setFixedSize(h, h) 129 | # hori.setStyleSheet("text-align: left; padding-left: 6px; padding-right: 6px") 130 | 131 | btn[0].setToolTip(btn[0].text()) 132 | 133 | def getNode(self, node): 134 | self.buildUI(node) 135 | 136 | def buildUI(self, node): 137 | global currentNode 138 | 139 | currentNode = node 140 | selector = node.type().name() 141 | for btn in btns: 142 | condition = btn[1] 143 | widget = btn[0] 144 | if not selector == condition: 145 | widget.hide() 146 | else: 147 | widget.show() 148 | 149 | nodeLabel.setText(selector) 150 | --------------------------------------------------------------------------------