170 lines
5.5 KiB
Python
170 lines
5.5 KiB
Python
# Set of startup scripts for SideFX's Houdini
|
|
|
|
import hou
|
|
|
|
def install_aliases():
|
|
aliases = [
|
|
(4, "from hhacks import redshift_quick_anim as _; _()"),
|
|
(5, 'from hhacks import install_desktop as _; _()'),
|
|
(6, 'from hhacks import make_geo_cache as _; _()'),
|
|
(7, "from hhacks import iprs; iprs()[0].killRender();iprs()[0].startRender()"),
|
|
(8, 'from hhacks import *; rop,_=rop_redshift(); rop.parm("RS_IPRRV").pressButton()'),
|
|
(9, 'from hhacks import *; rop,_=rop_redshift(); rop.parm("trange").set(0); render(rop)'),
|
|
(10, "from hhacks import *; render((hou.selectedNodes() or rop_redshift())[0])"),
|
|
(11, "from hhacks import save_n_render as fn; fn(inc=False)"),
|
|
(12, "from hhacks import save_n_render as fn; fn(inc=True)"),
|
|
]
|
|
for fkey, hcmd in aliases:
|
|
hou.hscript("alias F{} 'python -c \\'{}\\''".format(fkey, hcmd))
|
|
|
|
def rewind():
|
|
"""
|
|
# rewind and return to current frame
|
|
ffwd = rewind()
|
|
...
|
|
hou.setFrame(ffwd)
|
|
"""
|
|
frame = int(hou.frame())
|
|
hou.setFrame(1)
|
|
return frame
|
|
|
|
def rop_redshift():
|
|
out = hou.node('/out')
|
|
rop = out.node('Redshift_ROP1')
|
|
if not rop:
|
|
try:
|
|
rop = out.createNode('Redshift_ROP')
|
|
except:
|
|
return None, None
|
|
rop.moveToGoodPosition()
|
|
rop.parm("ProgressiveRenderingEnabled").set(True)
|
|
rop.parm('PrimaryGIEngine').set('RS_GIENGINE_BRUTE_FORCE')
|
|
rop.parm('SecondaryGIEngine').set('RS_GIENGINE_PHOTON_MAPPING')
|
|
rop.parm('UnifiedMaxSamples').set('1024')
|
|
rop.parm('UnifiedAdaptiveErrorThreshold').set('0.001')
|
|
rop.parm('RS_iprUpdateMeshDeform').set(True)
|
|
ipr = out.node('Redshift_IPR1')
|
|
if not ipr:
|
|
ipr = out.createNode('Redshift_IPR')
|
|
ipr.moveToGoodPosition()
|
|
ipr.parm('linked_rop').set(rop.path())
|
|
return rop, ipr
|
|
|
|
# Workaround for redshift rendering
|
|
|
|
def redshift_quick_anim(end_frame=hou.playbar.playbackRange()[1]):
|
|
from time import sleep
|
|
rop, ipr = rop_redshift()
|
|
frame = int(hou.frame())
|
|
hou.setFrame(1)
|
|
hou.node('/obj/smoke_output/timeshift1').bypass(False)
|
|
print('range', frame, int(end_frame)+1)
|
|
for frame in range(frame, int(end_frame)+1):
|
|
print('rendering frame:', frame)
|
|
hou.node('/obj/smoke_output/timeshift1').parm('frame').setExpression('$F+{}-1'.format(frame))
|
|
rop.parm('ProgressiveRenderingNumPasses').set(64)
|
|
try:
|
|
rop.render()
|
|
except:
|
|
pass
|
|
sleep(40)
|
|
hou.node('/obj/smoke_output/timeshift1').bypass(True)
|
|
hou.setFrame(frame)
|
|
|
|
def redshift_still():
|
|
redshift_quick_anim(end_frame=hou.frame())
|
|
|
|
def save_n_render(inc=False):
|
|
if inc:
|
|
hou.hipFile.saveAndIncrementFileName()
|
|
else:
|
|
hou.hipFile.save()
|
|
if not hou.selectedNodes():
|
|
print("no node selected")
|
|
return 1
|
|
if not isinstance(hou.selectedNodes()[0], hou.RopNode):
|
|
print("no ROP node selected")
|
|
return 1
|
|
return render(hou.selectedNodes()[0])
|
|
|
|
def render(rop):
|
|
x, y = [rop.parm(name) for name in 'executebackground', 'execute']
|
|
render = x or y
|
|
if not render:
|
|
print("not a render node")
|
|
return 1
|
|
render.pressButton()
|
|
return 0
|
|
|
|
def iprs():
|
|
return [pane for pane in hou.ui.paneTabs() if isinstance(pane, hou.IPRViewer)]
|
|
|
|
def ipr_render():
|
|
ipr = iprs()[0]
|
|
ipr.killRender()
|
|
ipr.startRender()
|
|
|
|
def install_desktop(pane_name="Network"):
|
|
panels = [p for p in hou.ui.floatingPanels() if p.name()==pane_name]
|
|
if not panels:
|
|
panel = hou.ui.curDesktop().createFloatingPanel(hou.paneTabType.NetworkEditor, size=(1920,1080))
|
|
panel.setName(pane_name)
|
|
panel.attachToDesktop(True)
|
|
|
|
def set_desktop():
|
|
desktops = {d.name(): d for d in hou.ui.desktops()}
|
|
for name in ['2x2', '3x2', 'pie']:
|
|
if name in desktops:
|
|
desktops[name].setAsCurrent()
|
|
break
|
|
|
|
def make_output_sop(geo, connect_to='', name=''):
|
|
sop = geo.createNode('null', '_'.join(s for s in ['OUT', name] if s))
|
|
if connect_to:
|
|
sop.setInput(0, connect_to)
|
|
if connect_to.isDisplayFlagSet():
|
|
sop.setDisplayFlag(True)
|
|
if connect_to.isRenderFlagSet():
|
|
sop.setRenderFlag(True)
|
|
sop.moveToGoodPosition()
|
|
return sop
|
|
|
|
|
|
# from hhacks import make_geo_cache as _; _()
|
|
def make_geo_cache(name=''):
|
|
"""
|
|
Create /out geometry cache. Save hip. Render in background.
|
|
"""
|
|
|
|
# Path from selection or active view and connection
|
|
if hou.selectedNodes() and hou.selectedNodes()[-1].parent().type().name() == 'geo':
|
|
connect_to = hou.selectedNodes()[-1]
|
|
geo = connect_to.parent()
|
|
name = geo.path().split('/')[-1]
|
|
else:
|
|
connect_to = None
|
|
geo = hou.ui.paneTabOfType(hou.paneTabType.NetworkEditor).pwd()
|
|
|
|
# OUT_RENDER
|
|
sop = make_output_sop(geo, connect_to, 'RENDER')
|
|
|
|
# SOP
|
|
out = hou.node('/out').createNode('geometry', '{}_cache'.format(name))
|
|
out.moveToGoodPosition()
|
|
out.parm('trange').set(1)
|
|
out.parm('soppath').set(sop.path())
|
|
|
|
# Create import nodes
|
|
look = hou.node('/obj').createNode('geo', '{}_render'.format(name))
|
|
in_file = look.createNode('file', 'IN_{}'.format(name))
|
|
out_render = make_output_sop(look, connect_to=in_file)
|
|
for node in [look, in_file, out_render]:
|
|
node.moveToGoodPosition()
|
|
|
|
print(in_file)
|
|
print(dir(in_file))
|
|
in_file.parm('file').set(out.parm('sopoutput'))
|
|
|
|
hou.hipFile.save()
|
|
out.parm('executebackground').pressButton()
|