# 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()