Welcome to od|forum

Register now to gain access to all of our features. Once registered and logged in, you will be able to contribute to this site by submitting your own content or replying to existing content. You'll be able to customize your profile, receive reputation points as a reward for submitting content, while also communicating with other members via your own private inbox, plus much more! This message will be removed once you have signed in.


  • Content count

  • Joined

  • Last visited

Community Reputation

1 Neutral

About Shalinar

  • Rank

Personal Information

  • Name Chris Burgess
  • Location Los Angeles
  1. Yeah sorry I should have mentioned this is an H15.5 job.. I'll look into the conserve vop, thanks
  2. Hi everyone, I've noticed an issue shining a light through a refractive material. The refractions don't seem to be energy conserving. Using a point light with intensity 1, exposure 0, no attenuation, shining through a grid with a basic mantra surface material with refractions enabled, the brightness values of the resulting pixels in the render are extremely high. Some are as high as 4,000. Why is this? In this thread, Symek mentions that the BSDF model is not inherently energy conserving, so it would have to be applied post-process. Seems odd that this wouldn't already be done in SideFX's shaders... If that's the case, though, how can I make refractions in the mantra surface shader energy conserving? Thanks, Chris EDIT: Forgot to upload sample scene, here it is light_refraction_broken.hip
  3. Thanks for getting back to me Try/except is exactly what I ended up doing
  4. Has anyone else encountered an issue with an hda python module where the OnInputChanged evaluates twice? I'm not sure what's causing it... Even simple code in the module triggers it -- eg: node = kwargs['node'] print node ^ I get two printouts of the node each time i change the input connection. I originally noticed this when I was trying to query the connected input. When I did node = kwargs['node'] input = node.inputs()[0] print input I would get an error saying the index was out of the tuple range, followed by a correct printout of the first input connection. The first eval seems to trigger before the connection is actually made, hence why it errors the first time through. Then the second eval triggers once it's connected. This is bizarre, and I haven't yet figured out what's causing it. Surely this isn't standard behavior. Anyone else seen this or have ideas as to what's causing it? Thanks, Chris
  5. I forgot all about just doing it through the OS permissions, got my head too deep in HOM Thanks Graham!
  6. Hello, I'm creating a digital asset publication system, and I want to be able to prevent artists from changing the asset's parameters outside of the system. So basically, I want my assets to be just like SideFX's digital assets, in the sense that you can't modify the Type Properties, you can only add spare parameters. But then when they use my "Modify" button, the Type Properties dialog unlocks and they can edit the base definition. Then "publishing" the asset re-locks the Type Properties. How can this be achieved? I immediately went to hou.hda.setSafeguardHDAs(), but that makes it so NO asset can be modified; I just want our custom assets to be modified through the new system. Chris
  7. Thank you, this worked perfectly. Time to go explore the *toolutils modules etc...!
  8. Thanks F1! Experimenting with that now. I always wondered how the Tools tab was used. The documentation is pretty basic and doesn't address a lot of the advanced options for power users. Do you have a reference for this tab? My google-fu is weak here, since searching for the "tools" tab doesn't help much considering a lot of people use "tool" interchangeably with "node/asset/hda/otl".
  9. I believe in the File Merge node, you should change your Merge Variable to be WEDGENUM to keep the naming consistent, then you can merge based on your WEDGENUM in your filepath. The File Merge is going to try to replace every instance of your Merge Variable with the values in the Merge Range (start to end by increment). So your starting value should be your lowest seed value and the end value should be your highest seed value (not 1 and 1 as yours are now ). Then just make sure to set Missing Files to No Geometry so it doesnt error out for inevitable missing files in the range from start value to end value. I just tested this with a simple scene: had a cube, sphere, and pyramid written out with a switch controlled by $CLUSTER variable (0=cube, 1=sphere, 2=pyramid). Then I used the File Merge node with Merge Variable set to CLUSTER and read them in with the same variable, setting the Merge Range to (0, 2, 1), and Missing Files to No Geometry -- that way, when I deleted the file where $CLUSTER=1, files 0 and 2 still imported just fine So you can see here I just have the cube and pyramid being read in without error. You'll definitely need the same for your particles
  10. Hi everyone, I'm trying to have my Python Module in my HDA place another node right below my asset on creation. So my OnCreation script runs my python module from disk, which has the following code: pos = first_node.position() second_pos = (pos[0], pos[1] - 2) second_node.setPosition(second_pos) This does nothing. The second node is always created near (0, 0) in the network editor. But if i run those lines in the Python shell in Houdini, it works just fine. So that tells me that the OnCreated scripts don't wait for the HDA to actually be placed into the scene before running, despite what the docs say (a problem I've run into before). My solution to this was to use hdefereval to wait to run the code until the event loop was idle. This shows promises of working, but I'm running into issues now. The code I'm trying is: pos = first_node.position() second_pos = (pos[0], pos[1] - 2) hdefereval.executeDeferred("second_node.setPosition(second_pos)") but the problem here is that when it goes to execute the code, the variables no longer exist, and the code fails because "Name 'second_node' is not defined". But I use a custom 123.py script every day that has the exact line hdefereval.executeDeferred("hou.hscript(code)") where "code" is a pre-defined variable, and hdefereval has no problem using that variable when it goes to execute. So I'm not really sure what the problem is here. What is the best way to move a node using Python? (and if you know how to get my hdefereval call to work, that'd be even better!) Thanks, ~Chris
  11. Sorry yeah updated my post above
  12. Okay so after doing some testing, it seems that the problem is created when the Voronoi Fracture creates edges where the incoming geometry does not have planar faces. So basically, if you just append a Divide SOP before doing anything else, you're good to go. The issue you had with the pig's head was just that your Divide SOP was only going into the Voronoi Fracture node rather than also feeding into the Iso Offset SOP. voronoi_issue_fix.hip
  13. Bump. Wedge ROP is not good enough for what I need. I'm building out a whole custom ROP loop node set, like the For Loop in SOPs. But every way I try to get a parm to re-execute a button's callback script, I get the "Recursion in parm callback" error. Which is annoying, because I know there's a recursion in the parm callback. That's exactly what I want lol. Is there any way around this? EDIT: I suppose one way would be the Shell ROP, but I'd rather do it all through Python than having extra nodes laying around in my ROP loop. Thanks, ~Chris
  14. Or if you're like me and you're local-variable-phobic, you can just type in the attribute as a VEXpression into the Wire Radius field. Eg; "@Cd.r"
  15. Hello, My next project is to create a custom "For Loop" in ROPs, and I'd like to be able to get that familiar colored "blob" around my loop nodes, just like the For Loop nodes in SOPs. But I haven't been able to find how that blob is actually being created. The docs refer to it as a "blob" that can be toggled using the "convex hulls" display option. However, my searches through the HOM haven't turned up anything related to this. My next step was to find the creation scripts for the For Loop SOP and see how it's being done there. But the creation scripts are either compiled, or I'm looking in the wrong place because I can't seem to find them. Does anyone know how to create that blob around my own nodes? It's very visually helpful. Thanks, ~Chris