Jump to content

Search the Community

Showing results for tags 'hda'.



More search options

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • General
    • Lounge/General chat
    • Education
    • Jobs
    • Marketplace
  • Houdini
    • General Houdini Questions
    • Effects
    • Modeling
    • Animation & Rigging
    • Lighting & Rendering
    • Compositing
    • Games
    • Tools (HDA's etc.)
  • Coders Corner
    • HDK : Houdini Development Kit
    • Scripting
    • Shaders
  • Art and Challenges
    • Finished Work
    • Work in Progress
    • VFX Challenge
    • Effects Challenge Archive
  • Systems and Other Applications
    • Other 3d Packages
    • Operating Systems
    • Hardware
    • Pipeline
  • od|force
    • Feedback, Suggestions, Bugs

Found 211 results

  1. I am trying to get createModuleFromSection() in the Python module in an HDA I am developing. It can't find the module. I am less than a python noob thus struggling. I have a modified nodegraphvellumutils.py (which works perfectly) renamed as PythonSubmod.py and I want to attach it to the HDA then call it from the PythonModule. import toolutils submod = toolutils.createModuleFromSection("submod", kwargs["type"], "PythonSubmod.py") # Add network editor hooks if hou.isUIAvailable(): from submod import setSelectPosContextData, isPassThroughConnection, createEventHandler def isVellumNode(): return True test_PythonModule.hda
  2. Hi, We plan to build a custom modular rop network for exporting assets, we plan to have dedicated nodes to be responsible for setting asset info, component info, etc. Currently the idea is to link those values to the final export node via expressions, but I'd prefer to be able to pass the information down the stream in a similar way as we pass detail attributes in SOP networks. I dont have much experience with ROP nodes, but so far I didnt find any way to pass information down the tree. Could someone point me in the right direction? Thanks
  3. PolyExpand3D

    I decided to take another look at an old tool I made to increase the functionality of the polyexpand2d sop. Main differences, it's compiled and compilable so it should be faster and more robust. It also generates uvs. Input a curve and a profile curve and you'll get clean, complex geometry that would be impossible with a sweep. The basic gist of how it works is that it's running a PolyExpand2D in a loop for each point in your profile curve. PixelNinja__polyExpand3d__2_0.hdalc
  4. Looking for work any kind of work

    Hi, I am Procedural Generative Artist. I am specialized in Procedural Asset Creation. I can create 3D assets for Games/Movies/3D Printing. My works have been featured in Several Websites. I am also able to create FX. You can see my reel below. I am looking for any kind of work. You can see my projects in pamirbal.com olcaytopamirbal@gmail.com
  5. Hi, I wrote some code into OnLoaded event handler to run when I paste the HDA, something like this: if not hou.hipFile.isLoadingHipFile(): rebuild_prompt = hou.ui.displayMessage( "Would you like to rebuild?" , ("Rebuild", "Do not Rebuild")) It seems opening a ui dialog like this breaks the copy-pasting process and does not move the pasted node into a correct position near the cursor. I thought about manually moving the node to the cursor in the code after the dialog, but I dont think it makes sense and I cannot even access the node I am copying anyway (assume many nodes in a subnet all being copied at once) Any idea how to have a dialog that opens when HDA is being copy-pasted but in a way that doesnt stop/break the copy-pasting itself? Many thanks
  6. I have an HDA with a parameter that allows users to return a selection from the viewport (same type of parameter used on blast nodes etc.). I have a callback script that I want to run whenever the artist makes a selection, however, the script only seems to execute when the string portion of the parameter is edited. For example if I manually type the name of an object into the parameter the callback script executes as expected, but if I use the arrow button to select the objects in the viewport and hit enter to confirm my selection the callback script is not executed. This obviously isn't very useful or intuitive for artists. Does anyone have any workarounds or suggestions on how to get this functioning the way one would expect it to?
  7. Hi, how can I promote the HDA parameters to Maya. The parameters are all visible but in Maya those parameters are not visible.
  8. Hi, I want to make an HDA that can import several file, but this should be dynamic. So I can import one o thousends of files if I want. How can I achive this? Thanks, D.
  9. Multiparm Editing in Python

    I am working to build a tool which contextualizes updates options in a multiparm block based on an option selected in the block itself. I have been able to get ahold of the information for which index in the multiparm everything is going and have been able to extract information just fine, but I cannot seem to update the UI. I really feel like I am just missing a function somewhere in the documentation. Right now I'm essentially doing this to update what I have now: def load(): node = hou.pwd() ptg = node.parmTemplateGroup() baseAttribs = ["list", "pulled", "in", "from", "elsewhere"] multiparm = hou.FolderParmTemplate("attrib", "Attrib Item", folder_type = hou.folderType.MultiparmBlock) collapsibleFolder = hou.FolderParmTemplate("settings#", "Settings", folder_type = hou.folderType.Collapsible) attribList = hou.MenuParmTemplate("root_attribs#", "Select Attribute", tuple(baseAttribs), menu_labels=tuple(baseAttribs), script_callback="hou.phm().attribType(kwargs)", script_callback_language=hou.scriptLanguage.Python, menu_use_token=True) collapsibleFolder.addParmTemplate(attribList) multiparm.addParmTemplate(collapsibleFolder) multiparm.setDefaultValue(1) ptg.appendToFolder(ptg.findFolder("JSON Settings"), multiparm) node.setParmTemplateGroup(ptg) def attribType(kwargs): node = hou.pwd() p = kwargs["parm"] parent = p.parentMultiParm() multiParmIndex = int(kwargs['script_multiparm_index']) menuIndex = int(kwargs['script_value']) container = parent.parmTemplate().parmTemplates()[0] selected = p.menuItems()[menuIndex] a = hou.LabelParmTemplate("test#", f"Testing that this works {multiParmIndex} {selected}") container.addParmTemplate(a) I know what the name should be and I have the correct multiparm index from within kwargs, which is amazing. So how can I put things into the collapsible folders? For the first entry I know I have the settings1 folder and I want to add in that label, but I cannot seem to figure out how to do that.
  10. Is the same HDA file supposed to behave in the same way regardless of which Houdini Engine is running it? I have exported a simple user curve swept with the Sweep node. In UE4, I am able to edit the control points of the spline to change the shape of the object. In 3DS Max, the result is static. I don't see a way to edit the parent spline like I can in UE4, it appears to be static. I can't tell if this is due to something I need to manually set on export, or if Houdini Engine in 3DS Max is simply more limited. Thanks.
  11. Hey everyone, I want to share my HDA. By that tool you can easily create hard surface objects, such as building, spacecraft and other constructions. by it you can generate, delete cut and unite blocks. It's free and I would love if you could use this tool: https://vimeo.com/679178527
  12. Painter

    Hi, Check out my new Painter tool that lets you paint seamlessly on an image in the viewport! https://techie.gumroad.com/l/painter
  13. Houdini to Magicavoxel

    Hi All, I've been working on the .vox exporter for a while. After some improvements I decided to publish it on github. The HDA generates .VOX Magicavoxel file from given inputs. If interested you can get it from here; https://github.com/caglarcomez/Houdini_to_Magicavoxel
  14. hi everyone , im trying to create a dynamic multiparm in my hda. i know how to access multiparm block's parameter and set the menu item from attribute. but i cant find a way to set the menu item dynamiclly inside the nested multparm. please help. is there any way i can do this ? for example ,the grey box only has 3 sizes, but it listed up other box's size. here its how i make the menu item. im not sure i explained well enough. but please take a look into my files. Thanks. test_dynamic_ui.hdanc test_hda.hipnc
  15. Hello, newbie here, I'm trying to check about Texel. Everything works fine, except in Unreal.. TexelDensity is correct in houdini, but it's different in "unreal". Is it supposed to be like this? And is this affect to UV scale? Becuase When i change AssetResolution in houdini, UV size exactly reduce 1/4 size. But in "unreal", UV size is weird. Change Project Resoultion in Houdini,and Unreal. Texel Density is Different. Change Asset Resolution in Houdini. Change Asset Resolution in Unreal. it's weird size..
  16. Tools for layout

    Custom importer for Quixel Megascans Bridge inside Houdini Sop. These videos shows an example of working with 3D Scans and Surfaces https://github.com/andrey214/aa_tools https://vimeo.com/638435887 https://vimeo.com/638435845
  17. Jerry's things

    Involute gears. There are probably easier ways to get gear models but hey. Spur and helix only because if I have to look at more math I only barely grasp I'll cry. I'll maybe come back for bevel/hypoid/planetary/worm some other time. I'm a hobbyist and this marks the first time I've shared anything with anyone so... my horn, toot, etc. Not blackboxed or anything if you want to have a gander. Peace. buildgear.hdalc
  18. HDA Module double evaluates

    i am using on Update script to test a function, it was working fine until it started double printing data. i replaced everything with just a print function and still the problem remains. is there a fix for this? i tried the same in a python sop and it only evaluates once as it should
  19. HDA based on another HDA

    Hi I want to create an HDA based in another HDA as started point, I want to have the same structure (node tree) and same parameters, but different HDA name of course. Thanks for your help
  20. how can i delete/create nodes in a locked hda from the python module? i am using a button with a callback script that runs a delete() function for n in node.children(): n.destroy(True) i get an error message that i don't have permissions because the asset is locked. Is there a way around this? callback_parm_kwargs_hda_node.hip
  21. Hi there, I have been making a HDA that contains a python script in the 'python module' section. The goal is to wire multiple mantra nodes into this single HDA and then correctly generate multiple setups inside the HDA that configure the rendering setup to be handled by our farm running Afanacy. The tool is working pretty nicely on its own, but once I put multiple nodes in the OUT network and generate a second one it also affects the other nodes. I thought this was because I had global variables in my python script, so I got rid of them and made a 'dataObject' class that is generated on the single nodes and passed down to all functions. however, this did not solve the issue. I figure it has something to do with scope but can't figure out what it is. I'll put the code down here below. Feel free to give any tips, I don't have much experience with Houdini python in particular. import hou import os import re from os import path alphabet = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'] class dataObject: renderasset = hou.Node base_ifd_generator = hou.Node base_distributed_renderer = hou.Node base_afanacy_merger = hou.Node master_merger = hou.Node mantra_duplicates = [] # List of all mantra nodes that will be compied from inputs. Ordered by input index ifd_generators = [] # List of all Afanacy nodes that are configured as IFD generators distributed_renderers = [] # List of all afanacy nodes that are configured as renderers afanacy_mergers = [] # List of all afanacy nodes that are only used for merging the different stages. def reset(data): for mantra in data.mantra_duplicates: mantra.destroy() for ifd in data.ifd_generators: ifd.destroy() for renderer in data.distributed_renderers: renderer.destroy() for merger in data.afanacy_mergers: merger.destroy() del data.mantra_duplicates[:] del data.ifd_generators[:] del data.distributed_renderers[:] del data.afanacy_mergers[:] def getOptions(data): autoversioning = data.renderasset.parm('autoversion').eval() print("automatic versioning set to; " + str(autoversioning)) def generate(thisnode): data = dataObject() data.renderasset = hou.node(thisnode.path()) print(data.renderasset.name()) data.base_ifd_generator = hou.node(thisnode.path()).glob("ifd_generator_SETUP") data.base_distributed_renderer = hou.node(thisnode.path()).glob("distributed_renderer_SETUP") data.base_afanacy_merger = hou.node(thisnode.path()).glob("afanasy_merge_SETUP") data.master_merger = hou.node(thisnode.path()).glob("*MASTER_MERGE*") reset(data) getOptions(data) configureRenderers(data) print("Internal network for node '" + data.renderasset.name() + "' has been generated.") def submit(): getOptions() size = len(data.mantra_duplicates) if size < 1: print("WARNING: render asset should first generate an internal network before submitting.") else: checkVersions() data.master_merger[0].parm('submit').pressButton() def configureRenderers(data): data.master_merger[0].setParms({ "job_name" : data.renderasset.parm('jobname').eval() }) inputs = data.renderasset.inputs() print("name: " + str(data.renderasset.name())) for idx,value in enumerate(inputs): configureRenderSetup(data,idx, value) connectRenderSetup(data,idx) setIfdSettings(data,idx) setRendererSettings(data,idx) setMergerSettings(data,idx) layoutNetwork(data,idx) connectMasterRenderer(data) data.renderasset.layoutChildren() def computeVersion(outputPath, patternName): if path.exists(outputPath): ifd_directories = os.listdir(outputPath) pattern = re.compile(patternName) version = 0 for dir in ifd_directories: if pattern.search(dir): version += 1 return alphabet[version] def checkVersions(data): for idx, mantra in enumerate(data.mantra_duplicates): render_version = computeVersion(data.renderasset.parm('renderroot').eval(), data.renderasset.inputs()[idx].name()) ifd_version = render_version ifd_destination = data.renderasset.parm('ifdroot').eval() + "/" + "ifd_" + data.renderasset.inputs()[idx].name() + "_" + ifd_version + "/" + data.renderasset.inputs()[idx].name() + "_ifd.$F4.ifd" img_destination = data.renderasset.parm('renderroot').eval() + data.renderasset.inputs()[idx].name() + "_" + render_version + "/" + data.renderasset.inputs()[idx].name() + ".$F4.exr" mantra.setParms( { "soho_diskfile" : ifd_destination, "vm_picture" : img_destination }) def configureRenderSetup(data,inputIndex, node): data.mantra_duplicates.append(node.copyTo(data.renderasset)) data.mantra_duplicates[inputIndex].setName("MantraInput_" + str(inputIndex)) render_version = "_" + str(computeVersion(data.renderasset.parm('renderroot').eval(), data.renderasset.inputs()[inputIndex].name())) ifd_version = render_version ifd_destination = data.renderasset.parm('ifdroot').eval() + "/" + "ifd_" + data.renderasset.inputs()[inputIndex].name() + "/" + data.renderasset.inputs()[inputIndex].name() + "_ifd.$F4.ifd" img_destination = data.renderasset.parm('renderroot').eval() + data.renderasset.inputs()[inputIndex].name() + "/" + data.renderasset.inputs()[inputIndex].name() + ".$F4.exr" if bool(data.renderasset.parm('autoversion').eval()): print("autoversioning") ifd_destination = data.renderasset.parm('ifdroot').eval() + "/" + "ifd_" + data.renderasset.inputs()[inputIndex].name() + ifd_version + "/" + data.renderasset.inputs()[inputIndex].name() + "_ifd.$F4.ifd" img_destination = data.renderasset.parm('renderroot').eval() + data.renderasset.inputs()[inputIndex].name() + render_version + "/" + data.renderasset.inputs()[inputIndex].name() + ".$F4.exr" data.mantra_duplicates[inputIndex].setParms( { "soho_outputmode":1, "soho_diskfile" : ifd_destination, "vm_inlinestorage" : 1, "vm_writecheckpoint" : 0, "vm_picture" : img_destination }) data.ifd_generators.append(data.base_ifd_generator[0].copyTo(data.renderasset)) data.distributed_renderers.append(data.base_distributed_renderer[0].copyTo(data.renderasset)) data.afanacy_mergers.append(data.base_afanacy_merger[0].copyTo(data.renderasset)) def connectRenderSetup(data, inputIndex): data.ifd_generators[inputIndex].setInput(0,data.mantra_duplicates[inputIndex]) data.afanacy_mergers[inputIndex].setInput(0,data.ifd_generators[inputIndex]) data.afanacy_mergers[inputIndex].setInput(1,data.distributed_renderers[inputIndex]) def setIfdSettings(data, inputIndex): data.ifd_generators[inputIndex].setParms( { "f1" : data.mantra_duplicates[inputIndex].parm('f1'), "f2" : data.mantra_duplicates[inputIndex].parm('f2'), "enable_extended_parameters" : 1, "hosts_mask" : data.renderasset.parm('ifdhosts').eval(), "priority" : data.renderasset.parm('priority').eval() }) def setRendererSettings(data, inputIndex): data.distributed_renderers[inputIndex].setParms( { "f1" : data.mantra_duplicates[inputIndex].parm('f1'), "f2" : data.mantra_duplicates[inputIndex].parm('f2'), "cmd_files" : data.mantra_duplicates[inputIndex].parm('soho_diskfile'), "enable_extended_parameters" : 1, "hosts_mask" : data.renderasset.parm('renderhostmask').eval(), "priority" : data.renderasset.parm('priority').eval() }) def setMergerSettings(data, inputIndex): data.afanacy_mergers[inputIndex].setParms( { "f1" : data.mantra_duplicates[inputIndex].parm('f1'), "f2" : data.mantra_duplicates[inputIndex].parm('f2'), "enable_extended_parameters" : 1, "hosts_mask" : data.renderasset.parm('renderhostmask').eval(), "priority" : data.renderasset.parm('priority').eval(), "job_name" : data.renderasset.inputs()[inputIndex].name() + "_afanacy_renderer" }) def layoutNetwork(data, inputIndex): data.mantra_duplicates[inputIndex].moveToGoodPosition() data.renderasset.layoutChildren() def connectMasterRenderer(data): for i,v in enumerate(data.afanacy_mergers): print("i: " + str(i)) print("v: " + str(v.name())) print("mm: " + str(data.master_merger[0].name())) data.master_merger[0].setInput(i,v)
  22. Hello, I wrote a little python snippet which load a preset of an HDA when conditions are met. The only thing I haven't succeed is to get the HDA path without writing it exactly (if I copy paste the HDA the path need to change automatically or if I change the name of the HDA). My python node is inside the HDA so maybe there's an expression for something like this. Thank you ! EDIT : a very simple work around is just to use the opfullpath in vex and read the path back in Python.
  23. i would like to have a button to trigger a cook from my HDA. How can i go about that? Do i need a python script?
  24. Blue Text Under Node

    Hey friends quick question for you. I've searched far and wide without any success - I'm trying to add the blue text under a sop, like the mantra node has: How on earth does one go about this? It's driving me up a wall over here. Thanks fellas, mavencolby
  25. Hi! I'm using object merge (objpath) to have a default mesh in UE4 (HE2.0) and that works fine. But I'm wondering if it's possible to read UE4 datatable or a json file to fill a list of object to use with a random. And also being able to change the mesh used by select the "index" of the mesh in the list. cheers
×